看板 Soft_Job 關於我們 聯絡資訊
※ 引述《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