让我们说我要设计一个JIT解释器,它在运行时将IL或字节码转换为可执行指令。每次在代码中遇到变量名时,JIT解释器必须将其转换为相应的内存地址,对吗?
JIT解释器使用什么技术来以足够的方式解析变量引用?他们是否使用哈希,是否提前编译到地址的变量,还是我完全错过了什么?
答案 0 :(得分:2)
这个问题有很多种可能的答案,就像一般设计JIT的答案有很多种。
但举一个例子,考虑一下JVM。除了调试/反射元数据之外,Java字节码实际上根本不包含变量名。相反,编译器为每个变量分配一个" index"从0到65535,字节码指令使用该索引。但是,如果需要,VM可以自由地进行进一步优化。例如,它可以将所有内容转换为SSA形式,然后将其编译为机器代码,在这种情况下,变量最终将转换为堆栈帧中的机器寄存器或固定偏移量,或完全优化掉。
考虑另一个例子:CPython。 Python实际上在运行时维护变量名称,因为它具有高级,灵活的特性。但是,间隔器仍然执行一些优化。例如,具有__slots__
属性的类将为字段分配固定大小的数组,并使用名称 - >用于动态查找的索引哈希映射。我不熟悉实现,但我认为它与局部变量类似。请注意,正常的局部变量访问(不使用反射)可以在" compile"中转换为固定的偏移量。时间。
总之,答案
他们是否使用散列,是否提前编译到地址的变量,或者我是否完全错过了某些内容?
是的。