世界を動かす技術を、日本語で。

IoTデバイス向けのErlang仮想マシン「AtomVM」

概要

  • AtomVM は、Erlang/Elixir用の軽量仮想マシン
  • BEAM 命令セットの一部とOTP標準ライブラリをサポート
  • IoTアプリ を関数型言語で簡単に開発可能
  • プロセス管理や周辺機器連携、WiFi対応など多機能
  • 低コスト なマイコン上で高度な並行処理を実現

AtomVMの特徴

  • Bogdan Erlang Abstract Machine (BEAM) の軽量実装
  • Erlang/Elixir ソースからコンパイルしたバイトコード実行
  • BEAMオペコード の限定的だが実用的なサポート
  • Erlang/OTP標準ライブラリ の一部を最適化して搭載
  • 小型マイコン での動作を前提とした設計

IoT開発への利点

  • 関数型言語 によるIoTアプリケーション開発
  • アクターモデル ベースの並行処理
  • コードの 可読性保守性 向上
  • プロセス生成・監視・メッセージ送信 の高度なサポート
  • プリエンプティブスケジューリング と効率的なGC

周辺機器・通信対応

  • GPIO、I2C、SPI、UART などマイコン搭載の周辺機器と直接連携
  • WiFiネットワーク 対応(例: Espressif ESP32)
  • $2程度 の低価格デバイスで利用可能

ドキュメントと導入

  • AtomVM公式ドキュメント で詳細な情報提供
    • サンプルプログラム実演
    • ステップバイステップの導入ガイド
  • 公式サイト: atomvm.net

まとめ

  • AtomVM は、低コストなマイコン上で Erlang/Elixir の並行処理を活用し、 IoT開発 を効率化するプラットフォーム

Hackerたちの意見

Erlangが通信業界から生まれたことを考えると、モバイル開発の選択肢が少ないのはちょっと不思議だね。そこらへんで何か期待できることある?

… モバイル開発の選択肢が少ないってどういう意味?もうちょっと詳しく教えてくれる?ありがとう!

大規模な同時処理や障害隔離の特性は、電話交換機(あとウェブサーバーとか)にはすごく良いけど、電話アプリにはあまり関係ないことが多いよね。

Erlangの通信分野での使い方は、主にバックエンドでのスイッチング、ルーティング、リアルタイム音声処理に集中してるんだ。携帯通信のトラフィックを扱うだけじゃなくて、インターネットのスイッチもErlangで書かれてることが多いよ。最近になって、フロントエンドで動くようなコードを書くためにErlangが使われるようになったんだ。(Elixirを書く楽しさも大きな要因だね。)モバイルでErlangを動かすのが難しかったのは、BEAM VM自体のポータビリティがなかったからなんだ。だから、このプロジェクトはすごくワクワクする!

何で、何百万もの接続を受け入れて処理するために作られたプログラミング言語が、基地局やルーティング、スイッチングに使われているのに、モバイルデバイスに役立つの?

コンパイラーとそれが生成するバイナリは、AndroidやLinuxのスマホでもちゃんと動くよ。

最近、マイクロVMツールが増えてきて本当にすごいよね。これなんか、昨日のやつだよ: https://news.ycombinator.com/item?id=44135977

これ、結構前からあるやつだね。最近、Elixirコミュニティがwasmのターゲットとしてもっと探求してるから、活発になってきてるよ。

これはNervesよりも小さいデバイスをターゲットにしてるの?それとも単なる代替品?

小さいデバイスだよ。

これ、マジですごい!esp32の例は、同じ内容のCバージョンに比べてすごく分かりやすい。Erlangのアクターモデルのおかげで、ずっと簡単になってる!... もしOTAアップデートとコードのホットロードがうまくいけばだけどね!

OTAアップデートの基盤はほとんど整ったよ。近いうちにAPIもいくつか揃うはず。ホットローディングはもっと手間がかかるけど、OTAが準備できたらできるようになると思う。

なんでJVMで車輪を再発明したの?もうErlang VMがあるのに。Javaは多くの世代に悪影響を与えたよね。

JVMはBEAMよりも前に登場したよ。

パフォーマンスは確かに理由の一つだね。BEAMはせいぜい中程度の性能だし、BEAMのデータモデルにかなり依存しなきゃいけないから、それは今でも大きなハードルだよ。20年前なんてなおさら。まあ、ほぼ同時期に出てきたしね。「なんでLispじゃないの?」っていうのは時系列的に意味があるけど、「なんでBEAMじゃないの?」はちょっと違うよね。

Erlangは1998年まで独自のもので、あまり知られてなかったんだ。Erlang VMはJVMとは違う焦点を持ってる。

AtomVMはMCUプロジェクトのプロトタイプを作るのにめっちゃ楽しい!Micropythonとかよりもこっちを選ぶことが多いかな。もっとパワフルなマシンにはNervesを使うことが多いし、最近はPopcornっていうプロジェクトがAtomVMを使ってブラウザでBEAM VMのコードを動かしてるんだ!ElixirやErlangを展開できる場所が増えてるの、すごくいいね :)

これって実際に意味のあるユースケースは何なの?ErlangがIoTデバイスで動く必要があるのはどうして?俺が知ってるErlangの主なユースケースは、パワフルなマシン向けなんだよね。元Erlangエンジニアより。

なんでダメなの?ErlangはSmalltalkと同じように、すごく柔軟なアクタードリブンアーキテクチャを推奨してるんだ。思ってるよりも一般的な素敵なプログラミングパラダイムで、ホーンクローズ構文も本当にいい感じ。こんな風に使うのはすごく楽しいよ。

元々は電話交換機のハードウェア用に作られたんだ。

有名なAXD301は68kとUltraSPARC IIプロセッサで動いてたよ。ESP32は240MHzくらいだから、そんなに遠くないね。最初はErlangはVAX上で開発されてたけど、たしか3MHzくらいだったかな?それ以来、BEAMには数十年分の最適化が施されてる。

確か、ボウリー・ファームズが倒産する前に、BEAMを使って自動化された垂直農場の fleet を運営してたんだ。ノンセンスなネットワーキングとクラスタリングが利点だったんじゃないかな(確かではないけど)。自宅を自動化してると想像してみて、ここにRaspberry Pi、あそこにGPUノードとか。どのノードにでも接続するだけで、すぐに開発アクセスできたらいいよね。

これはPopcornの背後にあるVMだよ。https://github.com/software-mansion/popcorn、OTPとElixirをWASMで動かそうとするプロジェクトだね。> Popcornは、ブラウザでクライアントサイドのElixirを実行できるライブラリで、JavaScriptとの相互運用性もあるんだ。最近のElixirConfの基調講演で紹介されたよ: https://youtu.be/ep--rQO1FRI