→ carylorrk: interpreter 的特性通常還包括遇到才翻譯並執行,所以 11/18 13:08
→ carylorrk: JIT 通常算是 compilation,從 QEMU 的 TCI/TCG 也可以 11/18 13:09
→ carylorrk: 看得出來並不是執行會順便跑出結果的都被稱作是 11/18 13:10
→ carylorrk: interpreter。不過這之間的差異越來越小是真的。大多數 11/18 13:11
→ carylorrk: interpreter 越來越複雜,像 python 也有很多實作往 11/18 13:16
→ carylorrk: JIT 靠攏(雖然支援度都還有待加強。) 11/18 13:17
推 carylorrk: 回到原本的問題,interpreter 比較簡單在很多時候是對 11/18 14:00
→ carylorrk: 的。 compiler 通常需要處理比較多 state 的問題,而 11/18 14:01
→ carylorrk: interpreter 可以在 dispatcher 的地方處理而簡化問題 11/18 14:03
→ carylorrk: 不過當然現在成熟的語言有太多影響的因子在,實在很難 11/18 14:19
→ carylorrk: 一概而論。(跟 target 也有關係) 11/18 14:20
推 suhorng: 請問可以借轉嗎 11/18 23:05
→ littleshan: 請轉 11/19 12:21
※ suhorng:轉錄至看板 PLT 11/19 12:24
→ littleshan: 所謂「遇到才翻譯」實在不能稱之為interpreter的特性 11/19 13:30
→ littleshan: 若單一一行程式碼無法構成AST,那也沒辦法馬上執行 11/19 13:33
→ littleshan: 而翻譯成語法樹後執行,或翻譯成bytecode後執行 11/19 13:36
→ littleshan: 以抽象的角度去看並沒有什麼不同 11/19 13:37
→ littleshan: 若硬要說前者是interpreter 後者是compiler 11/19 13:42
→ littleshan: 中間的界限是很難明確定義的 11/19 13:42
→ littleshan: 所以我認為一個給結果、一個做翻譯是比較明確的定義 11/19 13:44
→ carylorrk: 嗯...其實仔細想你說的也是對的,JIT 也是產生 code 11/19 18:57
→ carylorrk: 但是有些直接給結果但實際上是 compilation + run 的卻 11/19 18:58
→ carylorrk: 也不被算在 interpreter 內(ex: go run) 11/19 18:58
→ carylorrk: 所以應該說,遇到才翻算是 interpreter 可以實作的功能 11/19 19:00
→ carylorrk: 但非必須?畢竟在很多時候遇到才翻的確比整個翻好簡單 11/19 19:01
→ carylorrk: 像是 dynamic language 裡的 type ,或是像實作 11/19 19:02
→ carylorrk: exception 這類東西,都不單單翻 AST 的問題。 11/19 19:04
推 suhorng: 我覺得主要是 "功能" 跟 "怎麼實作/優化" 的差異 11/19 20:16
→ suhorng: 就算要說是 compiler 能提供的功能也有可能吧 11/19 20:16
→ suhorng: *能提供"遇到就翻"的功能 11/19 20:18
→ suhorng: 要從這方面來分的話兩者真的都會各種混雜, 但實際上把 11/19 20:18
→ suhorng: "解釋一種語言" (要說是"定義"也無妨), 把 compiler 看成 11/19 20:19
→ suhorng: 做 code transformation 變成另一種 target 跑的東西滿 11/19 20:19
→ suhorng: 不錯; 這是功能/目的的差異 11/19 20:20
→ suhorng: 所以一個程式跑起來本來就有可能是 interpreter 跟 11/19 20:21
→ suhorng: compiler 混雜, 不需要硬生生切開說哪樣才是 interpreter 11/19 20:21