首页 编程 软件学院 查看内容

一起来写个简单的解释器(1)

2015-7-13 11:06 |来自: http://blog.jobbole.com/ 2298 0

摘要: 谷歌大牛 Steve Yegge 曾说过:“如果你不知道编译器是怎样工作的,那你也并不知道计算机是怎样工作的。如果你不是 100% 确定你是否知道编译器是怎样工作的,那你其实并不知道它们是怎样工作的。”这跟你是新手还是 ...
关键词: 解释器 编译器 一个 语言 工作 如果 源程序 系列 Pascal factorial

谷歌大牛 Steve Yegge 曾说过:“如果你不知道编译器是怎样工作的,那你也并不知道计算机是怎样工作的。如果你不是 100% 确定你是否知道编译器是怎样工作的,那你其实并不知道它们是怎样工作的。”

这跟你是新手还是经验丰富的软件开发人员无关:如果你不知道编译器和解释器是怎样工作的,那么你就不知道计算机是怎样工作的。就这么简单。

那么,你知道编译器和解释器是怎样工作的吗?我的意思是,你 100% 确定自己知道它们是怎样工作的吗?如果你不知道。

或者说如果你不知道,并且因此而感到不安。

别着急。如果你留下来学习完整个系列,并且和我一起构造一个解释器和编译器,你最终将会知道它们是怎样工作的。并且你将会变成一个自信快乐的人,至少我希望是这样。

为什么要学习解释器和编译器?有三个理由:

1、为了写一个解释器或者一个编译器,你必须综合应用一些技能。编写一个解释器或者编译器,将会帮助你提高这些技能,让你变成一个更优秀的软件开发者。同时这些技术在编写其它软件(非编译器和解释器)时同样很有用。

2.你确实想知道计算机是怎样工作的。常常解释器和编译器看起来像魔术。而你对这种魔术觉得不太舒服。你想弄清楚构造一个解释器和编译器的过程,弄明白它们是怎样工作的,弄明白这里面所有的事。

3.你想创建你自己的语言或者是特定领域的语言。如果你创建了它,那么你同样需要为它创建一个编译器或解释器。最近,人们重新兴起了对新语言的兴趣。你几乎每天都能看新语言的出现:Elixir、Go、Rust,只是随便举几个例子。

 

好了,那什么是解释器,什么是编译器呢?

解释器和编译器的目标就是将使用高级语言编写的源程序转换成另一种形式。什么形式?稍安勿燥,在本系列的后续部分中,你将会很确切地了解到源程序将被转换成什么。

现在你可能会对解释器和编译器之间有什么区别感到好奇。对于本系列,我们约定,如果一个翻译器将源程序翻译成机器语言,那么它就是一个编译器。如果一个翻译器直接处理并运行源程序,不先把源程序翻译成机器语言,那么它就是一个解释器。直观上它看起来会是这个样子:

我希望此时此刻,你很确信你的愿意学习,并且构建一个解释器和编译器。关于这个解释器系列,你有什么期待呢?

你看这样行不行。我们为 Pascal 语言的一个大子集创建一个简单的解释器。在这个系列的最后,你将得到一个能够工作的解释器以及像 Python 的 pdb 一样的源代码级别的调试器。

那么问题来了,为什么选 Pascal?首先,这不是我为了这个系列捏造的语言:这是一个真实的编程语言,具有许多重要的语言结构。其次,有些计算机书籍虽然旧,但实用,这些书的例子用了 Pascal 语言。(我承认这不是一个选择它来构造解释器的不可抗拒的理由,但我认为这也是一个很好的学习非主流语言的机会:)

这是有一个使用 Pascal 编写的阶乘的例子。你将可以用自己的解释器和调试器来解释和调试这段代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
program factorial;
 
function factorial(n: integer): longint;
begin
if n = 0 then
factorial := 1
else
factorial := n * factorial(n - 1);
end;
 
var
n: integer;
 
begin
for n := 0 to 16 do
writeln(n, '! = ', factorial(n));
end.

我们使用 Python 来实现 Pascal 的解释器,但是你也可以使用其它任何语言来实现它,思想的表达不应局限于任何特定的语言。

 

好了,让我们开始行动吧。预备,开始!

你将通过编写一个四则运算表达式的解释器(俗称计算器),来完成对解释器和编译器的第一次进军。今天的目标很简单:让计算器能够处理个位整数的加法,比如 3 + 5。下面是你的计算器的代码,对不起,是你的解释器的代码。

1
2
3
4
5
6
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论