Re: [請益] 想不通直譯器vs編譯器vs機器碼的問題

看板Soft_Job作者 (「雄辯是銀,沉默是金」)時間7年前 (2018/05/08 23:12), 7年前編輯推噓6(6018)
留言24則, 5人參與, 7年前最新討論串3/9 (看更多)
※ 引述《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

05/09 00:27, 7年前 , 1F
看完這篇發現我的觀念可能也有點不清楚 請問所謂"直接執
05/09 00:27, 1F

05/09 00:27, 7年前 , 2F
行運算"不是還是要轉成機器碼讓cpu執行嗎?不好意思,問
05/09 00:27, 2F

05/09 00:27, 7年前 , 3F
題可能有點基本,但我不太懂為何沒有轉成機器碼,再麻煩
05/09 00:27, 3F

05/09 00:27, 7年前 , 4F
您了
05/09 00:27, 4F
如果給你一個 1 + 2 這樣的輸入字串, 你能不能寫一個程式, 算出 3? 直譯器就是在做這樣的事情。 你可以想成每個平台都有的計算機, 這個計算機都可以把 1+2 算出來。 但是你寫的 1+2 程式, 被該平台的編譯器/組譯器產生執行檔案之後, 只能在該平台執行。 例如: 用 vs 編譯產生的 1+2 這個程式, 並無法在 mac osX 上執行。

05/09 00:50, 7年前 , 5F
我暈了!!好像越搞越複雜,現在更迷惘了。
05/09 00:50, 5F

05/09 00:52, 7年前 , 6F
書上只提到jvm將程式轉譯成bytecode 要執行時再由
05/09 00:52, 6F

05/09 00:53, 7年前 , 7F
jvm以直譯方式,將byte code轉譯成機器碼讓真正的
05/09 00:53, 7F

05/09 00:53, 7年前 , 8F
電腦去執行之!!!
05/09 00:53, 8F

05/09 01:00, 7年前 , 9F
---莫非上所謂"直譯"方式,並不是指jvm的直譯器?!
05/09 01:00, 9F

05/09 01:01, 7年前 , 10F
上述
05/09 01:01, 10F
我的說明並沒有包含這種轉 byte code 的做法, 這種作法又稍微複雜了一點。

05/09 05:45, 7年前 , 11F
用pseudo組語來簡單解釋好了,a=1; b=2; c=a+b;在編譯後的
05/09 05:45, 11F

05/09 05:45, 7年前 , 12F
結果是mov r0, 1; mov r1, 2; add r0, r1;st [c], r0; 直譯
05/09 05:45, 12F

05/09 05:45, 7年前 , 13F
器要執行上面可能走過的組語是push r0; push r1; mov r0, 1;
05/09 05:45, 13F

05/09 05:45, 7年前 , 14F
mov r1, 2; bl add_func; st [c], r0; pop r1; pop r0; 在a
05/09 05:45, 14F

05/09 05:45, 7年前 , 15F
dd_func可能還有一堆錯誤檢查的組語,最後才有add r0, r1,
05/09 05:45, 15F

05/09 05:45, 7年前 , 16F
但這些在編譯器編譯時就做掉,輸出的組語就只有一個加法指令
05/09 05:45, 16F

05/09 05:45, 7年前 , 17F
很簡潔
05/09 05:45, 17F

05/09 09:17, 7年前 , 18F
你就想像你用c語言寫一個計算機 這樣的計算機難道是"
05/09 09:17, 18F

05/09 09:17, 7年前 , 19F
先把算式轉換成機器碼"再執行嗎?
05/09 09:17, 19F

05/09 09:20, 7年前 , 20F
當然如果要談到優化的話可能會用上機器碼 不過直譯器
05/09 09:20, 20F

05/09 09:20, 7年前 , 21F
在設計上就是要把這件事抽象掉
05/09 09:20, 21F

05/09 09:38, 7年前 , 22F
我應該懂了 所以直譯器只有做到轉換成該語言用的function
05/09 09:38, 22F

05/09 09:38, 7年前 , 23F
的地步而已 謝謝各位大大
05/09 09:38, 23F

05/09 09:58, 7年前 , 24F
我之前好像也誤解了 感謝大大
05/09 09:58, 24F
※ 編輯: descent (101.10.86.24), 05/09/2018 10:45:34
文章代碼(AID): #1QyRvYy2 (Soft_Job)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 9 篇):
文章代碼(AID): #1QyRvYy2 (Soft_Job)