Make Tokyo Meeting 05 に参加してきました

5/22、23の二日間、東工大大岡山キャンパスで開催されたMake Tokyo Meeting 05(略してMTM05)に出展者として参加してきました。元々は出展の予定はなかったのですが、友達から一緒に出展しないかと誘われて、何を作るかも決めずに参加することにしました。当日も開発をしながら展示というひどい有様でしたが、一部のマニアックな方々には好評でした。

作ったもの: KondoLisp

KondoLispは、最近流行りのArduinoで動的なプロトタイピングを実現するためのツールキットです。現在公開に向けて作業を進めています。ソースコードhttp://github.com/hayamiz/kondo-lisp からどうぞ。

Arduinoというのは、AVRマイコンに便利なペリフェラルを組み合わせた物の名前で、PCとUSBで繋ぐだけですぐにマイコンプログラミングを始められるという優れものです。しかし、Arduinoでプログラムを動作させるには、Arduino言語で書かれたプログラムをコンパイルし、それをマイコンに書き込むという作業が必要になります。この一連の作業はプログラムが大きくなってくると5秒以上も待たされることになり、センサーのキャリブレーション等細かい数値の調整を何度も繰り返すときには非常にストレスフルです。

http://gyazo.com/401b0215d592c7b20567473c9ddd3880.png

そこでKondoLispの登場です。KondoLispはユーザーがPC上で入力したLispプログラムをArduinoに送信し、Arduino上のLispインタプリタがそれを評価することで即座にプログラムが実行されます。つまり、KondoLispを使えばコンパイル・アップロードなしインタラクティブArduino上でのプログラム開発を進めることができるようになります。

また、KondoLispの扱うLispプログラムはArduino上で動作するプログラムとして書かれているため、簡単にArduino言語のプログラムへと変換することができます。つまりプロトタイピングだけでなく、プロトタイピングから本番への移行をスムーズに行えることが意識されています。

FunnelのようにPCからインタラクティブArduinoを操作できるフレームワークもありますが、KondoLispとFunnelは対立するものではなく、別の用途のものであると考えることができます。FunnelはArduinoを制御するプログラムはPCにあり、フィジカルコンピューティングのツールとしてArduinoを活用しています。一方、KondoLispではPCはLispプログラムをArduinoに送信するだけであり、プログラムはArduino上で動作します。つまり、KondoLispでは主体がArduinoであり、一方Funnelでは主体がPCである、ということです。

「なぜLispなのですか?」という質問を多くの人に聞かれたので、そのときの答えをここでも説明しましょう。

LispArduinoという非常に制約の厳しいハードウェア向けに処理系を作りやすいというメリットがあります。ArduinoのAVRマイコンは非常に限られた資源(SRAMが2KB、EEPROMが512B)しか搭載していないために、インタプリタは非常にコンパクトである必要があります。Lispには様々な亜種があることからもわかるように、Lispは言語仕様を色々と変えてしまってもやはりLispなので、Arduino向けに非常にコンパクトな言語仕様にしやすいためにLispを選択しました。もちろん独自言語を設計するという選択肢もありますが、今回はそこが本質ではなかったというのと、パーサを作るのが面倒という理由もあり、Lispを選択しました。また、Lispはデータ構造がシンプルで、かつ言語としての柔軟性があるという点もArduinoに向いていると思います。

、、、というのが建前であり、実際のところは「ArduinoLispが動いたらおもしろいんじゃね」という、どうしようもない出来心の産物です。

KondoLispと普通のLispの比較

Arduinoという非常に資源の少ない環境で動作させるために、KondoLispには普通のLispにない様々な制約があります。ただし、これは今後改善されるかもしれません。

大雑把な比較は以下のようになっています。

機能 Lisp KondoLisp
REPL ○(シリアル通信)
関数定義 ×(実装予定)
変数定義 △(letによる束縛のみ可能、defvar相当を実装予定)
データ型 数値、コンスセル、無名関数など色々 整数(14bit signed)、シンボル(2文字まで)、nil、t、コンスセル
GC ×(実装予定)
プログラムの長さ 事実上無制限 EEPROMのサイズが上限*1

裏話

MTM05が5/22(土), 23(日)に開催されたわけですが、Arduinoが手元に届いたのが直前の火曜、KondoLispの制作にとりかかったのは直前の木曜の深夜からというひどい状況でした。しかも、金曜は昼過ぎから研究室でミーティングがあり、夜からは飲み会があり、ほとんど時間がとれなかったので二次会でコーディングをしていました。しかもこのときACアダプタを忘れてきたことに気付き、ノートPCのバッテリが切れたところで開発を切り上げて飲み会を再開。夜の3時すぎまで飲んだ後、漫画喫茶でダラダラと漫画を読んだり仮眠をとったりして、研究室までACアダプタを取りに行きました。そこで1時間ほど作業をして、1 + 1*2の計算が動くようになりました。その後、大岡山まで移動する最中に自由が丘のSoup Stockで朝食をとり仮眠、大岡山のマックで友達を待ちながら仮眠、会場入りしてから開発しつつ展示というひどくグダグダな感じでした。

*1:Arduino Duemilanoveで512B

*2: (+ 1 1)