SamsungによるIoT向けJavaScriptSamsungがJavaScriptで書かれたIoTアプリケーションのためのプラットフォーム「IoT.js」と、小さな組み込みデバイス向けのJavaScriptエンジン「JerryScript」をオープンソース化した。Things)のためのアプリケーションを構築可能にすることを目的としている。IoTデバイスには、CPU性能とメモリフットプリントの点で厳しい制約がある。そこでSamsungは、64KB以下のRAMで動作し、コード全体で200KBのROMに収まるJerryScriptエンジンを設計した。JerryScript上でJavaScriptコードを動かすと次のようになる。();}IoT.jsプラットフォームでは、JavaScriptコードのためにJerryScriptを、非同期I/Oのためにlibuvを使って、相互あるいは外部と通信するIoTサービスを作ることができる。2とSTボードをターゲットにしている。今後は他のMCUやIoTデバイスに対応する計画もある。APIとしては、バッファ、コンソール、イベント、GPIO、ストリーム、タイマーなどの機能を提供する。次の図は、IoT.js/JerryScriptで動作するJavaScriptアプリケーションの内部アーキテクチャと、IoT.jsとNode.jsで同じアプリを動かした場合の比較を示している。これらのプロジェクトについて詳しく知るため、私たちはSamsungにコンタクトした。JavaScriptエンジンを64KBのRAMで動かすのは非常に厳しいように思います。JavaScriptエンジンには、考慮すべき品質属性がいろいろあります。現在、最も重要なのは性能です。ブラウザで動かすWebアプリケーションを、ネイティブアプリケーションのように見せたいためです。私たちはIoTの観点から、メモリフットプリントにのみ注力しました。現在のマルチステージ適応型JITエンジンに対し、JerryScriptは純粋なインタープリタです。そのため、コンパイルしたコードを格納するオーバーヘッドはありません。パーサーもASTを格納しません。ソースコードから直接1行ずつバイトコードを生成します。データ表現に関して、JerryScriptのオブジェクトはサイズに最適化されています。JerryScriptには、圧縮ポインタ、固定サイズのバイトコードブロック、プリアロケートされたオブジェクトプール、標準への準拠とメモリ最適化の両方を実現するためのNumberオブジェクトの複数表現が使われています。私たちはこれからも様々な方法で、メモリフットプリントを削減し続けます。JerryScriptの内部詳細については、http://samsung.github.io/jerryscript/internals/をみてください。JavaScriptは現在世界で最も有名なプログラミング言語です[1][2][3]。JavaScriptに精通したWeb開発者がたくさんいます。そのためIoTにJavaScriptを使うことで、IoTの開発者コミュニティを簡単に広げることができます。AndroidのJavaが良い例でしょう。JavaScriptは組み込みデバイスプログラミングに適しています。非同期関数呼び出しとI/Oをサポートしており、イベント駆動ハードウェアプログラミングに便利です。最後に、JavaScriptはWebで最も広く使われている言語です。IoTデバイスとWebエコシステムを関連付けることは、IoTエコシステムを構築するのに賢い選択です。これにより、HTTP、JSON、RESTといった多数のWeb標準が、IoTコネクティビティ標準の中心になります。唯一欠けているもの、それがJavaScriptです。コネクティビティの上のアプリケーションおよびサービスインターオペラビリティ層にとって、私たちはJavaScriptが最も重要だと考えています。IoT.jsのコアはNode.jsと後方互換性があります。これを実現するため、IoT.jsはモジュラープログラミングに関するCommonJS仕様に従い、Node.jsのコアAPIのサブセットをサポートしています。私たちはIoTのために、組み込みデバイス制御とIoTプログラミングに特化した標準モジュールを定義しているところです。今のところ、GPIOアクセスAPIの最初の仕様候補を定義し、そのプロトタイプを実装しました。本当に価値のあるものにするため、こうしたアクティビティはIoTコミュニティとの同意のもと行われるべきだと考えています。そこで私たちはIoT.jsをオープンソース化しました。(https://goo.gl/7V8jNp)。Allianceなど、IoTコネクティビティ層へのインターフェイスも提供するつもりです。それはモジュールのような*.npmになるでしょう。