Re: [请益] 想不通直译器vs编译器vs机器码的问题

楼主: brianhsu (坟墓)   2018-05-09 10:10:25
※ 引述《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
至于这三种模式能不能跨平台,那就要看你怎么去定义“跨平台”这件事了。
作者: pttworld (批踢踢世界)   2018-05-09 11:26:00
蟒蛇用bytecode
作者: dragoncfe168 (梅长苏)   2018-05-09 11:49:00
太感谢你了!这篇解说堪称经典~值得M起来供后世传颂!当今市面上尚无一教师与书籍能做如此卡通化的阐述..倘若补教老师皆能有如此统整归纳类比能力~天下万千莘莘学子~又何愁学不会程式呢?
作者: koushimei (群魔乱舞)   2018-05-09 12:41:00
这样解释稍微有点概念了!
作者: senjor (哞哞)   2018-05-09 12:43:00
其实如果有从计算机概论从头学,应该还是会懂啦...
作者: peanut97 (丁丁)   2018-05-09 12:47:00
因为能不能清楚解释这个跟收入没有太大关系XD
作者: senjor (哞哞)   2018-05-09 12:56:00
其实很多工作不懂或没有记起来这个也没有什么影响 XD
作者: jojojen (JJJ)   2018-05-09 13:51:00
作者: gname ((′口‵)↗︴<><...<><)   2018-05-09 17:10:00
推一个~
作者: soheadsome (师大狗鼻哥)   2018-05-09 20:01:00
有JIT的范例 有办法在说看看AOT的范例吗xde
作者: Awenwen (初心者)   2018-05-11 13:52:00
厉害了

Links booklink

Contact Us: admin [ a t ] ucptt.com