作者fayhong (恰似飞鸿踏雪泥)
看板Soft_Job
标题Re: [请益] 想不通直译器vs编译器vs机器码的问题
时间Wed May 9 12:42:26 2018
※ 引述《dragoncfe168 (梅长苏)》之铭言:
: 请问一下
: 为何直译器将source code转译成机器码,
: 不会产生不同电脑的机器语言不同 而无法执行的问题???
: 反观同样把source code转译成机器码的编译器
: 却会有此类问题呢???
呃,我觉得你没有搞清楚一件事,原始码、中间码、机器码的差异。
首先,编译器的目的,不是转成机器码用的。
编译器的目的,是把语言 A 的原始码,转成语言 B 的原始码用的。
例如 LLVM 或者是 GCC,它们把 C/C++ 转过後,不是直接变成执行档,
而是先变成一个特殊语言的中间码 (IR),再由後端(backend)机制,转成执行档。
而执行档,也可以说是一种机器码。
若是语言 B 就是组语,当然你也可以当作是一种转机器码。
而直译器的目的,是用来直接执行的。
换句话说,原始档并没有经过转换!没有 xxxx.a -> xxxx.b -> xxxx.exe
这种过程,而是 xxxx.a 直接喂进直译器,由直译器帮你执行。
以 Java 为例,XXXX.java -> XXXX.class 这过程,的确可以说是编译。
而从概念性的角度来看,JVM 执行 XXXX.class 这过程,可以说是直译。
这若牵涉到内部 JIT 的运作,则 JVM 亦有编译机制在里头,但这更深了,
不在讨论范围。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 27.242.99.124
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1525840949.A.042.html
※ 编辑: fayhong (27.242.99.124), 05/09/2018 12:43:06
1F:→ pttworld: 直译器也有转bytecode的05/09 12:48
2F:→ fayhong: 请问直译转 bytecode 後,是直接执行,还是给别的 VM 执05/09 13:35
3F:→ fayhong: 行呢?05/09 13:35
4F:→ weiyucsie: 转 bytecode 的过程感觉要叫编译05/09 13:53
5F:→ weiyucsie: en.wikipedia.org/wiki/Interpreter_(computing) 05/09 13:59
6F:→ weiyucsie: 直译->执行来源语言 编译->转换来源语言为目标语言05/09 14:32
7F:→ weiyucsie: 我是根据interpreter和compiler页面前几行去解释的05/09 14:33
8F:→ weiyucsie: 像是JIT compilation後面也是写compilation05/09 14:34
9F:→ pttworld: 你看wiki的第二个type就是了,有三种。05/09 15:28
※ 编辑: fayhong (42.72.218.191), 05/09/2018 17:39:22
10F:→ weiyucsie: 楼上说的bytecode是java的bytecode还是中间码? 05/09 17:43