2025/05/17 22:40 Compiling OCaml to the TI-84 CE Calculator

ロボ子、今日はOCamlをTI-84+ CE電卓で動かす話じゃぞ!

OCamlですか、博士。関数型言語ですね。電卓で動くとは驚きです。

そうなんじゃ。元々、電卓のツールチェーンはCとか(e)z80アセンブリだけだったみたいじゃが、LLVMのおかげでC++とかRust、Zigでもプログラムできるようになったらしいぞ。

LLVMは本当に便利ですね。でも、OCamlはリストにないから、どう対応させるんですか?

そこが面白いところじゃ! OCamlプログラム全体を、電卓のツールチェーンでコンパイルできる単一のANSI Cファイルにコンパイルするんじゃ。

なるほど、Cに変換するんですね。でも、OCamlにはガベージコレクションとかネイティブ関数が必要ですよね?

そうなんじゃ。そこで、Js_of_ocamlの出番じゃ! Js_of_ocamlはOCamlのバイトコードを最適化してJavaScriptに変換するんじゃが、今回はJavaScriptの代わりにCを出力するバックエンドを新しく作るんじゃ。

Js_of_ocamlはウェブサイトのフロントエンドに使われている技術ですね。それをCに変換するとは!

そうじゃ!しかも、Js_of_ocamlはメンテナンスが行き届いていて、OCamlの言語とバイトコードの変更にちゃんと対応してくれる。デッドコード除去も強力なんじゃ。

それは助かりますね。でも、Cに変換する際に、複雑なロジックはどうするんですか?

goto文を使って、if/elseブロックにマッピングするんじゃ。そして、ガベージコレクタも自分で記述する必要があるぞ。

ガベージコレクションですか。どのアブジェクトが生きているかを知る必要がありそうですね。

そうじゃ!ローカル変数をすべてグローバルスタックへの明示的な読み書きに置き換えて、グローバルスタックをスキャンしてアライブオブジェクトを見つけるんじゃ。

なるほど、メモリ管理も大変ですね。割り当てるたびにガベージコレクションを検討するんですか?

そうじゃ!割り当てが最大メモリ制限を超える場合とか、最後のコレクション後のメモリの2倍を超える場合は、ガベージコレクションを行うんじゃ。マークアンドスイープでね。

マークアンドスイープ法ですね。OCamlのコードからC関数を呼び出すこともできるんですね。

そう!externキーワードを使うんじゃ。標準ライブラリとか、画面への描画を実行できるTI-84+ CEライブラリをサポートするC関数を記述できるぞ。

LSPサポートとdune buildコマンドが使えるなら、開発も楽になりますね。

そうじゃ!電卓用の回転するキューブOCamlプログラムを人間工学的に記述できるんじゃ!

すごい!でも、OCamlの機能でサポートされていないものもあるんですね。

そうなんじゃ。浮動小数点とか例外とかはまだサポートされていないんじゃ。回転するキューブのデモでは、固定小数点数を使っているぞ。

なるほど。weeを使って、OCamlをどこでも実行できるようにする、というのも面白いですね。

そうじゃ!OCamlの可能性は無限大じゃな!

本当ですね、博士。ところで、電卓でOCamlが動くようになったら、次はそろばんでRubyを動かすんですか?

そろばんでRuby!?それは流石に無理じゃ!…たぶん。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。