※ 引述《dragoncfe168 (梅長蘇)》之銘言:
: 請問一下
: 為何直譯器將source code轉譯成機器碼,
: 不會產生不同電腦的機器語言不同 而無法執行的問題???
: 反觀同樣把source code轉譯成機器碼的編譯器
: 卻會有此類問題呢???
雖然大家已經回很多了,但再回一篇應該也沒關係吧。
試試看能不能用簡單的方式來類比,當然因為是類比,所以不是那麼精確,
例如轉成機器碼這件事本身還牽扯到 Linker 等等的,就先不管了啦。XD
從後續的推文來看,原 PO 提到的其實有三種東西:
1. 編譯成機器碼的編譯器模式 (Ex. 傳統的 C/C++ 編譯器)
類比:
- 書面講稿翻譯,從中文翻成英文,管你講者唸不唸,我全部一次
翻譯好給你。
- 聽眾語言(目標平台)不同,下一場的聽眾是法國人怎麼辦?找個
懂中文和法文的翻譯者唄。
- 所以通常說 C / C++ Compiler,其實省略了目標平台的描述。
就算同樣是 C 編譯器,也不一定每種目標平台都支援,可以說
是不同的程式。
- 因為是書面翻譯,翻譯完的東西可以給會唸英文的人幫你唸,翻譯
者翻完就可以滾蛋了。
2. Python 等直譯式語言
類比:
- 現場口譯,從中文翻成英文。但只有當你講的時候我才一句一句
翻譯,就算你中文講稿上有,但講者沒講出口的字句,口譯者就
不會去翻譯。
- 聽眾語言(目標平台)不同,下一次的聽眾是法國人怎麼辦?找個
會從中文翻成法文的口譯者唄。
- 所以通常說某種語言的直譯器,其實省略了目標平台的描述。就
算同樣叫做 Python 直譯器,但他們懂的目標語言可能不同,可
以說是兩隻不同的程式。
- 因為是口譯,所以演講的時候翻譯者 (Python 直譯器) 一定要在場。
3. .NET / Java 等編譯成中介語言的編譯模式
類比:
- 書面翻譯後再口譯。我通通先翻成某種為了特殊目的而創立的語言,
例如邏輯語[1],然後再找個邏輯語的口譯來現場翻譯。
- 所以如果要從中文翻譯成英文,要做以下兩個步驟:
1. 先把中文翻譯成邏輯語 (Java Compiler / 你下 javac 時在做的事)
2. 把邏輯語翻譯成英文唸出來(Java Runtime / 你下 java Main 時在做的事)
- 聽眾語言(目標平台)不同,下一次的聽眾是法國人怎麼辦?找個會
把邏輯語翻成法文的譯者唄。
- 所以我們說 Java / .NET 執行環境,其實省略了目標平台的描述。
就算同樣叫 Java 執行環境,他們懂的目標語言可能不同,可以說是
不同的程式。
- 因為某種程度上來說也是口譯,所以翻譯者 (Java Runtime) 一定要在場。
[1]: https://zh.wikipedia.org/wiki/%E9%80%BB%E8%BE%91%E8%AF%AD
至於這三種模式能不能跨平台,那就要看你怎麼去定義「跨平台」這件事了。