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

看板C_and_CPP作者 (我正在想要換什麼)時間9年前 (2014/11/18 12:39), 編輯推噓3(3033)
留言36則, 3人參與, 最新討論串4/4 (看更多)
※ 引述《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 差別就只是一個做翻譯、另一個給結果, 沒有道理哪個比較容易修改、或哪個執行起來比較快。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.250.32.97 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1416285590.A.386.html

11/18 13:08, , 1F
interpreter 的特性通常還包括遇到才翻譯並執行,所以
11/18 13:08, 1F

11/18 13:09, , 2F
JIT 通常算是 compilation,從 QEMU 的 TCI/TCG 也可以
11/18 13:09, 2F

11/18 13:10, , 3F
看得出來並不是執行會順便跑出結果的都被稱作是
11/18 13:10, 3F

11/18 13:11, , 4F
interpreter。不過這之間的差異越來越小是真的。大多數
11/18 13:11, 4F

11/18 13:16, , 5F
interpreter 越來越複雜,像 python 也有很多實作往
11/18 13:16, 5F

11/18 13:17, , 6F
JIT 靠攏(雖然支援度都還有待加強。)
11/18 13:17, 6F

11/18 14:00, , 7F
回到原本的問題,interpreter 比較簡單在很多時候是對
11/18 14:00, 7F

11/18 14:01, , 8F
的。 compiler 通常需要處理比較多 state 的問題,而
11/18 14:01, 8F

11/18 14:03, , 9F
interpreter 可以在 dispatcher 的地方處理而簡化問題
11/18 14:03, 9F

11/18 14:19, , 10F
不過當然現在成熟的語言有太多影響的因子在,實在很難
11/18 14:19, 10F

11/18 14:20, , 11F
一概而論。(跟 target 也有關係)
11/18 14:20, 11F

11/18 23:05, , 12F
請問可以借轉嗎
11/18 23:05, 12F

11/19 12:21, , 13F
請轉
11/19 12:21, 13F
suhorng:轉錄至看板 PLT 11/19 12:24

11/19 13:30, , 14F
所謂「遇到才翻譯」實在不能稱之為interpreter的特性
11/19 13:30, 14F

11/19 13:33, , 15F
若單一一行程式碼無法構成AST,那也沒辦法馬上執行
11/19 13:33, 15F

11/19 13:36, , 16F
而翻譯成語法樹後執行,或翻譯成bytecode後執行
11/19 13:36, 16F

11/19 13:37, , 17F
以抽象的角度去看並沒有什麼不同
11/19 13:37, 17F

11/19 13:42, , 18F
若硬要說前者是interpreter 後者是compiler
11/19 13:42, 18F

11/19 13:42, , 19F
中間的界限是很難明確定義的
11/19 13:42, 19F

11/19 13:44, , 20F
所以我認為一個給結果、一個做翻譯是比較明確的定義
11/19 13:44, 20F

11/19 18:57, , 21F
嗯...其實仔細想你說的也是對的,JIT 也是產生 code
11/19 18:57, 21F

11/19 18:58, , 22F
但是有些直接給結果但實際上是 compilation + run 的卻
11/19 18:58, 22F

11/19 18:58, , 23F
也不被算在 interpreter 內(ex: go run)
11/19 18:58, 23F

11/19 19:00, , 24F
所以應該說,遇到才翻算是 interpreter 可以實作的功能
11/19 19:00, 24F

11/19 19:01, , 25F
但非必須?畢竟在很多時候遇到才翻的確比整個翻好簡單
11/19 19:01, 25F

11/19 19:02, , 26F
像是 dynamic language 裡的 type ,或是像實作
11/19 19:02, 26F

11/19 19:04, , 27F
exception 這類東西,都不單單翻 AST 的問題。
11/19 19:04, 27F

11/19 20:16, , 28F
我覺得主要是 "功能" 跟 "怎麼實作/優化" 的差異
11/19 20:16, 28F

11/19 20:16, , 29F
就算要說是 compiler 能提供的功能也有可能吧
11/19 20:16, 29F

11/19 20:18, , 30F
*能提供"遇到就翻"的功能
11/19 20:18, 30F

11/19 20:18, , 31F
要從這方面來分的話兩者真的都會各種混雜, 但實際上把
11/19 20:18, 31F

11/19 20:19, , 32F
"解釋一種語言" (要說是"定義"也無妨), 把 compiler 看成
11/19 20:19, 32F

11/19 20:19, , 33F
做 code transformation 變成另一種 target 跑的東西滿
11/19 20:19, 33F

11/19 20:20, , 34F
不錯; 這是功能/目的的差異
11/19 20:20, 34F

11/19 20:21, , 35F
所以一個程式跑起來本來就有可能是 interpreter 跟
11/19 20:21, 35F

11/19 20:21, , 36F
compiler 混雜, 不需要硬生生切開說哪樣才是 interpreter
11/19 20:21, 36F
文章代碼(AID): #1KQisME6 (C_and_CPP)
文章代碼(AID): #1KQisME6 (C_and_CPP)