週刊nmosh - システムのBoehmGC利用 / Win8+Cygwinで動かない問題 / スリム化

世間的な要求のために、システムにインストールされた(大抵Shared libraryの)BoehmGCを使用するconfigureオプション --with-system-bdwgc を追加した。特にFedoraのようなRPMディストリビューションへの収録のためには事実上必須なので。。
これに伴い、クリーンビルドにはpkg-configが必要になった。
このオプションはPair/AnnotatedPairでの最適化を無効にする。本来は、アロケーションのサイズを使用してPair/AnnotatedPairを区別しているが、これは正しくない(GC_DEBUGで壊れる)し、その辺のディストリビューションにおけるBoehmGCでも動かない(DONT_ADD_BYTE_AT_ENDが必要)ので、Pairにも1ワードを足して区別できるようにしている。
(多分、Pairは専用のプールを使用して割り当てるのが好ましいだろう。)
Shared libraryなGCを使用すると、他のGCとリンクしているライブラリをFFIできるようになるというメリットがある。nmoshは組込み指向なので、リンクターゲットに余計な制約を課すのは良くないという判断もある。

Win8+Cygwinで動かない問題

GC自体のテストは通るが、GC_FREEに異常なアドレスが渡る。C++ I/FがGCを使用していないポインタに対してデストラクタでGC_FREEを呼んでいるように見える; つまり、GCC++ I/FはCygwin上で正しくoverloadしない(このコミットでworkaroundされている: https://github.com/ivmai/bdwgc/commit/83e0a2cefcbc88bdbc19bcf98cc3a1f1cf307d63#diff-8247d35cb549ef6e40eac573ec96934dR398 )ので、STLのstring等が正しく動かない
というわけで、唯一STLを使っていたscheme::getMoshExecutablePathだけ修正してとりあえず動くようにした。。
Win8Cygwinはかなり鬼門で、細かいハマりどころが多い(MacOSのバージョンが上がるとmacportsで面倒が掛かるのに似ている)。

スリム化

0.2.8のリリースまでに、psyntax-moshとnmoshのどちらか片方のみのインストールをサポートする。これは、FreeBSD等でMobile shellの方のmoshとコマンド名が被って共存できないという問題の対処のため。(既にCMakeビルドはpsyntax-moshをサポートしていない)
nmoshはyuniのexpanderのみを内蔵し、R7RSだけをネイティブサポートするように変更する。R6RSライブラリ、要するにsyntax-caseを使用したコードは別途必要に応じて現状のexpanderをロードする。
nmoshは現状様々な(psyntax-moshと比べた)拡張を含んでいるが、非同期I/Oのようなコードは全てUCIDベースのSchemeコードに置き換えて廃止し、全て処理系間で共通の(yuni *)ライブラリに移動しようとしている。現在それなりの量のCコードで実現されているOSインターフェースは、C APIの呼び出し自体を除いて全てpFFIを使用したSchemeコードで書くように変更する。
唯一、しばらくUCIDで記述できるアテのないwxWidgetsだけはCグルーを外部のプロジェクトに出してネイティブコード部分を残すことになるかもしれない。
言い換えれば、nmoshで動くコードはRacketやchibiでも動くという状況を作ろうとしている。処理系の実装に必要な本当のコア部分は何なのかを見極めることが目的で、個人的には、まさにSchemeらしいアプローチだと思う。
新しいnmoshのキーワードは柔軟性を超えた"浸透性"だと考えていて、nmoshが(組込み先アプリケーションの)何処にでもフィットするように良い方法論を考えていきたい。このためには、nmosh独自のインターフェースが大量にある状況は好ましくない。