Struct 如何在基于字节码和堆栈的虚拟机中处理结构变量?

Struct 如何在基于字节码和堆栈的虚拟机中处理结构变量?,struct,bytecode,vm-implementation,Struct,Bytecode,Vm Implementation,我正在编写一个编译器,它编译一种与C到字节码具有类似概念的语言,然后由相应的基于堆栈的VM来解释。当涉及到如何编译结构时,我陷入了困境 struct my_struct_s { int anInt; char* aString; } my_struct_t; /* ... */ my_struct_t my_struct_var; 我应该将my_struct_var放在字节码中的最佳位置?C编译器如何处理这些东西?稍后,VM还必须处理表示此结构变量所需的内存,因为它应该是

我正在编写一个编译器,它编译一种与C到字节码具有类似概念的语言,然后由相应的基于堆栈的VM来解释。当涉及到如何编译结构时,我陷入了困境

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

/* ... */
my_struct_t my_struct_var;
我应该将my_struct_var放在字节码中的最佳位置?C编译器如何处理这些东西?稍后,VM还必须处理表示此结构变量所需的内存,因为它应该是可写可重读的

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

谢谢,
Jonas

在将C编译成更高级的语言时,最难的部分是处理指针

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

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


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

我认为结构是一个用胶带粘在一起的变量集合。如果struct
foo
具有字段
x
y
,那么声明
foo
类型的变量、字段或参数基本上应该声明名为
foo\uuuuuuuux
foo\uuuuuuuuuy
的变量、字段或参数。唯一会让事情变得棘手的地方是使用数组或ByRef。如果希望处理这些问题,必须能够创建任意大小的数组元素,访问带有位移的数组元素和ByRef。处理这些问题需要使数组的元素具有任意大小的能力,并且需要在解引用数组元素或byref时应用置换的能力。此外,如果代码将byref带到结构中,则必须确保其存储位置始终以相同的方式排列;这很可能意味着,如果某些参数作为寄存器传递,那么结构必须始终完全作为寄存器传递,或者完全在堆栈上传递。如果一个值参数在一个或多个寄存器中传递给后来作为byref传递的代码,则必须将该值复制到堆栈上;无论参数是结构还是基元,这都是必需的