SamsungがJavaScriptで書かれたIoTアプリケーションのためのプラットフォーム「IoT.js」と、小さな組み込みデバイス向けのJavaScriptエンジン「JerryScript」をオープンソース化した。
Samsungによるこの2つのプロジェクトは、JavaScript開発者がIoT(Internet of Things)のためのアプリケーションを構築可能にすることを目的としている。IoTデバイスには、CPU性能とメモリフットプリントの点で厳しい制約がある。そこでSamsungは、64KB以下のRAMで動作し、コード全体で200KBのROMに収まるJerryScriptエンジンを設計した。JerryScript上でJavaScriptコードを動かすと次のようになる。
{
jerry_init (JERRY_FLAG_ENABLE_LOG);
char script [] = "print ('Hello, World!');";
jerry_parse (script, strlen (script));
jerry_run ();
jerry_cleanup ();
}
IoT.jsプラットフォームでは、JavaScriptコードのためにJerryScriptを、非同期I/Oのためにlibuvを使って、相互あるいは外部と通信するIoTサービスを作ることができる。現在、IoT.jsはLinuxとNuttX – リアルタイムOS – 上で動作し、Raspberry Pi 2とSTボードをターゲットにしている。今後は他のMCUやIoTデバイスに対応する計画もある。APIとしては、バッファ、コンソール、イベント、GPIO、ストリーム、タイマーなどの機能を提供する。
次の図は、IoT.js/JerryScriptで動作するJavaScriptアプリケーションの内部アーキテクチャと、IoT.jsとNode.jsで同じアプリを動かした場合の比較を示している。
これらのプロジェクトについて詳しく知るため、私たちはSamsungにコンタクトした。
InfoQ: JavaScriptエンジンを64KBのRAMで動かすのは非常に厳しいように思います。どうやって実現したのですか?
Samsung: JavaScriptエンジンには、考慮すべき品質属性がいろいろあります。現在、最も重要なのは性能です。ブラウザで動かすWebアプリケーションを、ネイティブアプリケーションのように見せたいためです。
私たちはIoTの観点から、メモリフットプリントにのみ注力しました。
現在のマルチステージ適応型JITエンジンに対し、JerryScriptは純粋なインタープリタです。そのため、コンパイルしたコードを格納するオーバーヘッドはありません。パーサーもASTを格納しません。ソースコードから直接1行ずつバイトコードを生成します。データ表現に関して、JerryScriptのオブジェクトはサイズに最適化されています。JerryScriptには、圧縮ポインタ、固定サイズのバイトコードブロック、プリアロケートされたオブジェクトプール、標準への準拠とメモリ最適化の両方を実現するためのNumberオブジェクトの複数表現が使われています。私たちはこれからも様々な方法で、メモリフットプリントを削減し続けます。JerryScriptの内部詳細については、http://samsung.github.io/jerryscript/internals/をみてください。
InfoQ: IoTにJavaScriptを使うメリットは何ですか?
Samsung: 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が最も重要だと考えています。
InfoQ: IoT.jsはどんな機能を提供しているのですか?
Samsung: IoT.jsのコアはNode.jsと後方互換性があります。これを実現するため、IoT.jsはモジュラープログラミングに関するCommonJS仕様に従い、Node.jsのコアAPIのサブセットをサポートしています。私たちはIoTのために、組み込みデバイス制御とIoTプログラミングに特化した標準モジュールを定義しているところです。今のところ、GPIOアクセスAPIの最初の仕様候補を定義し、そのプロトタイプを実装しました。本当に価値のあるものにするため、こうしたアクティビティはIoTコミュニティとの同意のもと行われるべきだと考えています。そこで私たちはIoT.jsをオープンソース化しました。GitHubにある議論を参照してください (https://goo.gl/7V8jNp)。
私たちはOIC/IoTivity、AllSeen Allianceなど、IoTコネクティビティ層へのインターフェイスも提供するつもりです。それはモジュールのような*.npmになるでしょう。