※ 引述《dragoncfe168 (梅长苏)》之铭言:
: 请问一下
: 为何直译器将source code转译成机器码,
: 不会产生不同电脑的机器语言不同 而无法执行的问题???
: 反观同样把source code转译成机器码的编译器
: 却会有此类问题呢???
虽然大家已经回很多了,但再回一篇应该也没关系吧。
试试看能不能用简单的方式来类比,当然因为是类比,所以不是那么精确,
例如转成机器码这件事本身还牵扯到 Linker 等等的,就先不管了啦。XD
从后续的推文来看,原 PO 提到的其实有三种东西:
1. 编译成机器码的编译器模式 (Ex. 传统的 C/C++ 编译器)
类比:
- 书面讲稿翻译,从中文翻成英文,管你讲者唸不唸,我全部一次
翻译好给你。
- 听众语言(目标平台)不同,下一场的听众是法国人怎么办?找个
懂中文和法文的翻译者呗。
- 所以通常说 C / C++ Compiler,其实省略了目标平台的描述。
就算同样是 C 编译器,也不一定每种目标平台都支援,可以说
是不同的程式。
- 因为是书面翻译,翻译完的东西可以给会唸英文的人帮你唸,翻译
者翻完就可以滚蛋了。
2. Python 等直译式语言
类比:
- 现场口译,从中文翻成英文。但只有当你讲的时候我才一句一句
翻译,就算你中文讲稿上有,但讲者没讲出口的字句,口译者就
不会去翻译。
- 听众语言(目标平台)不同,下一次的听众是法国人怎么办?找个
会从中文翻成法文的口译者呗。
- 所以通常说某种语言的直译器,其实省略了目标平台的描述。就
算同样叫做 Python 直译器,但他们懂的目标语言可能不同,可
以说是两只不同的程式。
- 因为是口译,所以演讲的时候翻译者 (Python 直译器) 一定要在场。
3. .NET / Java 等编译成中介语言的编译模式
类比:
- 书面翻译后再口译。我通通先翻成某种为了特殊目的而创立的语言,
例如逻辑语[1],然后再找个逻辑语的口译来现场翻译。
- 所以如果要从中文翻译成英文,要做以下两个步骤:
1. 先把中文翻译成逻辑语 (Java Compiler / 你下 javac 时在做的事)
2. 把逻辑语翻译成英文唸出来(Java Runtime / 你下 java Main 时在做的事)
- 听众语言(目标平台)不同,下一次的听众是法国人怎么办?找个会
把逻辑语翻成法文的译者呗。
- 所以我们说 Java / .NET 执行环境,其实省略了目标平台的描述。
就算同样叫 Java 执行环境,他们懂的目标语言可能不同,可以说是
不同的程式。
- 因为某种程度上来说也是口译,所以翻译者 (Java Runtime) 一定要在场。
[1]: https://zh.wikipedia.org/wiki/%E9%80%BB%E8%BE%91%E8%AF%AD
至于这三种模式能不能跨平台,那就要看你怎么去定义“跨平台”这件事了。