Compiler and Interpreter
两者的相似点是,它们都像一个翻译官,负责把程序员们写的高级语言翻译成电脑 CPU 可以读懂的机器语言。
A Story And Simile
假设你在宇宙闲逛的时候,飞船突然出了故障迫降在一个外星球上了,幸运的是,你知道怎么修复,不过,你不会用那个星球的工具。还好,这个星球上的外星人很热心愿意帮助你,而且,他们刚好有一个人懂地球话。于是,你拿出了纸笔,把修复飞船的步骤一一写下来,然后交给负责翻译的外星人翻译官。
如果这个翻译官叫 Compiler 的话:
他会拿出另一张纸,把你写的步骤全部翻译好并写到这张纸上,然后把两张纸都递给你,他就走了;
你再去找负责修飞船的工人,把翻译好的操作步骤交给他;
工人拿到翻译好的操作步骤后一顿操作把飞船修好;
在这个过程中,一旦 compiler 完成了翻译的工作,你写的那张纸就没什么用了,无论你去找哪个工人来修飞船,你都只需要把翻译好的纸给他就行。
不过,如果修理过程中飞船突然炸了,你很难知道是哪一个操作步骤出了问题,因为你读不懂外星语,compiler 也早就走了。
如果这个翻译官叫 Interpreter 的话:
他会带着你和你写的那张纸,去找负责修飞船的工人;
他先看一句你写的操作步骤,把这一句翻译给工人听,工人听到翻译后进行操作;
他看下一句,翻译,工人操作,直到把所有步骤翻译完;
在这个过程中,interpreter 全程都拿着你写的那张纸,如果第一个工人不会修,你们得去找第二个工人,然后 interpreter 还得重头再翻译一遍。
不过好处是,如果修理过程中飞船突然炸了,你可以知道是哪个操作步骤导致的,然后你就可以纠正这个步骤,interpreter 也可以重新开始帮你翻译。
Diffs
Compiler | Interpreter | |
objective | 准备一份稍后执行的代码 | 即时执行代码 |
返回值 | 返回编译好的代码,一个 | 返回程序的返回值 |
工作频率 | 只工作一次,之后需要执行程序的时候直接运行 | 每次执行程序的时候都需要工作 |
系统兼容 | 交出来的是编译好的代码,之后代码在各个不同的系统中运行时与 Compiler 都无关了,所以程序员需要负责写出能兼容不同系统的代码 | Interpreter 会跟着源码到各个系统中,所以是 Interpreter 来负责想办法编译出兼容不同系统的代码 |
速度 | ||
debug |
Last updated