分兩個方向問吧:

1、在設計一門編程語言的時候,會因為語法的設計導致最終只能實現成編譯器或者解釋器嗎?2、在設計一門編程語言的時候,需要為將來是實現編譯器還是解釋器做特殊考慮嗎?

或者,如果要設計一門既能編譯又能解釋的語言,應該注意哪些問題?


1、當然有。.net 上的所有動態語言都是在運行了之後開始編譯,還沒編譯好就解釋執行翻譯後的AST,編譯好了就跑機器碼了。

2、只要你不是發明一些奇怪的語言的話,現成的那麼多工具給你用,沒有什麼做不出來的。要設計一門即能編譯又能解釋的語言就更容易了,編譯到 .net 的DLR,什麼都不需要注意(逃


回答這個問題之前首先要理清4個概念:靜態語義,動態語義,解釋執行,編譯執行

01 靜態語義:在程序運行之前就能確定語義,也即是這部分語義與程序的輸入和運行環境無關

例子:

Int a

Int b

if a &> b then True else False

02 動態語義:在程序運行的時候才能確定的語義,與程序的輸入和運行環境相關

最極端的例子:eval函數,把程序運行時候的輸入來作為代碼執行

更常見但沒那麼極端的例子:if a &> b then True else False

注意這裡的a和b並沒有被聲明為Int類型,它們是整數,浮點數,甚至是字元串只能在程序運行的時候才知道,因此這段程序的語義也只能在程序運行的時候才能確定

03 解釋執行:也即是解釋器的工作方式,解釋器裡面有一系列的小函數(或者小分支)對應目標語言的基礎語義,也即是說,執行這些函數得到的效果和目標語言是完全一樣的。每遇到一個目標語言的語句,就以相應的參數執行對應這些語句語義的函數

04 編譯執行:編譯器遇到目標語言的語句,將其翻譯成為語義上相等的「低層語言」,交由下層(可能是裸機,也可能是虛擬機)去執行

λλλλλλλλλλλλλλλλλλλλλλλλλλλλλ 分割線 λλλλλλλλλλλλλλλλλλλλλλλλλλλλλ

現在回答你的問題:

01 原則上,每一門語言都可以完全由解釋器或者完全由編譯器來實現

解釋器不必多說,因為解釋器總是運行在程序運行的時候,因此任何語言都可以完全由解釋器來實現。

編譯器解釋一下:

第一種編譯器實現策略,是對於一門語言的靜態語義部分,用編譯器在程序運行之前將其編譯,然後,將其動態語義部分留待RTS系統來解釋執行,因此,RTS可以視為一門語言的動態語義的解釋器

第二種編譯器實現策略,是在程序運行的時候(此時程序語義完全確定),對程序進行「即時編譯」。因此,原則上程序是可以完全編譯執行的,但通常而言並不全部編譯成代碼,總有一部分動態語義交由RTS來處理

02 需要認真考慮,具體說就是考慮:你這門語言裏要多少靜態語義,要多少動態語義

既然所有語言都可以編譯執行和解釋執行,為什麼還需要考慮靜態語義和動態語義的問題

A 對於程序運行時候的開銷而言,解釋執行的開銷最大,即時編譯次之,如果一門語言大多數是靜態語義,那麼它的性能可以提到很極致,同時程序的開銷可以非常確定(這點對於嵌入式系統很重要);反過來,某些動態語義可以讓程序具備高度的靈活性

B RTS自身的編寫也是一個微妙的問題,一般來說,RTS總是用彙編語言語義相等(或者是其子集)的語言(比如說C)來編寫,你不會用一個有RTS的語言來寫RTS(原因你懂得)。順便提一句,RUST語言為什麼在新語言裡面獨一無二,就是因為它沒有動態語義,不需要RTS

λλλλλλλλλλλλλλλλλλλλλλλλλλλλλ 分割線 λλλλλλλλλλλλλλλλλλλλλλλλλλλλλ

這篇回答細節上有很多槽點,但大體上是對的(完整寫下來工程量浩大……)。希望能幫到你,也歡迎大家多提意見


1,不會,事實上你很難區分有些語言到底算是編譯型還是解釋型。最基本的例子,java。java也是要把源文件編譯成位元組碼的,然後位元組碼是在vm上解釋執行的,你說它算啥?同樣python也是如此,JavaScript 也是如此。

現在的web assmbly 技術更是模糊了這個界限,編譯C/C++到 wasm,然後瀏覽器解釋執行,你說C/C++算啥?

2,實際上你在設計一門解釋執行的語言的時候,先要設計的是它的VM,那麼你的VM有什麼功能,你的語言就有那些。一開始就打算跑在虛擬機的語言可能發揮的空間更高一點,因為你的VM有什麼功能是你自己定的。一開始就打算直接跑在機器上的語言可能你的發揮空間小一點,CPU有什麼功能是Intel AMD決定的。 另外決定跑在什麼上面主要是為了性能考慮,為了你開發的語言是做什麼用的考慮。


首先編譯型和解釋型這倆詞是非常不專業的,根本就沒有準確的定義,其次會因為dynamic scoping之類的動態特性導致更容易被你們所覺得的解釋地實現。
1、除非你專門在語法規範裏寫一句,「任何以直接或間接的方式將程序翻譯成機器碼的行為都是不符合規範的」,否則是不會有限制的。2、要考慮
推薦閱讀:
相關文章