Re: [理工] 程式語言觀念

作者: littleshan (我要加入劍道社!)   2014-11-18 12:39:47
※ 引述《gauss760220 (宅哥)》之銘言:
: ※ [本文轉錄自 Grad-ProbAsk 看板 #1KQe7Yfy ]
: 作者: gauss760220 (宅哥) 看板: Grad-ProbAsk
: 標題: [理工] 程式語言觀念
: 時間: Tue Nov 18 07:16:47 2014
: 國考裡面有個題目
: "為何Interpreter比Compiler更容易加入新的程式語言觀念?"
: 請問這題該怎麼回答?
這個命題根本就是錯的。
Interpreter 是給一段程式碼,它直接跑出結果送給你。
Compiler 是給一段程式碼,它翻譯成另一個語言、會跑出同樣結果的程式碼。
它們的差別只有在最後產出結果的地方不同,
而前面的 parsing 與 semantic check 則完全相同。
對程式語言來說,前面的部份才是關鍵。
現在的語言早就沒在分什麼 interpreter 與 compiler,
都嘛是做在一起,像 python / ruby / haskell / ocaml,
它們都同時具備 compiler 與 interpreter,
也都有很豐富的語言特性。
就像「compiler產生的程式碼跑得比interpreter快」之類的命題,
這些其實都是以訛傳訛的錯誤印象。
compiler 與 interpreter 差別就只是一個做翻譯、另一個給結果,
沒有道理哪個比較容易修改、或哪個執行起來比較快。
作者: carylorrk (carylorrk)   2014-11-18 13:08:00
interpreter 的特性通常還包括遇到才翻譯並執行,所以JIT 通常算是 compilation,從 QEMU 的 TCI/TCG 也可以看得出來並不是執行會順便跑出結果的都被稱作是interpreter。不過這之間的差異越來越小是真的。大多數interpreter 越來越複雜,像 python 也有很多實作往JIT 靠攏(雖然支援度都還有待加強。)回到原本的問題,interpreter 比較簡單在很多時候是對的。 compiler 通常需要處理比較多 state 的問題,而interpreter 可以在 dispatcher 的地方處理而簡化問題不過當然現在成熟的語言有太多影響的因子在,實在很難一概而論。(跟 target 也有關係)
作者: suhorng ( )   2014-11-18 23:05:00
請問可以借轉嗎
作者: littleshan (我要加入劍道社!)   2014-11-19 12:21:00
請轉所謂「遇到才翻譯」實在不能稱之為interpreter的特性若單一一行程式碼無法構成AST,那也沒辦法馬上執行而翻譯成語法樹後執行,或翻譯成bytecode後執行以抽象的角度去看並沒有什麼不同若硬要說前者是interpreter 後者是compiler中間的界限是很難明確定義的所以我認為一個給結果、一個做翻譯是比較明確的定義
作者: carylorrk (carylorrk)   2014-11-19 18:57:00
嗯...其實仔細想你說的也是對的,JIT 也是產生 code但是有些直接給結果但實際上是 compilation + run 的卻也不被算在 interpreter 內(ex: go run)所以應該說,遇到才翻算是 interpreter 可以實作的功能但非必須?畢竟在很多時候遇到才翻的確比整個翻好簡單像是 dynamic language 裡的 type ,或是像實作exception 這類東西,都不單單翻 AST 的問題。
作者: suhorng ( )   2014-11-19 20:16:00
我覺得主要是 "功能" 跟 "怎麼實作/優化" 的差異就算要說是 compiler 能提供的功能也有可能吧*能提供"遇到就翻"的功能要從這方面來分的話兩者真的都會各種混雜, 但實際上把"解釋一種語言" (要說是"定義"也無妨), 把 compiler 看成做 code transformation 變成另一種 target 跑的東西滿不錯; 這是功能/目的的差異所以一個程式跑起來本來就有可能是 interpreter 跟compiler 混雜, 不需要硬生生切開說哪樣才是 interpreter

Links booklink

Contact Us: admin [ a t ] ucptt.com