c++ 解释器模式_动态编译与解释器模式_解释器模式用处

电脑杂谈  发布时间:2017-02-23 10:43:18  来源:网络整理

博客|刀背藏身

先来看看这篇文章 怎样写一个解释器

所谓虚拟机器,就是一定意义上的堆栈机。

解释器能够执行其他计算机语言编写的程序的系统软件,他是一个翻译程序。它的执行方式是一边翻译一边执行,因此其执行效率一般比较低。解释器的实现比较简单,而且编写源程序的高级语言可以使用更加灵活和富于表现力的语法。

可参考本链接,开源项目Crianza。

当然,解释器要从最基础的最简单的语言开始,然后逐步增加语言的复杂度,才能构造出正确的解释器。而最基础的一个解释器,其实就是一个高级的计算器,下面我们一起来创建一个解释器吧。

前边解释了一些,但解释的并不清楚,在怎样写一个解释器中,做一个比较不错的解释。

首先我们来谈一下解释器是什么。说白了解释器跟计算器差不多。它们都接受一个“表达式”,输出一个 “结果”。比如,得到 '(+ 1 2) 之后就输出 3。不过解释器的表达式要比计算器的表达式复杂一些。解释器接受的表达式叫做“程序”,而不只是简单的算术表达式。从本质上讲,每个程序都是一台机器的“描述”,而解释器就是在“模拟”这台机器的运转,也就是在进行“计算”。所以从某种意义上讲,解释器就是计算的本质。当然,不同的解释器就会带来不同的计算。

需要注意的是,我们的解释器接受的参数是一个表达式的“数据结构”,而不是一个字符串。这里我们用一种叫“S-expression”的数据结构来表示表达式。比如表达式 '(+ 1 2) 里面的内容是三个符号:'+, '1 和 '2,而不是字符串“(+ 1 2)”。从结构化的数据里面提取信息很方便,而从字符串里提取信息很麻烦,而且容易出错。

从广义上讲,解释器是一个通用的概念。计算器实际上是解释器的一种形式,只不过它处理的语言比程序的解释器简单很多。也许你会发现,CPU 和人脑,从本质上来讲也是解释器,因为解释器的本质实际上是“任何用于处理语言的机器”。

在《编程珠玑》的第十章,提到代码空间技术,如何节省足够的空间,讲到了解释程序。他说,远古时代,有时候空间的瓶颈不在于数据,而在于程序本身的规模。比如一开始一个图形程序,有如下代码:

for i = [17, 43] set(i, 68)
for i = [18, 42] set(i, 69)
for j = [81, 91] set(30, j)
for j = [82, 92] set(31, j)

其中,set(i,j)表示点亮屏幕(i, j)处的像素,也就是说这实际上是一个绘制直线的程序。而当我们使用了适当的函数,比如用于绘制水平线的hor函数和垂直线的ver函数,就可以替代上述代码:

hor(17, 43, 68)
hor(18, 42, 69)
ver(81, 91, 30)
ver(82, 92, 31)

而上述代码又可以利用一个解释器来替换,这个解释程序可以从下面的数组中读取命令。

h 17, 43, 68
h 18, 42, 69
v 81, 91, 30
v 82, 92, 31

至此,我们已经将空间减小了很多了,但如果你还想减少,那么就可以为命令h 或 v分配两个位,为后边的三个数字,每个数字,分配10个位置,这样一个32位的数字,表示一行命令了。c++ 解释器模式这就是代码空间技术的运用。

当然,今天我们谈起节省空间,好像已经成了笑话,但是,当我们面对巨量数据,也就是我们今天所说的大数据的时候,空间,时间,效率的话题又一次被提起来。当我们面对着像混乱电流一样的数据时,尝试将自己的头脑想象成计算机,学会用更加底层的方式去思考,对对理解数据处理将有更深刻的认识。

为什么我们时常提起像机器一样思考呢?那是因为机器远比我们人类严谨,也是所有检验逻辑最严格的关卡,他不容许一点点错误,一个毫不起眼的bug,都会让程序完全崩溃。而程序是写给计算机的语言,所以,程序的严谨性就应当像计算机一样严谨。所以我们时常劝告自己要像计算机一样思考。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-34020-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 张楠
      张楠

      一个让人随便入侵领海领空的国家还谈什么强国

    热点图片
    拼命载入中...