gpt4 book ai didi

java - JVM 上的编译时按引用参数

转载 作者:行者123 更新时间:2023-12-01 07:23:46 25 4
gpt4 key购买 nike

目前正在 JVM 上开发自定义编程语言,我希望该语言支持方法中的按引用参数。我该怎么做呢?到目前为止,我想出了三种不同的方法来实现这一目标。

  1. 包装对象

这背后的想法是创建一个包装对象,该对象在创建时包含字段的当前值,传递给 by-ref 方法调用,然后在调用后拆箱。这是一种相当直接的方法,但需要创建大量“垃圾”对象并立即丢弃。

  • 数组
  • 只需创建一个具有 1 个元素的类型的数组,将字段值放入数组中,调用传递数组的方法,最后从数组中分配字段。这样做的好处是它可以确保运行时类型安全,而不是需要额外强制转换的通用包装类。

  • 不安全
  • 这个稍微高级一些:使用sun.misc.Unsafe分配一些 native 内存空间,将字段值存储在该内存上,调用方法并传递地址,重新分配字段从 native 内存地址,并再次释放它。

    奖励:是否可以使用 Unsafe 类实现指针和指针算术?

    最佳答案

    Wrapper Objects [...] but requires a lot of 'garbage' objects that are created and immediately discarded.

    如果这样的包装器的生命周期仅限于调用点(+内联被调用者),那么编译器可能能够通过转义分析来证明这一点,并通过将包装器对象分解为其原始成员并直接在中使用它们来避免分配生成的代码。

    这本质上要求这些引用包装器永远不会存储到字段中,而仅作为方法参数传递

    Unsafe Use sun.misc.Unsafe to allocate some native memory space, store the field value on that memory

    您无法将对象引用存储在 native 内存中。垃圾收集器不会知道这一点,因此可能会更改您脚下的内存地址或 GC 对象(如果这是您唯一的引用)。

    但是由于您正在创建自己的语言,因此您可以简单地将字段引用脱糖为对象引用+偏移量。 IE。传递两个参数(对象引用 + 长偏移量)而不是一个。如果您知道偏移量,则可以使用 Unsafe 来操作该字段。

    显然这仅适用于对象字段。无法通过这种方式更改本地引用。

    Bonus: Is it possible to implement pointers and pointer arithmetic using the Unsafe class?

    对于非托管内存是的。

    对于托管堆中的内存,您只能指向对象本身并进行相对于对象头的指针算术。
    并且您始终必须将对象引用存储在Object 类型的字段中。将它们存储在long中会导致GC实现(至少是精确的)丢失引用。

    <小时/>

    编辑:您可能还对 JDK 中正在进行的有关 VarHandles 的工作感兴趣。在开发语言时,您可能需要牢记这一点。

    关于java - JVM 上的编译时按引用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29568105/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com