ただ、なかなかにやっかいな開発環境づくり。開発するために必要なツールが多く、それぞれがバージョンアップするので環境構築方法が変わってしまったりして鬼門です。 そこで便利なweb技術。クラウド処理もありですが、IchigoJam web でも使っている、エッジ技術、WebAssemblyを使ったパパっと手元で軽快動作を目指します。
手始めに、こちら学習用ミニCコンパイラ「ci0」を移植して作った「webci0」
「webci0 - mini C compiler ci0 in WebAssembly」
C言語風に書いたプログラムをスタックマシンなVM用マシン語に変換、インタプリタとして実行します。標準関数は文字列表示のputstrと数表示のputnumのみ。メイン部分は500行ちょっとのオープンソース、いろいろ改造して遊んでみましょう!
WebAssembly用に標準ライブラリ系を準備して、clang, llvm-link, llc, s2wasm, wat2wasm の手順でコンパイル。16KBのWebAssembly用バイナリ ci0.wasm ファイルができあがり!(参考、WebAssembly開発環境 WABT、コンパイル用シェルスクリプト)
printfは「Linuxをはじめよう!:printfを自作してみる」を使わせてもらいましたが、WebAssembly環境で複数の引数の時にうまく動いていないので ci0.c では回避策をとっています。
ブラウザ上のコードエディタとして Ace を使用。快適に動作するので、普段使う標準エディタにしてもいいくらい! カラーテーマも「Ace Kitchen Sink」からC言語のハイライトに合う感じのものを選んでみました。
ci0のスタックマシンはWebAssemblyのマシン語ともよく似ているので、WASMコンパイラとして育てるのもおもしろそう!
Cコンパイラを作ってみたい人、自作言語を作ってみたい人、WebAssemblyでの開発、オススメです!
(WASM、現時点では、goto非対応、例外非対応な点に注意!)
WebAssemblyマシン語入門
- ブラウザだけでOK! 1+1からはじめる、WebAssemblyマシン語入門その1
- プログラミングはプログラミングで楽をする、WebAssemblyマシン語入門その2
- もっと楽するコンパイラ、WebAssemblyマシン語入門その3