将 JavaScript 代码转换为 C 代码。

65
有没有办法将C代码转换成JavaScript,并从JavaScript转换回C?我发现了一个V8 juice可以从C++生成JavaScript-side类,但只能实现单向转换(C++到JavaScript)。我不是在寻找软件。

2
我现在正在运行node.js,在我的Linux服务器上执行JavaScript代码,因此我希望让其他人通过编写C代码来添加插件。这就是为什么我需要像v8 juice这样的库或引擎,可以自动将C代码转换为JavaScript。 - Wassim AZIRAR
这里有一个Windows/.NET带来的JScript编译器,它叫做jsc.exe。但它不能编译所有JavaScript。如果已安装,它可能位于c:\Windows\winsxs或C:\Windows\Microsoft.NET\Framework<Version_of_dot_net>中。 如果你有一个简单的JavaScript算法而没有花哨的东西,它可能会起作用。 - Laokoon
这对我来说毫无意义。 - Rolf
1
只需要使用 Haxe,它是一种更好但类似的语言,可以编译成所有虚构目标。从Javascript到C,可运行于设备、服务器、浏览器,甚至嵌入式和空中软件。 - Ska
到目前为止,我一直在手动将JavaScript翻译成C++,即使有部分解析器也会有所帮助,使翻译变得更容易,但实际上我并没有看到任何值得一提的解析器,所以我想你还是需要手动完成它。 - serup
@Ska,你有Haxe在嵌入式和空中硬件上运行的示例吗? - nurettin
6个回答

48

有几个编译器可以将JavaScript和TypeScript翻译成C语言:

  • QuickJS使用一个内嵌的JavaScript引擎将JavaScript编译成C语言。与这里列出的其他编译器不同,此实现相当完整。
  • ts2c将JavaScript和TypeScript源代码翻译成C语言,但它只支持JavaScript的一小部分特性。
  • NectarJS将JavaScript的子集翻译成C或WebAssembly。

类似地,可能可以使用AssemblyScript将某些静态类型的JavaScript程序编译为WebAssembly,然后再使用wasm2c将其反汇编为C语言。

或者,也可以将JavaScript编译成另一种编译为C语言的语言

  • 将JavaScript编译成Python,然后使用CythonRPython将Python编译为C语言。由于这些编译器与Python的子集兼容,因此应该可以将JavaScript的子集翻译成C语言。
  • 使用Castl将JavaScript编译成Lua,然后使用lua2c将Lua代码翻译成C语言。

2
但是我们想要完整的集合!虽然这很有趣。 - trusktr
其他引擎像Duktape这样的引擎也可以像QuickJS一样用于这个吗? - undefined

47
非常非常棘手---Javascript是一种高度动态的语言,在运行时几乎可以更改一切:变量、函数、类型等。因此,它与C语言非常不匹配。这还没有考虑到eval(),它允许您在字符串中构造任意大小的Javascript并运行它。
任何Javascript翻译器都必须能够处理这些问题,这意味着它必须在运行时将Javascript转换为C --- 这使它成为JIT,而你已经在使用。
您可能希望考虑编写Javascript的C绑定。这些将允许您的Javascript代码调用C代码,反之亦然。这将允许人们使用C编写插件,并将它们编译为.so共享库,现在您可以从Javascript代码中加载和运行它们。这意味着您不需要翻译任何内容。
很遗憾Javascript不是我的领域,我无法推荐任何特定的机制 --- 但我会非常惊讶如果V8Juice,您已经找到的东西,不能让你做到这一点。

9
然而,计算机程序是确定性的,因此在理论上可以将所有内容编译回C语言,因为JavaScript解释所使用的所有机制已经存在于C语言中。有人需要花时间来制作这个工具。谁愿意自愿?x} - trusktr
1
这是可能的,而且非常容易。你所要做的就是把 PHP 作为 C 的预处理器,而不是现在使用的方式(如果你想要生成的代码可读性好,#ifdef 就不够用了,你需要像泛型映射这样的结构来进行转换)。之后,你只需在“编译时”代码和“运行时”代码之间创建一个隔离墙,然后通过 json 跨 js 和 c 进行数据交换是微不足道的,并让 c 对 javascript 进行内部表示的评估,但要实现这一点并拥有美观的代码,你需要一个更强大的 C 预处理器。 - Dmytro
很遗憾,目前在C语言中没有“好的方式”来使用地图,所有的方法都很丑陋、混乱和容易出错,而JavaScript几乎完全依赖于地图。你可以在C++中实现,但此时你可能会考虑直接嵌入V8,因为它是用C++编写的,比你做得更好,但不会像C语言那样具有“绝对自由未混淆抽象和gdb友好性”。通过更强大的预处理器,C语言将轻松地连接到任何支持运行时泛型的上层语言(通过对象,而在C语言中,您需要发明一个对象来存储void指针的元数据)。 - Dmytro
我强调预处理器,因为将任何东西翻译成C的整个目的是将您的抽象转化为自由且易于使用gdb的抽象。也就是说,您可以对数据的存储位置进行细粒度控制,在任何时刻都可以了解其存储方式,并且完全没有混淆,每条指令的调试性能非常好。这是完全可能的,但所有尝试都没有从C到JavaScript建立起黄金桥梁,如果我们能够做到,那么C++就不存在了,因为C将成为在任何编程级别上使用的最佳语言。不幸的是,C需要新的玩具。 - Dmytro

9

8

为什么要转换,而不是简单地嵌入?

https://code.google.com/p/v8/ "V8可以独立运行,也可以嵌入到任何C++应用程序中。"

将其嵌入到C++应用程序中允许JavaScript访问C++应用程序具有访问权限的任何系统,从而消除了首先进行转换的需要。出于安全原因,我会在某种程度上限制它所能访问的内容。显然,Web浏览器是JavaScript被嵌入C++应用程序中最突出的形式。正如名称所暗示的那样,JavaScript是一种脚本语言,不像C代码那样旨在编译成汇编/机器代码。


10
在微控制器上如何?我的目标是将一些数学算法从 JavaScript 自动转换成 C++,这样我就不需要手动移植了。 - dansch
2
为什么不使用三星的JerryScript?http://jerryscript.net/ - Piyush Katariya

5

很遗憾,qjsc 不是一个 JS 到 C 的转换器;它只是为 Bellard 解释器输出字节码作为 C 数组。我相信 OP(就像我一样)正在寻找能够尽可能地输出惯用的 C 代码的工具。ts2c 在我尝试的每个输入上都会崩溃。我还在继续寻找。 - Graham Toal

1
C语言可以做很多JavaScript或V8引擎无法做到的事情,特别是像内存管理、直接内存访问、中断、汇编代码和线程管理等系统程序。因此,除非它是没有一些系统代码的非常简单的代码,否则不可能将C转换为JavaScript。使用NodeJS(而不是V8 JavaScript)以及系统包装器代码可以执行一些系统级功能。再次强调,这是转换的复杂部分。即使我们能够转换这个简单的代码,C和转换后的JavaScript的执行方式也有所不同,因为它基于V8引擎。
将JavaScript转换为C是可能的。因为C可以虚拟处理任何执行的东西,包括解释器的东西。

1
嘿!回到1990年代吧!现在没有人再使用C语言中的中断了!(除了像我这样的操作系统开发狂热者!) - Kamila Szewczyk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接