mJS:适用于C/C++的嵌入式JavaScript引擎
整理 | 叶子
一、软件介绍
mJS 是一个用于 C/C++ 的嵌入式 JavaScript 引擎,专为资源有限的微控制器而设计。其主要设计目标是:占用资源小、简单的 C/C++ 互操作性。
-
任何有效的 mJS 代码都是有效的 ES6 代码。 -
任何有效的 ES6 代码不一定是有效的 mJS 代码。
在 32 位 ARM mJS 引擎上,需要大约 50k 的闪存和少于 1k 的 RAM。
此外,mJS 是 Mongoose OS 的一部分,可在其中为 IoT 设备编写脚本。
https://github.com/cesanta/mjs
三、限制条件
-
没有标准库。没有字符串,数字,RegExp,日期,函数等。 -
JSON.parse()
和
JSON.stringify()
可用。 -
没有闭包,只有词法作用域(即允许嵌套函数)。 -
没有例外情况。 -
没有 new
。为了使用自定义原型创建对象,请使用Object.create()。
-
仅限严格模式。 -
不能 var
,只有let
。 -
不能 for..of
,=>,
析构函数,生成器,代理,承诺。 -
没有getter,setter, valueOf
原型,类,模板字符串。 -
不能 ==
或!=
,仅可以===
和!==
。 -
MJS字符串是字节的字符串,而不是Unicode字符串: 'ы'.length === 2
,'ы'[0] === '\xd1'
,'ы'[1] === '\x8b'
。mJS字符串可以代表任何二进制数据块。
四、C / C ++互操作性
mJS不需要粘合代码。mJS的外部函数接口(FFI)允许用户使用任意签名调用现有的C函数。目前,mJS提供了FFI trampoline的简单实现,最多支持6个32位参数,或最多支持2个64位参数:
let floor = ffi('double floor(double)');
print(floor(1.23456));
函数的参数应当很简单:只支持int
,double
,char *
,void *
。用途char *
为NULL结尾的C字符串,void *
其他任何指针。为了导入更复杂的函数(例如,使用结构作为参数的函数),请编写包装器。
扫码关注最新动态