vlambda博客
学习文章列表

mJS:适用于C/C++的嵌入式JavaScript引擎

点击蓝字
默默关注

整理 | 叶子


一、软件介绍


mJS 是一个用于 C/C++ 的嵌入式 JavaScript 引擎,专为资源有限的微控制器而设计。其主要设计目标是:占用资源小、简单的 C/C++ 互操作性。

mJS 实现了 ES6 的严格子集:
  • 任何有效的 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));

函数的参数应当很简单:只支持intdoublechar *void * 。用途char *为NULL结尾的C字符串,void *其他任何指针。为了导入更复杂的函数(例如,使用结构作为参数的函数),请编写包装器。




往期推荐


扫码关注最新动态

我就知道你“在看”