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