「数学ソフトウェアの作り方」という本が出たので簡単にレビューする。
続きを読む「プログラミング」カテゴリーアーカイブ
バイトコードVMのための調査
LunarMLの今年の目標に「REPLとインタープリターを実装する」というのがある。これまではLunarMLをLuaやJavaScriptをターゲットとするコンパイラーとして実装してきたけど、
- REPLによるインタラクティブな実行
- 書いたSMLコードを直接実行(一旦LuaやJavaScriptコードを生成するのではなく)
できると嬉しいよね、という話だ。(REPLを備えたStandard ML処理系は色々あるが、LunarMLとコンパチブルなREPLが欲しければ自分で作るしかない。)
つまりインタープリターだが、構文木を走査するインタープリターは遅そうだ。効率的な実行のためには、バイトコードとVMを設計したい。
バイトコードへのコンパイラーはSMLで、VM(ランタイム)はSMLによる実装とC言語による実装の両方を用意することをイメージしている。
C言語による実装を用意することで、高速な実行が期待できるだけではなく、「コンパイル済みバイトコード+C言語で書かれたランタイムによるbootstrap問題の解決」もできる。つまり、現状の「LunarMLを動かすためにはSMLコンパイラーが必要」という状態から「CコンパイラーまたはSMLコンパイラーがあればLunarMLが動く」という状態にできる。
ではバイトコードと抽象機械はどうやって設計するか?
続きを読むC言語でクロージャーを実現したい、あるいは実行時のコード生成によるクロージャー
導入:クロージャーについて
昨今ではクロージャーを使えるプログラミング言語は珍しくなくなった。クロージャーとは、関数の引数だけではなく、外のスコープにある変数を参照できる関数のことである。
例えば、次のJavaScriptコードでは、関数を返す関数 f
を定義している。 f
の中で定義された無名関数は、外側の変数 x
を参照できている。
function f(x) { return function(y) { return x + y; }; }
JavaScriptではネストした関数を使わなくても、bind
メソッドによって同等の処理を記述することができる:
function g(x, y) { return x + y; } function f(x) { return g.bind(null, x); // gの第1引数を束縛する }
残念ながらC言語にはクロージャーはない。関数の中に関数を書けないからだ。
しかし、クロージャーと同等のこと、つまり関数に追加の引数を渡すことはできないのだろうか?
続きを読むLunarML進捗・2022年7月:LuaJIT対応など
LunarMLが自身をコンパイルできるようになった
LunarML進捗・2022年6月
HaskellでつくるAArch64版MinCaml
前回の記事
ではBrainfuckコンパイラーを書きましたが、やはりレジスター割り付けもしないコンパイラーでは物足りないと思ったのでした。
コンパイラーを作るオンラインの教材として前回の記事ではMinCamlと「低レイヤを知りたい人のための〜」を挙げましたが、後者はレジスタ割り付けはやらないみたいなので、MinCamlをやっていくことにします。
単にAArch64対応させるだけなら元のMinCamlとの差分だけを書けば良いのですが、どうせなのでHaskellに移植します。
先に成果物を載せておくと、
です。
続きを読むAArch64アセンブリーを出力するBrainfuckコンパイラーを書いてみる
ここ数年、LunarMLという「スクリプト言語のソースコードを出力する」コンパイラーを書いているわけですが、自分の中でコンパイラーと言ったらやっぱりアセンブリーを出力するものが連想されます。アセンブリーを出力する処理系を書いたことがないのにコンパイラー好きを名乗るわけにはいかないなあと思うので、ここで一念発起してアセンブリーを出力する処理系に取り組んでみようと思います。
続きを読む