0

我正在编写一个编译器,它将一种与 C 具有相似概念的语言编译为字节码,然后应该由相应的基于堆栈的 VM 解释。我被困在如何编译结构的那一刻,例如

struct my_struct_s {
   int    anInt;
   char*  aString;
} my_struct_t;

/* ... */
my_struct_t my_struct_var;

我最好将 my_struct_var 放在字节码中的哪个位置?C 编译器如何处理这些东西?稍后,VM 还必须处理表示这个 struct var 所需的内存,因为它应该是可写和可重用的。

你会把这种变量放在哪里?进栈?只是把这个var的内存地址放到栈上?

谢谢,乔纳斯

4

2 回答 2

0

我认为结构是用胶带粘在一起的变量的集合。如果 structfoo具有字段xand y,则声明类型的变量、字段或参数foo本质上应该声明调用foo___xand的变量、字段或参数foo___y. 唯一会变得棘手的地方是数组或 byrefs。如果希望处理这些,则必须能够创建任意大小的数组元素,访问数组元素和具有位移的 byref。处理这些将需要能够使数组的元素具有任意大小,并且需要能够在取消引用数组元素或 byref 时应用位移。此外,如果代码对结构使用了 byref,则必须确保其存储位置始终以相同的方式排列;这很可能意味着如果某些参数作为寄存器传递,则结构必须始终完全作为寄存器传递或完全在堆栈上传递。如果一个值参数在一个或多个寄存器中传递给稍后作为 byref 传递的代码,则该值必须复制到堆栈中;

于 2013-05-10T16:38:35.497 回答
0

将 C 编译为高级语言时,最困难的部分是处理指针。

如果你不关心这一点,事情就会容易得多。我只需将结构编译为具有给定字段的类。只要您“正常”使用结构,即显式获取和设置字段,这将起作用。您无需担心分配内存或放置地址的位置,JVM 会自动处理所有这些。

如果您将指针指向该字段的成员,则问题会大得多。我能想到的两种方法是将内存表示为一个巨大的字节数组并在运行时手动解释值(非常慢)或用代码替换指针以获取或设置适当的字段(希望不会太慢,特别是因为 invokedynamic 让你做相似的东西)。

编辑:我假设您的目标是上面的 JVM。CIL 更好,因为它具有显式结构变量并支持不安全的内存访问。

于 2013-05-10T13:00:15.903 回答