我正在编写一个编译器,它编译一种语言,该语言具有与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的内存地址放入堆栈中即可?
谢谢, 纳斯
答案 0 :(得分:0)
在将C编译为更高级语言时,困难的部分是处理指针。
如果你不关心这一点,事情会容易得多。我只是将结构编译为具有给定字段的类。只要您正常使用结构,即显式获取和设置字段,这将起作用。您无需担心分配内存或放置地址的位置,JVM会自动处理所有内容。
如果您使用指向该字段成员的指针,则问题会更严重。我能想到的两种方法是将内存表示为一个巨大的字节数组,并在运行时手动解释值(非常慢)或用代码替换指针以获取或设置适当的字段(希望不要太慢,特别是因为invokedynamic允许你做类似的东西)。
编辑:我假设您的目标是上面的JVM。 CIL更好,因为它具有显式的结构变量并支持不安全的内存访问。
答案 1 :(得分:0)
我认为结构是与胶带粘在一起的变量集合。如果struct foo
包含字段x
和y
,则声明类型为foo
的变量,字段或参数应基本上声明名为{{1的变量,字段或参数}和foo___x
。事情变得棘手的唯一地方是数组或byrefs。如果希望处理这些,则必须能够创建任意大小的数组元素,访问数组元素和带位移的byrefs。处理这些将需要能够使数组的元素具有任意大小,并且需要能够在解除引用数组元素或byref时应用位移。此外,如果代码对结构采用byref,则必须确保其存储位置始终以相同的方式排列;最有可能的意思是,如果某些参数作为寄存器传递,结构必须始终完全作为寄存器传递或完全传递到堆栈上。如果在一个或多个寄存器中将值参数传递给稍后将其作为byref传递的代码,则必须将该值复制到堆栈中;无论参数是结构还是原语,都是必要的。