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

楼主: descent (“雄辩是银,沉默是金”)   2018-05-08 23:12:27
※ 引述《dragoncfe168 (梅长苏)》之铭言:
: 请问一下
: 为何直译器将source code转译成机器码,
: 不会产生不同电脑的机器语言不同 而无法执行的问题???
直译器并不是转成机械码, 而是直接执行运算。
例如:
1+2
直译器在发现是执行 加法时, 就会用写该直译器的语言完成 1+2 的结果。
如果是用 c 写的, 就会执行 add_fun(1,2), 然后得到 3。
: 反观同样把source code转译成机器码的编译器
: 却会有此类问题呢???
而编译器并不是直接转成机械码, 而是组合语言,
add 1,2
但是一直到最后的执行档, 都不是编译器做的。
组译器把 add 1,2 变成 机械码, 还有某种格式的执行档,
这就是不能执行的原因之一, 是的有之一, 还有其他条件会造成
这个执行档无法在其他平台执行的原因, 不过不同的
执行档格式算是比较容易解释的一个原因。
作者: jojojen (JJJ)   2018-05-09 00:27:00
看完这篇发现我的观念可能也有点不清楚 请问所谓"直接执行运算"不是还是要转成机器码让cpu执行吗?不好意思,问题可能有点基本,但我不太懂为何没有转成机器码,再麻烦您了
作者: dragoncfe168 (梅长苏)   2018-05-09 00:50:00
我晕了!!好像越搞越复杂,现在更迷惘了。书上只提到jvm将程式转译成bytecode 要执行时再由jvm以直译方式,将byte code转译成机器码让真正的电脑去执行之!!!---莫非上所谓"直译"方式,并不是指jvm的直译器?!上述
作者: bcew (bcew)   2018-05-09 05:45:00
用pseudo组语来简单解释好了,a=1; b=2; c=a+b;在编译后的结果是mov r0, 1; mov r1, 2; add r0, r1;st [c], r0; 直译器要执行上面可能走过的组语是push r0; push r1; mov r0, 1;mov r1, 2; bl add_func; st [c], r0; pop r1; pop r0; 在add_func可能还有一堆错误检查的组语,最后才有add r0, r1,但这些在编译器编译时就做掉,输出的组语就只有一个加法指令很简洁
作者: lturtsamuel (港都都教授)   2018-05-09 09:17:00
你就想像你用c语言写一个计算机 这样的计算机难道是"先把算式转换成机器码"再执行吗?当然如果要谈到优化的话可能会用上机器码 不过直译器在设计上就是要把这件事抽象掉
作者: jojojen (JJJ)   2018-05-09 09:38:00
我应该懂了 所以直译器只有做到转换成该语言用的function的地步而已 谢谢各位大大
作者: srwhite (鲁蛇阿白)   2018-05-09 09:58:00
我之前好像也误解了 感谢大大

Links booklink

Contact Us: admin [ a t ] ucptt.com