是否有用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中才能在客户端运行。
答案 0 :(得分:5)
答案 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 没有任何意义