cirs - 中間言語用のC言語 in S式
次のmoshに入れる予定のC言語ライタを作っている。もっとも、表現が安定するまでには時間がかかりそうなので、公開APIになるのはちょっと先。
まだ必要な機能の半分も実装されていない。
(struct #f packet (length int) (flag0 (bit 0) unsigned int) (flag1 (bit 1) unsigned int)) (defn hoge int ((A packet *) (B int)) ('some_function A B) (return (+ 1 A B)))
のようなコードが、
struct { int length; unsigned int flag0:0; unsigned int flag1:1; } packet; int hoge(packet * A, int B) { some_function(A, B); return (1 + A + B); }
のようなインデントされたC言語として出てくる。
インデントされているのは、出力されたC言語のコンパイルエラーを人間に解決させやすくるため。。可能な限り人間が書くのに近い見た目のコードを吐かないといけない。
Gaucheのciseをそのまま持ってくる案も有ったけど、nmoshでは基本的にコンパイラのバックエンドにしか使わず、人間が書くことは殆ど想定していないので似たようなものを作ってしまった。。(たとえばciseにあるマクロやScheme風構文のような機能は無い。)
↑のコードでsome_functionがquoteされているのは、関数呼び出しはこう書くというルールにしたので。。当初はScheme風のマクロを入れようとしていたので、letのような名前の関数が呼べなくなるのは困る。と。。cirsの構文では、型やattributeはリストのheadに来ることは無いので特にquoteする必要は無い。
想定している用途はさまざま :
単純なライブラリであればFFIでもどうにかなるが、複雑な外部ライブラリとやりとりするにはC側でも多少のコードが書けると良い。
グルーコードの部分をcirsで書いて、多少の糖衣構文を加えてmoshのオブジェクトシステムとのインターフェース部分は自動生成させたいという魂胆。静的リンクの場合はmoshのC++ネイティブAPIが使えるが、C++の動的リンクはいろいろと難しい問題が有るのでC APIを新規設計して使う。
(moshはBoehm GCを使っているので、外部のDLL/soからオブジェクトシステムを触らせるのは地味に面倒だという問題がある。当初はCプリプロセサでどうにかするつもりだったが、関数全部にVMオブジェクトへのポインタを持たせるなど人間が書くには面倒になりそうだった。)
マクロ展開器をCコードに変換してmosh本体側に内蔵させたいと考えている。マクロ展開器は相当なコード量になっているが、殆どはsyntax-rules/syntax-caseによるディスパッチなので簡単なコンパイラでも効果を挙げられると考えている。(あと、演算のオーバヘッドが減るのも期待している。。)
moshにclangを内蔵すれば、ChezのようなSchemeライブラリの共有ライブラリ化も(原理的には)可能になる。ただ、簡単なコンパイラではmosh本体のVMで実行するより確実に遅くなる*1ので、どの程度この方面の努力をするのかは微妙なところ。。