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が自身をコンパイルできるようになった

LunarML進捗報告、号外です。前回の記事

からそんなに時間が経っていませんが、「自分自身をコンパイルできるようにする」という重要なマイルストーンを達成したので報告します。

続きを読む

HaskellでつくるAArch64版MinCaml

前回の記事

ではBrainfuckコンパイラーを書きましたが、やはりレジスター割り付けもしないコンパイラーでは物足りないと思ったのでした。

コンパイラーを作るオンラインの教材として前回の記事ではMinCamlと「低レイヤを知りたい人のための〜」を挙げましたが、後者はレジスタ割り付けはやらないみたいなので、MinCamlをやっていくことにします。

単にAArch64対応させるだけなら元のMinCamlとの差分だけを書けば良いのですが、どうせなのでHaskellに移植します。

先に成果物を載せておくと、

です。

続きを読む

AArch64アセンブリーを出力するBrainfuckコンパイラーを書いてみる

ここ数年、LunarMLという「スクリプト言語のソースコードを出力する」コンパイラーを書いているわけですが、自分の中でコンパイラーと言ったらやっぱりアセンブリーを出力するものが連想されます。アセンブリーを出力する処理系を書いたことがないのにコンパイラー好きを名乗るわけにはいかないなあと思うので、ここで一念発起してアセンブリーを出力する処理系に取り組んでみようと思います。

続きを読む

LunarML進捗・2022年4月

月刊LunarML進捗報告です。前回は

で、3月はHaskellの記事を書くのに忙しかったので休刊でした。

今月の進捗を一言で言うと、JavaScriptバックエンドの実装を進めました。

面白いと思った方はGitHubにスターをつけてください:

続きを読む