假设我们需要实现一个简单的字节码解释器,我们应该选择什么方法来实现这个任务?
数据结构 堆栈提供了实现简单字节码机的能力。堆栈机的特性和实现在西方和国内互联网上有很多文章介绍,我只提一下Java虚拟机是堆栈机的一个例子。
机器的操作原理很简单,将包含数据和操作码(操作码)的程序提供给输入,并使用堆栈操作来实现必要的操作。让我们看一下我的堆栈机中的字节码程序示例:
пMVkcatS olleHП
На выходе мы получим строку “Hello StackVM”.堆栈机从左到右读取程序,当操作码出现在符号“–”中时,将数据逐个字符加载到堆栈中。使用堆栈实现命令。
在nodejs中实现堆栈机的示例:
逆波兰表示法 (RPN)
堆栈机也很容易用来实现计算器,为此它们使用逆波兰表示法(后缀表示法)。
常规中缀表示法的示例:
2*2+3*4
转换为 RPN:
22*34*+
为了计算后缀记录,我们使用堆栈机:
2–到堆栈顶部(堆栈:2)
2–到堆栈顶部(堆栈:2,2)
*–两次获取栈顶,相乘,送入栈顶(栈:4)
3–到堆栈顶部(堆栈:4, 3)
4–到堆栈顶部(堆栈:4,3,4)
*–两次获取栈顶,将结果相乘,送入栈顶(栈:4, 12)
+–两次获取栈顶,将结果相加,发送到栈顶(stack: 16)
如您所见–操作16的结果保留在堆栈上,可以通过实现堆栈打印操作码来打印它,例如:
p22*34*+P
P–堆栈打印开始操作码,p –用于完成堆栈打印并发送最后一行进行渲染的操作码。
为了将算术运算从中缀转换为后缀,使用了 Edsger Dijkstra 的称为“排序码”的算法。上面可以看到一个实现示例,或者在下面的nodejs机器堆栈项目的存储库中可以看到。
来源
https:// /tech.badoo.com/ru/article/579/interpretatory-bajt-kodov-svoimi-rukami/
https://ru.wikipedia.org/wiki/Обратная_польская_запись
源代码
https://gitlab.com/demensdeum/stackvm/< /p>