实现基于堆栈的解释器

时间:2014-02-20 20:04:44

标签: interpreter

我有兴趣使用基于堆栈的解释器来解释动态语言。我理解字节码和堆栈是如何工作的,但我正在努力实现诸如执行帧和对象之类的东西。

我知道(如果我错了,请纠正我)执行框架

  • 堆栈指针
  • 程序计数器
  • 本地变量表
  • 等。

并且对象将具有

的内容
  • type / super(在Ruby中相当于“klass”)
  • 变量表
  • 方法表
  • 等。

但我需要帮助实现这一点。

谢谢, 丹尼尔

1 个答案:

答案 0 :(得分:0)

对于您的第一个实验,我建议将您的堆栈实现为链接列表。每个列表条目(" frame")表示函数调用,因此它需要;

  • 对来电者框架的引用,
  • 对函数本身的引用,
  • 该功能内的程序计数器,
  • 函数变量表。

如果在调用之前知道每个函数的所有变量,则每个变量可以分配一个槽,因此该函数的每次调用都会分配一个相同大小的帧,但不同函数的帧大小会有所不同

这个计划被称为" spaghetti stack"。如果要支持continuation,则需要对帧进行垃圾收集,而不是在函数调用返回时取消分配它们。虽然意大利面堆不是超高性能的途径,但它非常灵活,可能适合你。

对于你的对象," super"是指向klass对象的指针,方法表位于klass对象中。在非klass对象上不需要方法;处理Ruby调用" singleton"方法,你只为那个实例分配一个单独的klass对象,其super是原始声明的类。 Ruby使用klass对象上的标志来指示哪些是单例类,这些是通过" extend"添加的模块,以及哪些是原始声明的类。