BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース WebAssemblyでホットリローディング、リモートデバッグ、統一的なハードウェアアクセスを実現する

WebAssemblyでホットリローディング、リモートデバッグ、統一的なハードウェアアクセスを実現する

原文(投稿日:2020/06/13)へのリンク

先頃発表されたWARDuinoは、マイクロコントローラをターゲットにしたWebAssemblyの拡張である。ライブコードアップデート、リモートデバッグ、マイクロコントローラのハードウェアモジュールへのアクセスといった機能を加えることにより、開発上の一般的な問題に対処する。WARDuinoの仮想マシンは、一部のベンチマークにおいて、Espruino(一般的なマイクロコントローラ用JavaScriptインタプリタ)の5倍の速度で動作している。

ベルギーのGhent Universityに籍を置くRobbert Gurdeep SinghChristophe Scholliers両氏は論文で、マイクロコントローラ開発における重大な問題点を次のように説明している。

マイクロコントローラ用に正確かつ効率的なプログラムを開発することは、極めて困難で、時間を要する作業です。[...] マイクロコントローラはCなどの低レベルなプログラミング言語を使ってプログラムされていたため、デバッグやメンテナンスが困難でした。[...] マイクロコントローラのプログラミングにとって高レベルのプログラミング言語は、低レベルの言語より桁違いに遅いという問題があったのです。さらに、リモートデバッグのサポートが提供されないことも少なくありません。[...] パフォーマンス上の理由から、周辺機器へのアクセスがプログラミング言語自体に組み込まれることもあるので、自分の使用している周辺機器がサポートされていない言語については、使用が制限されることになります。

マイクロコントローラをプログラム可能な低レベル言語は、一般的に、速度に関しては最高のエクスペリエンスを提供する。しかしながら、速度が一義的な関心事ではない状況も多い。メモリやCPU能力の制限された組み込みデバイスやマイクロコントローラでは、ランタイム実行サイズ、メモリ使用量、レイテンシなどが主要な関心事になることもあり得るのだ。低レベル言語はプログラムとマイクロコントローラのハードウェアとを強く結び付けるため、ひとつのマイクロコントローラから他へプログラムを移植する作業に困難が伴う場合もある。氏らはさらに、チップへのプログラムのアップロード(フラッシュ更新)は遅く退屈な作業であることが多い上に、プログラムの些細な修正にもプログラム全体を再アップロードが必要であり、場合によっては丸々1分間を要することもある、という点にも言及している。

WARDunioは、WebAssemblyを活用して、高レベル言語と低レベル言語の中間地点を提供する、メモリセーフな仮想マシンである。高レベル言語では、RustGoC、C++、Luaなど既存の、さらには今後登場するであろう広範なランタイムにおいて、WebAssemblyをターゲットにすることが可能である。WARDuinoは低レベル言語と同じパフォーマンスプロファイルを提供する訳ではないが、Wasmの提供する既存の機能を利用して、ESP32チップが提供する下位機能を公開するモジュールを定義することにより、マイクロコントローラが変更された場合でもプログラムの書き直しを不要としている。さらにWARDuinoは、Wasmの機能を拡張して、安全なライブコードアップデートとリモートデバッグ機能を提供する。

リモートデバッグは、WARDunio仮想マシンがインタラプトを通じてデバッグメッセージ(pauseplaystepdumpbreak+idbreak-id)を受信することによって実現されている。最初の3つのメッセージは、標準的なデバッグ機能を複製したものだ。. dumpメッセージは、インストラクションポインタやスタック、変数など、実行中の仮想マシンの状態をダンプする。残る2つのメッセージは、ブレークポイントの設定と削除を行う。

ライブコードアップデートもuploadupdatefupdatelメッセージを通じて処理される。これらのメッセージでは、ペイロードとしてデータを送信することが可能で、添付されたデータはそれぞれ、WebAssembly状態全体の更新(新たなコードによるリスタート)、関数のライブアップデート、ローカルのアップデートに使用される。これにより、ライブリロードやホットモジュールリプレースメントと同等の機能が実現されている。

WARDuinoは、統一化されたインターフェースで広範なデバイスに対応するために、3つの拡張モジュールを定義している。大部分のマイクロコントローラにはピン(pin)があり、それぞれが複数のモードを持ち、読み取り、および/または書き込みに使用することができる。APIはそのため、3つの機能から構成されている。すなわち、pinModedigitalWritedigitalReadである。その他のマイクロコントローラには、パルス幅変調(pulse width modulation, PWM)モジュールによるアナログ出力(音声など)のシミュレートが可能なものもある。WARDuinoのsetPinFrequency APIは、このケースに対応するためのものだ。最後に、シリアル周辺インターフェースを通じて通信するハードウェア(センサやSDカードなど)用には、8ビットおよび16ビット転送を管理する9つの関数が追加されている。

論文にはWARDuinoのパフォーマンスをネイティブなC、WebAssemblyにコンパイルされたC、Espruinoでインタプリタ動作するJavaScriptと比較したベンチマークが掲載されている。研究者らは、次のように結論付けている。

[私たちのマイクロベンチマークでは]WARDuinoは一定して、Espruinoの5倍のパフォーマンスを示しています。[...] Espruinoと比較した場合のパフォーマンスは良好なのですが、C言語から期待する実行スピードとはまだ大きな開きがあります。今後の開発では、JITコンパイラを実装することでこのギャップを狭めていきたいと思っています。

Wasm3のようにパフォーマンスや起動時間を重視したWasmインタプリタもあるが、開発者が重要な問題として報告しているWasmのデバッグ機能を提供するものは存在しない。

WARDuinoの詳細なアーキテクチャや構成要素、ベンチマークの結果、先行技術を含む全論文が公開されている。

この記事に星をつける

おすすめ度
スタイル

BT