用javascript编写的C解释器

时间:2011-05-26 16:51:23

标签: javascript c gwt interpreter

是否有用javascript或java编写的C解释器?

我不需要一个完整的解释器,但我需要能够一步一步地执行程序,并能够看到变量的值,堆栈......所有这些都在Web界面中。< / p>

这个想法是通过向他们展示程序的逐步执行来帮助C初学者。 我们正在使用GWT来构建接口,因此如果Java中存在某些内容,我们应该可以使用它。

我可以修改它以满足我的需要,但如果我可以避免编写解析器/抽象语法树walker / stack操作......这将是很棒的。

<小时/> 修改:

要明确我不想模拟完整的C,因为某些程序可能非常棘手。

我指的是一个基本操作,例如:表达式评估,矫揉造作,函数调用。

我想要模拟的C将包含:变量,for,while,函数,数组,指针,数学函数。 没有goto,字符串函数,ctypes.h,setjmp.h ...(至少目前为止)。

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

在这个例子中,我们已经手动将C代码转换为javascript表示但它有限(不处理a == 2 || a = 1等表达式)并且仅限于手动转换的程序。

我们在远程服务器上处理C编译器,因此我们可以检查代码是否正确(并且没有任何未定义的行为)。解析/ AST构造也可以远程完成(所以任何语言),但AST行走需要在javascript中才能在客户端运行。

6 个答案:

答案 0 :(得分:5)

C grammarantlr可用于在Java中生成C解析器,也可能用于生成JavaScript。

答案 1 :(得分:4)

有一个em-scripten将LLVM语言转换为JS有点黑客攻击,你可以生成一个C interperter。

答案 2 :(得分:1)

我不知道用JavaScript编写的任何C语言解释器,但这里是对可用的C语言解释器的讨论:

Is there an interpreter for C?

您可能会更好地寻找在JavaScript之上运行的任何类型的虚拟机,然后查看是否可以找到为VM发出正确的机器代码的C编译器。可能有人似乎是LLVM;如果你能找到一个可以运行LLVM的JavaScript VM,那么你将会处于良好的状态。

我进行了一些Google搜索并找到了Emscripten,它直接将C代码转换为JavaScript!也许你可以用这个做点什么:

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

也许您可以修改Emscripten以在每个编译的C行之后发出“序列点”,然后您可以使您的模拟环境从序列点到序列点单步执行。

我相信Emscripten正在实施LLVM,所以它实际上可能有虚拟寄存器;如果是这样,它可能是您理想的目的。

答案 3 :(得分:1)

我知道您指定了C代码,但您可能需要考虑使用更简单语言的JavaScript模拟。特别是,请考虑FORTH。

FORTH在一个非常简单的虚拟机上运行。在FORTH中有两个堆栈,一个数据堆栈和一个控制流堆栈(称为“返回”堆栈);加上一些全球记忆。最初FORTH是一种16位语言,但现在有很多32位FORTH实现。

因为FORTH代码有点“靠近机器”,所以当你看到它工作时很容易理解它是如何工作的。在我学习C之前,我学会了FORTH,并且发现它是一种宝贵的学习经历。

JavaScript中已有几种FORTH解释器。 FORTH虚拟机非常简单,实现它不需要很长时间!

您甚至可以获得一个C-to-FORTH翻译器,让学生观看FORTH虚拟机解释已编译的C代码。

我认为这个答案对你来说很有用,所以我会在这里停止写作。如果您对这个想法感兴趣,请在下面发表评论并询问更多详情,我将很乐意与您分享。自从我写了任何FORTH代码以来已经有很长一段时间了,但我仍然非常怀念它,我很乐意更多地谈论FORTH。

编辑:尽管这个答案被低估了一个负面评分,但我将把它留在这里。用于教育目的的模拟是恕我直言,如果模拟简单易懂,则更有价值。 FORTH的简单的基于堆栈的虚拟机非常简单,但您可以编译C代码以在其上运行。 (在80年代甚至有一个CPU芯片制作了FORTH指令作为其原生机器代码。)而且,正如我所说,当我是一个完整的初学者时,我亲自学习了FORTH,它帮助我理解汇编语言和C. / p>

这个问题没有被接受的答案,现在问了两年多。可能是LoïcFévrier找不到任何合适的JavaScript解释器。正如我所说,FORTH虚拟机已经存在多个JavaScript解释器。因此,这个答案是实用的。

答案 4 :(得分:1)

felixh&#39; s JSCPP project在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解释器而没有其他问题。

答案 5 :(得分:0)

C 是编译型语言,不是解释型语言,并且具有 JS 完全不支持的指针等特性,因此在 Javascript 中解释 C 没有任何意义