簡體   English   中英

C 用 javascript 編寫的解釋器

[英]C interpreter written in javascript

有沒有用 javascript 或 java 編寫的 C 解釋器?

我不需要完整的解釋器,但我需要能夠逐步執行程序並能夠查看變量的值、堆棧……所有這些都在 web 界面中。

這個想法是通過向 C 初學者展示程序的逐步執行來幫助他們。 我們正在使用 GWT 來構建接口,因此如果 Java 中存在某些內容,我們應該能夠使用它。

我可以修改它以滿足我的需要,但如果我可以避免編寫解析器/抽象語法樹遍歷器/堆棧操作......那就太好了。


編輯:

需要明確的是,我不想模擬完整的 C,因為有些程序可能非常棘手。

我所說的步驟是指基本操作,例如:表達式評估,做作,function 調用。

我要模擬的 C 將包含:變量、for、while、函數、arrays、指針、數學函數。 沒有 goto、字符串函數、ctypes.h、setjmp.h...(至少現在是這樣)。

這是一個原型: http://www.di.ens.fr/~fevrier/war/simu.html

在此示例中,我們手動將 C 代碼轉換為 javascript 表示,但它是有限的(不處理諸如a == 2 || a = 1之類的表達式)並且僅限於手動轉換的程序。

我們在遠程服務器上有一個 C 編譯器,因此我們可以檢查代碼是否正確(並且沒有任何未定義的行為)。 解析/AST 構建也可以遠程完成(因此任何語言),但 AST 行走需要在 javascript 中才能在客戶端運行。

There's a C grammar available for antlr that you can use to generate a C parser in Java, and possibly JavaScript too.

有一個 em-scripten 可以將 LLVM 語言轉換為 JS,對它進行一些修改,您可以生成一個 C interperter。

felixhJSCPP 項目在 Javascript 中提供了 C++ 解釋器,盡管有一些限制。

https://github.com/felixhao28/JSCPP

所以一個示例程序可能如下所示:

var JSCPP = require('JSCPP');
var launcher = JSCPP.launcher;
var code = 'int main(){int a;cin>>a;cout<<a;return 0;}';
var input = '4321';
var exitcode = launcher.run(code, input);
console.info('program exited with code ' + exitcode);

截至 2015 年 3 月,它正在積極開發中,因此雖然它可用,但仍有可能繼續擴展的領域。 檢查文檔的限制。 看起來您可以將它用作直接的 C 解釋器,目前對庫的支持有限,沒有其他問題。

我不知道用 JavaScript 編寫的任何 C 解釋器,但這里討論了可用的 C 解釋器:

是否有 C 的解釋器?

您最好尋找在 JavaScript 之上運行的任何類型的虛擬機,然后查看是否可以找到為 VM 發出正確機器代碼的 C 編譯器。 一個可能的似乎是 LLVM。 如果你能找到可以運行 LLVM 的 JavaScript VM,那么你的狀態會很好。

我做了一些谷歌搜索並找到了 Emscripten,它將 C 代碼直接翻譯成 JavaScript:也許你可以用這個做點什么:

https://github.com/kripken/emscripten/wiki

也許您可以修改 Emscripten 以在 C 的每個編譯行之后發出一個“序列點”,然后您可以使您的模擬環境單步從序列點到序列點。

我相信 Emscripten 正在實現 LLVM,所以它實際上可能有虛擬寄存器; 如果是這樣,它可能是您的理想選擇。

我知道您指定了 C 代碼,但您可能需要考慮使用更簡單語言的 JavaScript 仿真。 特別是,請考慮 FORTH。

FORTH 在一個極其簡單的虛擬機上運行。 FORTH 中有兩個堆棧,一個數據堆棧和一個控制流堆棧(稱為“返回”堆棧); 加上一些全局 memory。 最初 FORTH 是一種 16 位語言,但現在有很多 32 位 FORTH 實現。

因為 FORTH 代碼有點“接近機器”,所以當你看到它工作時,很容易理解它是如何工作的。 我在學習 C 之前學習了 FORTH,我發現這是一次寶貴的學習經歷。

JavaScript 中已經有幾個 FORTH 解釋器可用。 FORTH虛擬機就是這么簡單,實現起來不需要很長時間!

你甚至可以得到一個 C-to-FORTH 翻譯器,讓學生觀看 FORTH 虛擬機解釋編譯的 C 代碼。

我認為這個答案對你來說很遙遠,所以我將停止在這里寫。 如果您實際上對這個想法感興趣,請在下面發表評論並詢問更多詳細信息,我很樂意分享。 我已經很久沒有寫任何 FORTH 代碼了,但我仍然記得很深,我很樂意更多地談論 FORTH。

編輯:盡管這個答案被否決了,但我還是把它留在這里。 恕我直言,如果模擬簡單易懂,則用於教育目的的模擬更有價值。 FORTH 的基於堆棧的簡單虛擬機非常簡單,但您可以編譯 C 代碼在其上運行。 (在 80 年代甚至有一個 CPU 芯片以 FORTH 指令作為其本機機器代碼。)而且,正如我所說,當我完全是初學者時,我親自學習了 FORTH,它幫助我理解了匯編語言和 C。

這個問題沒有被接受的答案,現在已經問了兩年多了。 可能是 Loïc Février 沒有找到任何合適的 JavaScript 解釋器。 正如我所說,已經有幾個 JavaScript 解釋器用於 FORTH 虛擬機。 因此,這個答案是一個實用的答案。

C 是編譯型語言,而不是解釋型語言,並且具有 JS 完全不支持的指針等特性,因此在 Javascript 中解釋 C 確實沒有意義

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM