【小项目】Java实现带编译器和解释器的计算器

介绍

本项目通过Java写的语法树和虚拟机对variable实现简单的计算器操作,实现的功能如下图所示

StateDiagramOfAssignCalculator

编译器和解释器

计算机语言可以有两种执行方式:

  1. 先编译成机器码,再执行。
  2. 边解释边执行。

我们常见的C和C++是通过先编译再执行,而 python可以边解释边执行。Java语言比较特殊,会对热点代码进行编译,编译和解释混用。

编译器和解释器区别如下:

  1. 解释器可以运行同时翻译程序。编译器先扫描整个程序然后将程序翻译成机器码。
  2. 解释器可以用较少的时间分析程序,但是运行时间比编译器长。编译器需要较长的时间去分析程序,但是可以以较快的速度运行。
  3. 解释器不会生成临时的对象码,所以可以更好利用内存。编译器需要生成临时的文件去获取机器码关联,所以需要更多的内存。

语法树

要了解程序语言运行的先后顺序,语法树是必要的。比如当计算器遇到“+”时,就生成了以“+”为根结点的二叉树,左右节点分别是数字;又比如当计算器遇到“;”的时候,就生成了以“;”为根结点的语法树,左边为上一个表达式,右边为下一个表达式。

比如我们想计算如下算式:

1
2
3
x := -2;
x := -2*x;
x := -2*x;

我们得到了如下所示的语法树:
ObjectDiagramOfAssignCalculator

虚拟机

虚拟机通过读取语法树里的节点,进而对节点进行处理,从而输出结果,本项目中的虚拟机通过Map和Stack实现数字的加减乘除。

项目地址:点此进入


【小项目】Java实现带编译器和解释器的计算器
http://liuminxuan.github.io/2021/01/28/【小项目】Java实现编译器和解释器/
发布于
2021年1月28日
许可协议