基于堆栈的虚拟机中的函数

时间:2014-04-06 10:22:12

标签: programming-languages stack virtual-machine

我正在为编程语言创建基于堆栈的虚拟机。到目前为止事情进展顺利,我有这些操作。

  1. EOP - 计划结束
  2. EOI - 指令终止
  3. PUSH - 推入堆栈
  4. POP - 弹出堆栈
  5. 打印 - 打印堆栈顶部
  6. ADD - 将最上面的数字添加到正下方的数字
  7. MUL - Multiply
  8. SUB - 减去
  9. 但我的问题是,我需要添加什么样的指令来使用条件,循环和函数等东西?

2 个答案:

答案 0 :(得分:1)

至少你需要一个有条件的GOTO。根据您的语言如何处理数据,该指令可能只是弹出堆栈中的最后一个元素,检查它是0还是1然后跳过固定数量的字节/指令,或者什么也不做(通常是跳转位置在指令本身中编码。)

但通常你也会添加一些测试指令或比较指令,这些指令或比较指令通常将最后两个元素从堆栈中弹出,以某种方式比较它们,然后在堆栈上按0或1来表示它们是否相等。通常,比较表达式等同于公共比较运算符,即<,>,< =,> =,=,!=。

你还需要一个无条件的GOTO,这通常是一个单独的指令,但也可以通过在你点击GOTO之前在堆栈上按1来实现。

BTW,我在博客文章中写了关于创建编译器和字节码解释器的详细信息:http://orangejuiceliberationfront.com/how-to-write-a-compiler/

答案 1 :(得分:0)

对于您需要的条件

  • 关系运算符(eq ne lt not etc)
  • 跳转真/假

对于循环,你有足够的,但FOR循环可能有自己的

  • FOR
  • NEXT

对于您需要的功能

  • CALL(堆栈上的args)
  • RETURN(堆栈上的值)

对于变量和数组:

  • LOAD
  • STORE
  • DIM阵列
  • LOAD和STORE的索引[]版本

对于表达式,大多数事情都是根据需要调用的库函数。要保持VM较小并将大部分代码放入库中,还有很多要说的。

您只需使用这些说明即可实现大多数非面向对象的语言。 OOPS需要更多。

JVM和CLR已有详细记录,因此请阅读他们的工作并考虑使用什么。还有很多其他虚拟机和很多想法。