用javascript编写的C解释器

问题描述

| 是否有任何用javascript或Java编写的C解释器? 我不需要完整的解释器,但我需要能够逐步执行程序并能够查看变量值,堆栈...在Web界面中的所有内容。 这个想法是通过向C初学者展示逐步执行程序的方法来帮助他们。 我们正在使用GWT构建接口,因此,如果Java中存在某些内容,我们应该可以使用它。 我可以对其进行修改以满足自己的需要,但是如果我可以避免编写解析器/抽象语法树遍历器/堆栈操作...那将很棒。 编辑: 明确地说,我不想模拟完整的C语言,因为某些程序可能确实很棘手。 我所说的步骤是指基本操作,例如:表达式求值,情感,函数调用。 我要模拟的C将包含:用于函数,数组,指针,数学函数的变量。 没有goto,字符串函数,ctypes.h,setjmp.h ...(至少目前如此)。 这是一个原型:http://www.di.ens.fr/~fevrier/war/simu.html 在此示例中,我们将C代码手动转换为javascript表示形式,但是它是有限的(不处理诸如“ 0”之类的表达式),并且仅限于手动转换的程序。 我们在远程服务器上使用了C编译器,因此我们可以检查代码是否正确(并且没有任何未定义的行为)。解析/ AST构造也可以远程完成(因此可以使用任何语言),但是AST walk必须使用JavaScript才能在客户端运行。     

解决方法

有一个适用于antlr的C语法,可用于生成Java和JavaScript的C解析器。     ,有一个em-scripten,可以将LLVM语言转换为JS,对它稍加修改,您便可以生成C语言插入器。     ,我不知道任何用JavaScript编写的C解释器,但是这里讨论了可用的C解释器: 有C的翻译器吗? 您可能会更好地寻找在JavaScript之上运行的任何类型的虚拟机,然后查看是否可以找到为VM发出正确的机器代码的C编译器。 LLVM可能就是一个。如果您找到可以运行LLVM的JavaScript VM,那么您的状态将会很好。 我做了几次Google搜索,发现了Emscripten,它可以将C代码直接转换为JavaScript!也许您可以这样做: https://github.com/kripken/emscripten/wiki 也许您可以修改Emscripten以在C的每行编译之后发出一个“序列点”,然后可以使仿真环境从序列点到序列点成为单步。 我相信Emscripten正在实现LLVM,因此它实际上可能具有虚拟寄存器。如果是这样,它可能是您理想的选择。     ,我知道您指定了C代码,但是您可能需要考虑使用JavaScript来模拟一种更简单的语言。特别是,请考虑FORTH。 FORTH在极其简单的虚拟机上运行。在FORTH中,有两个堆栈,一个数据堆栈和一个控制流堆栈(称为“ return \”堆栈)。加上一些全局内存最初,FORTH是一种16位语言,但是现在有很多32位FORTH实现。 因为FORTH代码有点“接近机器”,所以当您看到它起作用时,很容易理解它们的工作原理。我在学习C之前就学习了FORTH,并且发现它是一种宝贵的学习经验。 JavaScript中已经有几个FORTH解释器。 FORTH虚拟机非常简单,实现它并不需要很长时间! 您甚至还可以使用C到FORTH转换器,让学生观看FORTH虚拟机解释编译的C代码。 我认为这个答案对您来说是个大难题,所以我将在这里停止写作。如果您实际上对此想法感兴趣,请在下面评论并询问更多详细信息,我将很乐意与您分享。自编写任何FORTH代码以来已经有很长时间了,但我仍然怀念它,并且很乐意谈论有关FORTH的更多信息。 编辑:尽管这个答案被否决了负分数,我将把它留在这里。如果模拟简单易懂,则用于教育目的的模拟更有价值。用于FORTH的简单的基于堆栈的虚拟机非常简单,但是您可以编译C代码以在其上运行。 (在80年代,甚至有一块CPU芯片以FORTH指令作为其本机代码。)而且,正如我所说,我是一个完整的初学者,亲自学习过FORTH,它有助于我理解汇编语言和C。 在被问到两年后,这个问题还没有被接受的答案。 LoïcFévrier可能找不到合适的JavaScript解释器。如我所说,FORTH虚拟机已经存在多个JavaScript解释器。因此,这个答案是一个实际的答案。     ,felixh的JSCPP项目提供了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解释器,而不会出现其他问题。