qiita.com Akerun Advent Calendar 11日目の記事は@KoheiAkitaが担当します。
今回は、スクリプト言語を馬鹿にしていた組み込みエンジニアが、スクリプト言語が組み込み開発にもどれだけ向いているかを力説します。
前回での私の記事の中でご紹介しましたが、私が現在組み込みの開発に用いている言語はNodejsです。私の今までの開発の中で、スクリプトの存在意義はせいぜいちょっとしたバッチ処理やコマンドを用いたコンバータ程度でした。その頃は、スクリプトの種類も少なく、メジャーなものとしてはWindows MS-Dosを始め、Linux shell、PHP、Perl、Python、Javascriptくらいでした。 Javascriptはコンパイル言語、その他は全てインタプリタ言語で使っていた当時のJavascriptもお世辞にも速いとは言えないレベルでした。 私の中では、スクリプト言語は遅い、書きにくい、分かりにくいとあまりいい印象が無い言語の部類でした。
Photosynthに入社し、任されたAkerun Remote開発でNodejsを扱うようになり、しばらく扱ってみて思ったのが、
Nodejsって速い!
NodejsはGoogle Chromeで使われているJavascript v8エンジンを基にした言語であり、JITコンパイラ形式で最終的にはネイティブコードに変換されているので(部分的になる場合もありますが)、動作が速いわけです。
1. スクリプト言語って遅い?
幾つかのWebサイトで各言語の動作速度比較を行っているものがありました。そのうちの一つを紹介します。
ループ、配列操作、単純計算処理等、基本的な処理での比較です。もちろん、各言語ともに目的とする処理、得意とする処理があるため、一概には言えないところもありますが、一般的な処理での言語としての速度はスクリプト言語の中では圧倒的にNodejsが速いようです。 事実、私が実際に業務でhttp通信、ファイルI/O、BLE通信の処理を組み込んだアプリケーションを作成していますが、全くもたつきを感じません。鍵を預かる製品として、コンマ何秒ですら速く動作させたい立場としては、合格点の動作ができる言語と言えるのではないでしょうか。
2. スクリプト言語って大したことできないのでは?
Javascriptの特徴を公式ページから引用すると、
JavaScript には、Array、Date、そして Math といったオブジェクトからなる基本的なライブラリ、 そして演算子、制御構造、文といったプログラミング言語の要素からなる主要な機能が含まれています。 JavaScript の主要機能は追加のオブジェクトを補うことで、様々な目的に拡張することができます、 例えば: クライアントサイド JavaScript) ブラウザとそのドキュメントオブジェクトモデル (DOM) を制御するオブジェクトを提供することにより、 コア言語を拡張します。例えば、クライアントサイドでの拡張により、アプリケーションが HTML フォーム上に要素を配置したり、マウスクリック、フォームへの入力、ページ移動といったユーザ イベントに応答できるようにします。 サーバサイド JavaScript) JavaScript を使ったサーバの稼働に関連するオブジェクトを提供することにより、コア言語を 拡張します。例えば、サーバサイドでの拡張により、アプリケーションがデータベースとデータを やり取りし、アプリケーション内で呼びだされた情報が連続性を保ったまま受け取られるようにし、 あるいはサーバ上のファイルを操作できるようにします。
Javascriptとしては、Webページのクライアント制御、サーバー側のデータベース制御といった機能が主となりますが一方Nodejsの特徴として、I/O機能、I/O周りのフレームワークの課題解決を実現した言語と言えます。
- ファイル入出力
- パイプ / ソケット
- プロセス制御
- メモリ管理
といった組み込みに必要な基本的なI/Oはもちろんのこと、ライブラリを用いれば
- BLE通信( Peripheral / Central )
- Wi-Fi制御
- Http通信
など、IoTデバイスのアプリケーションを実装していくのに必要な機能が提供されています。
3. スクリプト言語の採用は新しいデバイスへの移行を加速させる
現在はIoT向けの組み込み機器は怒涛の速さで新しい端末が生まれており、顧客へ最新の端末を届けたいという願う身として、そして提供する立場としては新しい端末への移植を作業を少なく行いたいと考えている人はたくさんいることと思います。「開発したソフトウェアを他のデバイスへ移植する」という事はいつの時代なっても課題となっています。
Nodejsを用いる場合、端末毎のドライバとOSは用意されている事が多い中で新しい端末へ移植するためにするべきことは、
- nodejsのインストール
- 必要なライブラリのインストール
- 自身のアプリケーションのインストール
程度で済みます。自身で行うべき新しい端末へのインテグレーションはほぼゼロにできます (自身のソースに端末依存の処理があれば別ですが)。
実際、今の業務での書いたNodejsの規模は既に数千行に及びますが別の端末で動かそうと、OSこそほぼ同じであれどCPUやペリフェラルのチップの構成は全く異なる端末上で試してみたところほんの数行の修正のみでなんとあっさり動いたことに驚きました。BLE通信処理や、Wi-Fi制御処理なども全く変えていません。 実際は、CPUが違えばJavascriptエンジンのバイナリも異なりますし、nodejsのライブラリで用いているCのネイティブコード部分など対応しているOSである必要がありますが、これだけ簡単に別端末に移植できる環境というのはなかなか無いのではないでしょうか。
まとめ
言語としての速度も十分、移植性も十分、常に新しい端末上で動作させる事ができるであろうスクリプト言語によるIoT機器もしくは組み込み機器向けの開発は、今までC/C++言語信仰者として生きてきたエンジニアの開発の考えを大いに変えてくれました。 今回はいいことばかり書いてしまいましたが、メモリの扱いに弱いというデメリット、その他実装する内容によっては向かないことなども当然ありますが、スクリプト言語での開発も場合によってはおすすめです、として締めくくりたいと思います。
株式会社 Photosythでは、APIやWebツールなどAkerunをどんどん良くしてくれるエンジニアを募集しています。