作者descent (「雄辯是銀,沉默是金」)
看板Soft_Job
標題Re: [請益] 想不通直譯器vs編譯器vs機器碼的問題
時間Tue May 8 23:12:27 2018
※ 引述《dragoncfe168 (梅長蘇)》之銘言:
: 請問一下
: 為何直譯器將source code轉譯成機器碼,
: 不會產生不同電腦的機器語言不同 而無法執行的問題???
直譯器並不是轉成機械碼, 而是直接執行運算。
例如:
1+2
直譯器在發現是執行 加法時, 就會用寫該直譯器的語言完成 1+2 的結果。
如果是用 c 寫的, 就會執行 add_fun(1,2), 然後得到 3。
: 反觀同樣把source code轉譯成機器碼的編譯器
: 卻會有此類問題呢???
而編譯器並不是直接轉成機械碼, 而是組合語言,
add 1,2
但是一直到最後的執行檔, 都不是編譯器做的。
組譯器把 add 1,2 變成 機械碼, 還有某種格式的執行檔,
這就是不能執行的原因之一, 是的有之一, 還有其他條件會造成
這個執行檔無法在其他平台執行的原因, 不過不同的
執行檔格式算是比較容易解釋的一個原因。
--
紙上得來終覺淺,絕知此事要躬行。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 101.10.86.24
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1525792354.A.F02.html
推 jojojen: 看完這篇發現我的觀念可能也有點不清楚 請問所謂"直接執 05/09 00:27
→ jojojen: 行運算"不是還是要轉成機器碼讓cpu執行嗎?不好意思,問 05/09 00:27
→ jojojen: 題可能有點基本,但我不太懂為何沒有轉成機器碼,再麻煩 05/09 00:27
→ jojojen: 您了 05/09 00:27
如果給你一個 1 + 2 這樣的輸入字串,
你能不能寫一個程式, 算出 3?
直譯器就是在做這樣的事情。
你可以想成每個平台都有的計算機, 這個計算機都可以把 1+2 算出來。
但是你寫的 1+2 程式, 被該平台的編譯器/組譯器產生執行檔案之後,
只能在該平台執行。
例如: 用 vs 編譯產生的 1+2 這個程式, 並無法在 mac osX 上執行。
推 dragoncfe168: 我暈了!!好像越搞越複雜,現在更迷惘了。 05/09 00:50
→ dragoncfe168: 書上只提到jvm將程式轉譯成bytecode 要執行時再由 05/09 00:52
→ dragoncfe168: jvm以直譯方式,將byte code轉譯成機器碼讓真正的 05/09 00:53
→ dragoncfe168: 電腦去執行之!!! 05/09 00:53
推 dragoncfe168: ---莫非上所謂"直譯"方式,並不是指jvm的直譯器?! 05/09 01:00
→ dragoncfe168: 上述 05/09 01:01
我的說明並沒有包含這種轉 byte code 的做法, 這種作法又稍微複雜了一點。
→ bcew: 用pseudo組語來簡單解釋好了,a=1; b=2; c=a+b;在編譯後的 05/09 05:45
→ bcew: 結果是mov r0, 1; mov r1, 2; add r0, r1;st [c], r0; 直譯 05/09 05:45
→ bcew: 器要執行上面可能走過的組語是push r0; push r1; mov r0, 1; 05/09 05:45
→ bcew: mov r1, 2; bl add_func; st [c], r0; pop r1; pop r0; 在a 05/09 05:45
→ bcew: dd_func可能還有一堆錯誤檢查的組語,最後才有add r0, r1, 05/09 05:45
→ bcew: 但這些在編譯器編譯時就做掉,輸出的組語就只有一個加法指令 05/09 05:45
→ bcew: 很簡潔 05/09 05:45
推 lturtsamuel: 你就想像你用c語言寫一個計算機 這樣的計算機難道是" 05/09 09:17
→ lturtsamuel: 先把算式轉換成機器碼"再執行嗎? 05/09 09:17
推 lturtsamuel: 當然如果要談到優化的話可能會用上機器碼 不過直譯器 05/09 09:20
→ lturtsamuel: 在設計上就是要把這件事抽象掉 05/09 09:20
推 jojojen: 我應該懂了 所以直譯器只有做到轉換成該語言用的function 05/09 09:38
→ jojojen: 的地步而已 謝謝各位大大 05/09 09:38
→ srwhite: 我之前好像也誤解了 感謝大大 05/09 09:58
※ 編輯: descent (101.10.86.24), 05/09/2018 10:45:34