是的,有一个重复的问题,但它是5年前问过的,很久没有更新了。
2020年,随着WebAssembly的发展,有没有办法在浏览器中本地编译和运行一个简单的C程序?
有一个名为WasmFiddle的平台,它可以在浏览器中将C编译为wasm,但它缺乏标准库的支持,例如stdio.h。我认为我们可以在 js 中实现标准库,并可能将其导出到 wasm?但这需要大量的工作。
我最初的目标是构建一个基于 Web 的 IDE,让学生学习 C 编程,而无需在服务器上花费大量资金进行远程运行。因此,只需要像stdio.h,math.h,string.h这样的库。
更新:这似乎是libc对wasm的一个很好的实现。
不需要高性能,因此基于 wasm 的解决方案和也许在 JS 中实现的运行 c 的 VM 都是很好的解决方案。
Emscripten和WASM是这里两个流行的解决方案。
不要指望有很好的性能,但你应该能够将其与一些JavaScript,CSS和HTML链接起来,用于代码编辑和控制台视图。
如果你可以运行服务器,那么你可以使用这个Jupyter Notebook内核:https://github.com/jupyter-xeus/xeus-cling
下面是 WASM 中没有服务器的示例:https://github.com/tbfleming/cib
为了让你对emscripten和其他相关技术可以做什么感到震惊,请查看Fabrice Bellard在Tiny C Compiler,Tiny Emu和JsLinux上的工作。
JsLinux,基本上用JavaScript运行虚拟机,Bellard有运行Linux和Windows2000的例子
。你可以使用核,把所有东西都放在一个虚拟机中,当二进制文件在某些输入代码上运行并编译一些二进制文件作为输出时,然后再次在虚拟机中运行。所有客户端,由于虚拟化而有所下降。
示例:https://twitter.com/alexpignotti/status/1261357985617469442?s=20(我的一位同事正在研究这个问题(
您有 2 个选项,要么获得某种在浏览器中运行的 VM,该 VM 能够运行某种 C 可以编译的架构,要么使用 EMScripten 编译为 WASM。
WASM 显然是更好的选择,因为它在所有(体面的(浏览器中都得到原生支持