Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用javascript编写的C解释器_Javascript_C_Gwt_Interpreter - Fatal编程技术网

用javascript编写的C解释器

用javascript编写的C解释器,javascript,c,gwt,interpreter,Javascript,C,Gwt,Interpreter,有没有用javascript或java编写的C解释器 我不需要一个完整的解释器,但我需要能够一步一步地执行程序,能够看到变量的值,堆栈…所有这些都在一个web界面中 这个想法是通过向C初学者展示程序的逐步执行来帮助他们。 我们正在使用GWT构建接口,因此如果Java中存在某种东西,我们应该能够使用它 我可以修改它以满足我的需要,但如果我可以避免编写解析器/抽象语法树遍历器/堆栈操作。。。那太好了 编辑: 很明显,我不想模拟完整的C语言,因为有些程序可能非常棘手 我指的是一个基本的操作,比如:表

有没有用javascript或java编写的C解释器

我不需要一个完整的解释器,但我需要能够一步一步地执行程序,能够看到变量的值,堆栈…所有这些都在一个web界面中

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

我可以修改它以满足我的需要,但如果我可以避免编写解析器/抽象语法树遍历器/堆栈操作。。。那太好了


编辑:

很明显,我不想模拟完整的C语言,因为有些程序可能非常棘手

我指的是一个基本的操作,比如:表达式求值、假装、函数调用

我要模拟的C将包含:变量,函数,数组,指针,数学函数。 无转到、字符串函数、ctypes.h、setjmp.h。。。(至少目前如此)

这是一个原型:

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


我们在远程服务器上部署了一个C编译器,以便检查代码是否正确(并且没有任何未定义的行为)。解析/AST构造也可以远程完成(因此任何语言都可以),但是AST遍历需要使用javascript才能在客户端运行。

有一个可用的,您可以使用它在Java中生成C解析器,也可能是JavaScript。

有一个em scripten,它可以将LLVM语言转换为JS,稍加修改,您就可以生成一个C解释程序。

我不知道有任何C解释程序是用JavaScript编写的,但这里讨论了可用的C解释程序:

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

我做了一些谷歌搜索,找到了Emscripten,它可以直接将C代码翻译成JavaScript!也许你可以做点什么:

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


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

我知道您指定了C代码,但是您可能需要考虑一个更简单的语言的JavaScript仿真。特别是,请考虑。

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

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

JavaScript中已经有几个FORTH解释器可用。第四个虚拟机非常简单,不需要很长时间就可以实现

您甚至可以获得一个C-to-FORTH转换器,让学生观看第四台虚拟机解释编译的C代码

我认为这个答案对你来说是一个远景,所以我将不再在这里写了。如果你真的对这个想法感兴趣,请在下面评论并询问更多细节,我很乐意与你分享。我已经很久没有写过任何FORTH代码了,但我仍然深情地记得它,我很乐意更多地谈论FORTH

编辑:尽管这个答案被否决为负数,我还是要把它留在这里。如果模拟简单易懂,那么出于教育目的的模拟就更有价值。FORTH的基于堆栈的简单虚拟机非常简单,但是您可以编译C代码在其上运行。(在80年代,甚至有一种CPU芯片,其本机代码为FORTH指令。)而且,正如我所说,我个人在完全初学者的时候学习了FORTH,它帮助我理解汇编语言和C

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

< P>在JavaScript中提供了一个C++解释器,虽然有一些限制。

因此,示例程序可能如下所示:

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);
var JSCPP=require('JSCPP');
var-launcher=JSCPP.launcher;

var code='int main(){int a;cin>>a;coutC是一种编译语言,而不是解释语言,并且具有JS完全不支持的指针等特性,因此在Javascript中解释C实际上没有意义

您可以看看它,它也运行某种形式的Linux,并且有一个C编译器(但可能有点超出范围)。@Felix:这很有趣,但与OP想要的有点不同。@Loïc:c并不是真正按“步骤”执行,或者至少不是必需的。最接近的是序列点。我之所以提到这一点,是因为学习c就像在“高级asm”中执行一样源代码中的步骤是造成C开头误解的主要原因。@Felix:这大约有50个抽象级别。JS代码模拟了一些x86硬件,linux内核在其上运行,并且运行各种