JerryScript 和 IoT.js:来自三星的物联网JavaScript
最近三星开源了IoT.js和JerryScript。IoT.js是一个使用JavaScript语言编写的物联网应用平台;JerryScript是一个适用于嵌入式设备的小型JavaScript引擎。
三星创建这两个项目的目的,是为了让JavaScript开发者能够构建物联网应用。物联网设备在CPU性能和内存空间上都有着严重的制约。因此,三星设计了JerryScript引擎,它能够运行在小于64KB内存上,且全部代码能够存储在不足200KB的只读存储(ROM)上。在JerryScript引擎上运行JavaScript代码看上去是这样的:
{
jerry_init (JERRY_FLAG_ENABLE_LOG);
char script [] = "print ('Hello, World!');";
jerry_parse (script, strlen (script));
jerry_run ();
jerry_cleanup ();
}
IoT.js平台使用JerryScript引擎来运行JavaScript代码,使用libuv库来实现异步I/O。这样的结构让开发者能够创建物联网服务,让设备与设备、外界之间交互。IoT.js目前运行在Linux和NuttX(一个实时操作系统),目标设备为树莓派2(Raspberry Pi 2)和意法半导体开发板(ST board),后续计划支持其他微控制器(MCU)和物联网设备。IoT.jsAPI提供了缓冲、控制台、事件、通用输入输出接口(GPIO)、流(stream)、定时器等功能。
下图展示了运行在IoT.js/JerryScript平台上的JavaScript应用内部架构和相同应用在IoT.js和Node.js平台上运行的比较。
我们联系了三星,了解了更多关于这些项目的信息。
InfoQ:运行在只有64KB内存上的JavaScript引擎非常受限,你们是怎么做到这一点的?
三星:针对JavaScript引擎需要考虑许多质量属性。当前,最重要的是性能属性,因为我们希望运行在浏览器中的应用看起来像原生应用。
从物联网的角度,我们只关注内存占用。
JerryScript和当前多级自适应即时编译(JIT)引擎相比,是一个纯粹的解释器。所以它没有保存编译后代码的开销,甚至它的解析器也不保存抽象语法树(AST)。它直接将源码按行解释成字节码。对于数据表现,JerryScript中的对象在大小上做了优化。JerryScript使用压缩的指针、固定大小的字节码块、预分配对象池和数值对象的多种表示等方式同时达到遵守标准和内存优化。我们将持续不断的用各种方式减少内存消耗。你们可以在http://samsung.github.io/jerryscript/internals/查看到JerryScript内部实现细节。
InfoQ:在物联网领域使用JavaScript语言有什么优势?
三星:JavaScript是当今最著名的编程语言之一[1][2][3],大量前端开发者对它非常熟悉。因此使用JavaScript可以方便的扩大物联网开发者社区规模。Android使用Java语言开发就是一个很好的历史事例。
另一方面,JavaScript在嵌入式设备开发中是非常便利的。它支持异步函数回调和异步I/O,这对基于事件驱动的硬件编程是非常有用的。
最后,JavaScript是网页编程中使用最广的语言。将物联网设备和互联网生态系统(web ecosystem)相互配合,对于构建物联网生态系统来说是一个明智的选择。因此,许多互联网标准,如HTTP、JSON、REST已经成为物联网连接标准化的中心,唯一缺少的就是JavaScript。我们认为JavaScript在应用程序和服务互通层上是最重要的一环。
InfoQ:IoT.js提供了哪些功能?
三星:IoT.js的核心是向下兼容Node.js。为了做到这一点,IoT.js遵守CommonJS规范中的模块化编程,并且支持Node.js API中核心功能的子集。针对物联网,我们正在定义嵌入式设备控制和物联网编程的标准模块。截至目前,我们定义了第一个通用输入输出接口(GPIO)访问API的候选规范,并且实现了它的原型。我们认为,为了体现它的真正价值,这些活动应该在物联网社区的共识下完成。这就是我们开源IoT.js的原因。请参阅GitHub上关于这个问题的讨论(https://goo.gl/7V8jNp)。
我们也会提供物联网连接层接口协议实现,如OIC/IoTivity、AllSeen联盟(AllSeen Alliance)等。它们将会以npm模块的方式发布。
查看英文原文:JerryScript & IoT.js: JavaScript for IoT from Samsung
相关连接: