「IoTフロントエンド開発」を考えるシリーズ ①IoT時代の実装言語Nim



注、Nimのアドベントカレンダーの記事に、IoTとフロントエンドというマジックワードでちょっと釣ってみてます。何回かに分けて書く予定なので、IoTフロントエンドの開発言語に興味ある人、よろしければ釣られてください。もちろんいろんな意味で興味深い新言語Nimがお題なのですが、JavaScriptはじめ他の選択肢との関係についても随時書いていきますので、よろしくです。
想定読者は、以下の記事が気になるような方々:

マイナビニュース 『止まらないC言語の下落 - 12月言語ランキング』

5年前のwebを振り返り、5年後のUX(ユーザー体験)を考える。

今から5年前、日本的には3.11の年だった2011年。IT業界では、普及が進むスマートフォンへの対応とHTML5への移行が話題となっていた。JS界隈には、まだangularもreactも登場しておらず、これからはcoffeescriptだよね的な雰囲気が一部にある中、マイクロソフトのIEの動向を気にしながら、HTML5を見ていたような時代。

そこから5年経った2016年。IT業界の大きな話題のひとつ、AIだ。例えば、3月に李世乭棋士との囲碁対決の勝利で話題をさらったAlphaGoを擁するGoogleは、『AIファースト』を掲げ、知能的半版によるユーザー体験(UX)の改善を進めていくとしている(参考 なぜ今、“AIファースト”なのか Google、AIクラウドに本腰 (1/2))。HTML5は当たり前になった一方で、Ecmascript上位互換のtypescriptを除いたAltJSはほとんど話題とならなくなってしまっている。

さて、これからの5年はどうなのだろうか。ブラウザは当然に広く使われ、HTML5(6?) + EcmaScript2020(?)という組み合わせもフロントエンド開発の主流のひとつだろう。一方で、スマートカーや応対ロボットでは、各社のAIクラウドを活用した音声ガイダンスやジェスチャー認識がフロントエンド・インターフェースとして使われていくのだろう。自動運転者や人並みのロボットがそう簡単に普及するとは思えないので、スマートフォンの「次の本命」はまだ現れず、絶賛移行中が5年後の現実かもしれない。

とはいえ、開発者視点では、PCでもスマートフォンでもないターゲットのフロントエンド開発案件はプロトタイプ開発も含め相当数登場するのではないかと思われる。その中には、Linuxベースではない軽量OSもしくはOSのない環境を用いる案件も出てくるだろう。こうした開発案件は、組込機器界隈のバズワードであるIoT(もののインターネット)を用いて語られることが一般的だ。

でも,スマートカーのような新たな機器を親しみやすく使いやすくするためには、フロントエンド開発で蓄積されたUX(ユーザー体験)向上のためのノウハウが活用されるべきなのではないかと考える。以下、こうした視点を『IoTフロントエンド開発』ととりあえず呼び、掘り下げて考えていきたい。

このあたり、ちょっと参考になりそうな記事は以下かな。

IoTプロトコルとペイロードの標準候補は、HTTP(S)+JSON

IoTフロントエンド開発案件は、当然に限られた予算とスケジュールの中で行われることになる。現実的な開発コストで案件をこなすためには、(多くのエンジニアが理解する技術をなるべく用いるべき...といったところで、機器-サーバー間のメッセージングには、データの運び手(ペイロード1)としてJSONが選ばれることに多いだろう(処理能力と通信との兼ね合いでバイナリ化された専用ペイロードが用いられる場面も多いだろうが)。

通信プロトコルの方は、効率性の観点からMQTTも使われる場面もあるだろうが、HTTP(S)も広く使われていくだろう。近年、webで広く使われてきたHTTP+JSONという組み合わせは、少なくともとっかかりの選択肢として今後も定番でありつづけるものと思われる。そのため、サーバ側は、HTTP+JSONを扱えるソリューションで対応していくこととなりそうだ。

「IoTサービス」 ユーザー体験を担うIoT機器側の実装言語は?

さて、本シリーズの本題は、数年後の各種IoTサービスにおいて、ユーザーに一番近いところでのユーザー体験(UX)を担うことになるIoT機器側の実装言語を考えること。

IoT機器の実装言語に求められる資質は以下のようなものと考えられる。

  • 低スペックの機器で動くこと (これはIoTサービスのボトルネックのひとつである、バッテリーの問題への対応でもある)
  • OSなしでも動くこと (より詳しくは一般のOSにある機能のうち必要な機能だけを抽出できること)
  • webとシームレスに通信できること (JSON over HTTPなど通信手段は決め打ちでも良い)
  • なるべくモダンな言語であること (セキュリティ確保が重要になるIoTサービスではnull安全の担保などが言語レベルでサポートされていることが望ましい)

有力な候補は、C/C++に替わるシステム記述言語として期待されている、 D/Rust、さらには、Golangあたりだろう。

ただ、世界初の波括弧言語BCPL2からの系譜を含めてしまえば、システム記述言語として50年ほどの歴史を持つC言語は、やはり強い。これまでの組込機器開発の常識は、アセンブラかC。IoT開発言語としてマイクロソフトなんかが提示してきているのも、C系のC++だったりする。

しかし、自由度高すぎな言語C++は、いくらでも危険なコードを書けてしまうので、思いっきり初心者お断りな言語だったりする。ブラウザやスマートフォン向けのフロントエンド開発を行うエンジニアが、IoTフロントエンド開発案件をこなすための移行対象としては、どうみても敷居が高そう。

となると、webエンジニアにはけっこうおなじみになってきたGoが選択肢となってきそうに思われるし、実際にソリューションも登場している。

例えば GoベースのMainflux:

chara_01.png

出典 https://github.com/Mainflux

ただ、現時点では、ギークな香りが強すぎるかも(特に、上の絵の真ん中のぬいぐるみみたいなのが意味不明でなんだかキモいと思う人には)。Googleが推してくる可能性は高そうだけれども、Googleが出してくるソリューションではギーク臭はさほど下がらないかも...

「IoTフロントエンド開発」向けの有力言語を目指す挑戦者     ~mruby/micropythonなど~

マイクロソフトにアップルにオラクルにSAP、さらには諸々のベンチャーが採用するIoT向けのシステム言語は、少なくとも当面の間は、C系の言語が多数派となることが予想される。 一方で、すでに新産業の担い手として期待されて久しいIoTだけに、開発生産性を高める工夫もさまざまにこらされていくだろう。iOS開発向け言語としてswiftが華々しく登場したように、IoT向けの新言語が登場する可能性もあるし、既存のプログラム言語が改めて注目を集めることもあるだろう。既存言語側からは、組込開発向けrubyとして開発されたmrubyが、一候補だ。

-参考記事 組み込みRuby「mruby」をロボットで習得できるキット

クラウドファンディングで開発されたpyboard上のMicroPythonも、候補者だろう。
-参考記事 2015年はじめのpyboardお試しブログ

以下のコードだけでLEDがチカッと光るなんて素敵だね。今後は、pythonの豊富なライブラリをどんどん使えるようになってほしいな。

import pyb

# turn on an LED
pyb.LED(1).on()

その他、調べてないけど、luaを用いる人々はもちろんいることだろう。

AltJSにしてAltCな新言語Nimでの、IoTフロントエンド開発

ruby由来のmrubyも、python由来のmicorpythonも、実装言語は、Cだ。組込開発の主流言語がCなのだから、当然の選択だろう。ただ、実行効率を高めランタイムを小さくする工夫がなされているのだろうが、素のC言語での実装に比べると実行時のオーバーヘッドの存在は不可避的だ。また、さまざまに登場してくる各種のIoT基盤への対応が現場レベルで必要となることも予想される。

そこで、私は、C系言語にコンパイルされるコンパイル言語であるNimに注目している。「C言語に替わる」システム開発言語を目指すrustやgoと異なり、NimはC言語と共存する、(JS界隈の言葉に従えば) AltC言語だ。C言語自体の基本的な知識は必要となるものの、Nimは、C言語とほぼ同一の実行環境の選択肢が手に入れている。
例えば、 IoT統合開発環境を提供するEvothings社のエンジニア Göran Krampe氏は、Arduino上でのNimのコードを走らせる試験を行っている。

  • 参考 「ブログ Nim Meets Arduino
  • 低消費電力と引き換えに限定的なスペックを持つArduinoでは、mrubyやmicorpythonを動かすことは大変そう。ただ、さらに切り詰めたmruby/c言語での動作を試みる強者もいらっしゃる

Evothings社は、HTML5ベースでのIoTソリューションを提供している :

出典 http://evothings.com

Evothings社の Göran Krampe氏がNimに注目する理由の一つは、nimがCとJavascriptの双方にコンパイルされる言語であることによるものと思われる(Nimは,AltCにしてAltJS)。

多くの人にとって、AltJSの話はもうおなかいっぱいだろうけど、shsnow23さんの記事javascriptとNimの相互呼び出しのところをちら見しておけば、web界隈の人にも、Nimがどんな言語かは想像がつくのではなかろうか。web開発やらスマートフォン開発やらをやってきてIoT開発には敷居の高さを感じていた私は、Nimでなら、IoT開発ができるのではないかと思っている(ほんとかどうか、実案件で使って実感したい)。

5年後を視野に、NimでのIoT開発にじっくりとトライしていきたい。

来年か再来年には、バージョン1.0に達すると考えられるNim言語。既に、nimで書かれたライブラリはけっこう充実してきていて、JSONは楽に扱えるし、webフレームワークも存在する。もちろん、必要に応じ、CやJavascriptのライブラリを呼び出すことがもできる。以前、MySQLドライバをNimから呼び出して見たときには、試行錯誤も含め実質30分程度の時間しか要しなかった。

ということで、これから、JSON over HTTPなIoTサービスの構築にこれからトライしていこうと思う。音声インターフェースなんかをフロントエンドにしたい。ただし、Nimアドベントカレンダー2016でその準備作業を行い、Nimアドベントカレンダー2017で結果報告を行うスピード感で、かな...。

そうこうするうちに、実案件でちょっと使ってみてはまったりしたならば、Nim入門記事を書くかも。今後のIoT開発で、仮にmrubyやはたまたdartのようなスクリプトソリューションがメジャーになったとしても、「その下」のC言語レイヤで頑張れるNimには居場所があると思うしね^_^

Nimが気になった人は、まずはqiitaのnim言語タグをクリックして、雰囲気をつかんでおこう。
(『BCPL-> B -> C -> C++/objective-c -> D-> (IoT時代)-> Nim 』って流れをネタ的にオチにして、続く)


[おまけ] 1966年開発、最古の波括弧言語BCPLのソースコード例

//
// n以下の素数を求める 出典 https://ja.wikipedia.org/wiki/BCPL
// ※ C言語にはなくてNimにはあるletが、宣言に使われているw

GET "LIBHDR"

LET START() BE {
    LET I, J, N

    WRITEF("N=")
    N := READN()

    FOR I=2 TO N DO {
        FOR J=2 TO I-1 DO {
            IF I REM J = 0 DO
                BREAK
        }
        IF I=J DO
            WRITEF("%N*N", I)
    }
}

----
脚注


  1. ペイロードとは、IT用語としては、パケット通信においてパケットに含まれるヘッダやトレーラなどの付加的情報を除いた、データ本体のこと。 出典 

  2. BCPLは、もちろんネタなんだけど、おまけにつけた世界初の波括弧言語のソースコード、以外とモダンだよね。