2011-09-08 44 views
11

是否有可能使用Javascript來編寫可以支持其他類型語言的編譯器作爲腳本?可能用Javascript寫一個編譯器?

比方說,我有一塊HTML。

<script language="cpp" id="cppScriptBlock" EntryPoint="main"> 
    int main() { 
     cout << "<h1>CPPHeader</h1>"; 
    } 
</script> 

<script language="java" id="javaScriptBlock" EntryPoint="MyJavaClass"> 
    public class MyJavaClass { 
     public final void main() { 
      java.lang.System.out.println("<h1>JavaHeader</h1>"); 
     } 
    } 
</script> 

<script language="csharp" id="csharpScriptBlock" EntryPoint="MyCSharpClass "> 
    public class MyCSharpClass { 
     public static void Main() { 
      System.Console.WriteLine("<h1>CSharpHeader</h1>"); 
     } 
    } 
</script> 


<script language="javascript"> 
    $("#cppScriptBlock").compileAndRun(); 
    $("#javaScriptBlock").compileAndRun(); 
    $("#csharpScriptBlock").compileAndRun(); 
</script> 

最後生成以下HTML

<h1>CPPHeader</h1> 
<h1>JavaHeader</h1> 
<h1>CSharpHeader</h1> 

這可能嗎?

Alex

+3

是的,它可以完成。不過,我必須祝你好運。 :) –

+4

我會在這裏留下:http://bellard.org/jslinux/ –

+1

請參閱https://github.com/gpjt/webgl-lessons/blob/master/example01/index.html中的示例WebGL的。 GLSL(着色語言)程序用腳本塊編寫。 –

回答

0

是的,它是可能的。

然而,編寫一種從一種語言轉換成Javascript並且然後讓瀏覽器句柄生成和執行字節碼的解釋器會容易得多。

7

是的,但是你需要做很多工作。就像一個真正的編譯器一樣,你必須解析代碼,將它轉換爲中間代碼等。之後,你必須模擬包括這些語言在內的所有運行庫的環境。總之,這是不實際的,但它是可能的。

+0

轉換爲「中間代碼」意味着我需要一個用JavaScript構建的「虛擬機」來運行中間代碼,不是嗎? –

+0

@亞歷克斯:這就是我認爲你會做的。大多數編譯器(以及大量的解釋器)也會在某個時刻生成中間代碼。無論是輸出,執行還是轉換更多不同,但大多數編譯器都有一個生成類似於中間代碼的常見步驟。 – icktoofay

7

是的,Javascript是圖靈完成。你可以用任何語言編寫任何代碼。當然包括編譯器。我無法想象有任何理由可以做到這一點。如果你足夠好用Javascript來編寫一個編譯器,你可能只想用JavaScript代替另一種語言編寫代碼。

+2

同意你的意見。實際上,我不打算這樣做。我只是對使用Javascript編譯編譯器的可能性感興趣。這個想法是針對編程語言的組合。 –

+3

這就像告訴一位藝術家,如果他/她足夠好描繪某人畫一幅貓的照片,他/她應該只畫一隻貓。如果藝術家想要畫畫,讓藝術家畫畫。只是不要試圖告訴他們繪畫什麼。 – unsynchronized

2

請參閱Metacompiler tutorial關於如何使用Javascript作爲實現語言來編寫一般的任意編譯器(和compier-compilers)。

16

是的,使用Jison很有可能。

它根據您定義的語言結構生成JavaScript解析器。

Jison需要上下文無關文法作爲輸入,並輸出能夠分析由語法描述的語言的一個JavaScript 文件。然後,您可以使用生成的腳本來解析輸入並接受,拒絕, 或根據輸入執行操作。

- 從documentation

PS:CoffeeScript!也是用這個創建的。 :)

1

是的,這是可能的。但是不要手動編寫解析器,我會鼓勵你使用一個好的解析器生成器。

例如ANTLR由特倫斯·帕爾是一個非常強大的解析器生成具有a JavaScript target。它在支持ECMAScript 5.1的環境中工作。 (在Firefox,Safari,Chrome,Internet Explorer和Node.js中測試過)。它是開放源代碼(BSD許可證),提供大量文檔和一本非常好的書籍。

使用,而不是寫自己的解析器這樣的工具,你寫一個語法和爲您生成解析器。

相關問題