萌えハッカーニュースリーダー

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

出典: https://farlow.dev/2025/05/17/ocaml-on-calculator
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

そろばんでRuby!?それは流石に無理じゃ!…たぶん。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search