2014-01-13 103 views
0

我有興趣在JavaScript中編寫一個Pascal編譯器。但是我對編譯器是什麼使編譯器而不是解釋器感到困惑。特別是我需要生成像C/C++這樣的字節碼或彙編代碼,例如a.out編譯器vs解釋器,還是用解釋型語言編寫編譯器仍然使它成爲編譯器?

所以,如果我是掃描和解析hello_world.pas

program helloworld; 
begin 
    Writeln('Hello world!'); 
end. 

,併產生這樣的:

(function() { 
    console.log('Hello world!'); 
})(); 

難道我只是寫一個翻譯或編譯器?

任何有關在JavaScript中編寫編譯器的提示或建議將不勝感激。

+2

我想你剛剛寫了一個翻譯... – Floris

+1

它有什麼不同?不要試圖粗魯,只是試圖理解爲什麼這裏使用的術語對你很重要。 – Oak

+0

http://stackoverflow.com/a/3618119,http://stackoverflow.com/a/2377288 –

回答

6

程序是編譯器還是解釋器是由其輸入輸出決定的,而不是由程序本身的體系結構決定的。

編譯器讀取以高級語言編寫的源代碼並將其翻譯爲其他內容。編譯器通常使用低級語言(通常是機器代碼)生成可執行程序。從那裏開始,你所需要的只是編譯的可執行文件運行的程序;你只需要源代碼和編譯器,如果你想修改的程序。

解釋器還讀取高級別的源代碼,但不是生成可執行文件,而是執行解析程序。要運行這樣的程序,你總是需要一份源代碼和解釋器的副本。

編譯器和解釋器通常是編譯的,在編譯器的情況下,編譯器通常用於自身編譯(這稱爲引導)。但這只是常見的做法。沒有實際的理由說明你爲什麼不能用解釋型語言編寫編譯器。

至於你的編譯器應該輸出什麼類型的低級語言,這取決於你想讓你的可執行文件運行的體系結構。您可能希望爲您的平臺生成彙編語言,然後使用預先存在的彙編程序將其轉換爲機器代碼。

您編寫的代碼只是將Pascal代碼翻譯成Javascript代碼。你可以把它看作是一種編譯方式:你正在將Pascal編譯成Javascript,所以它可以由Javascript解釋器運行。例如,如果您正在嘗試編寫允許用戶在Web瀏覽器中運行Pascal代碼的內容,那麼您就有了正確的想法。

+1

所以你在說OP是編寫一個編譯器還是一個解釋器?您的定義似乎都不適用於它。 – delnan

+0

我增加了另一段來解決這個問題。 –

+1

值得注意的是,許多「口譯員」會在解釋源文件之前將其轉換爲某種中間形式。如果中間形式可以持續下去,並且不期望成爲源文件的完整表示形式,那麼人們可以將轉換爲中間形式視爲「編譯」[許多1980年代的BASIC解釋器會在輸入每行時對其進行預處理並丟棄原始文件;一個'LIST'命令會重建每一行顯示的原始形式。預處理的版本不是文本,但是*仍然是「源代碼」。] – supercat