# Compiler and Interpreter

两者的相似点是，它们都像一个翻译官，负责把程序员们写的高级语言翻译成电脑 CPU 可以读懂的机器语言。

## A Story And Simile

假设你在宇宙闲逛的时候，飞船突然出了故障迫降在一个外星球上了，幸运的是，你知道怎么修复，不过，你不会用那个星球的工具。还好，这个星球上的外星人很热心愿意帮助你，而且，他们刚好有一个人懂地球话。于是，你拿出了纸笔，把修复飞船的步骤一一写下来，然后交给负责翻译的外星人翻译官。

### 如果这个翻译官叫 Compiler 的话：

1. 他会拿出另一张纸，把你写的步骤全部翻译好并写到这张纸上，然后把两张纸都递给你，他就走了；
2. 你再去找负责修飞船的工人，把翻译好的操作步骤交给他；
3. 工人拿到翻译好的操作步骤后一顿操作把飞船修好；

在这个过程中，一旦 compiler 完成了翻译的工作，你写的那张纸就没什么用了，无论你去找哪个工人来修飞船，你都只需要把翻译好的纸给他就行。

不过，如果修理过程中飞船突然炸了，你很难知道是哪一个操作步骤出了问题，因为你读不懂外星语，compiler 也早就走了。

### 如果这个翻译官叫 Interpreter 的话：

1. 他会带着你和你写的那张纸，去找负责修飞船的工人；
2. 他先看一句你写的操作步骤，把这一句翻译给工人听，工人听到翻译后进行操作；
3. 他看下一句，翻译，工人操作，直到把所有步骤翻译完；

在这个过程中，interpreter 全程都拿着你写的那张纸，如果第一个工人不会修，你们得去找第二个工人，然后 interpreter 还得重头再翻译一遍。

不过好处是，如果修理过程中飞船突然炸了，你可以知道是哪个操作步骤导致的，然后你就可以纠正这个步骤，interpreter 也可以重新开始帮你翻译。

## Diffs

|           | Compiler                                                          | Interpreter                                                |
| --------- | ----------------------------------------------------------------- | ---------------------------------------------------------- |
| objective | 准备一份稍后执行的代码                                                       | 即时执行代码                                                     |
| 返回值       | 返回编译好的代码，一个 `.exe` 程序                                             | 返回程序的返回值                                                   |
| 工作频率      | 只工作一次，之后需要执行程序的时候直接运行 `.exe` 就行                                   | 每次执行程序的时候都需要工作                                             |
| 系统兼容      | 交出来的是编译好的代码，之后代码在各个不同的系统中运行时与 Compiler 都无关了，所以程序员需要负责写出能兼容不同系统的代码 | Interpreter 会跟着源码到各个系统中，所以是 Interpreter 来负责想办法编译出兼容不同系统的代码 |
| 速度        |                                                                   |                                                            |
| debug     |                                                                   |                                                            |
