週刊mosh

今週のmosh development。(たぶん月刊くらいになる)
新expanderは進んでない。当初設計だとvariable-transformerに対応できないことが分かったため。。

isnanとisinf

MoshはC99のisnanとisinfに依存しているので対応で悩み中。主にApple XCodeで問題になる。
基本的には、cmathヘッダにstd::isnanが有るのでそちらを使うのが確実。無ければどうにかする必要が有るが今のところそれが入っているのはMSVCだけ。

CMake対応進行中

cmakeブランチでCMake対応が進行中。CMakeはautotoolsのようなMakefile生成インフラで、autotoolsと違ってVisual StudioとかXCodeEclipseのようなIDE向けのファイルを生成できるのが特徴。
特に、Visual Studio対応はCMakeに移行してしまう予定。これはWin64対応を将来予定しているのでその準備。
CMakeに至るまでは色々検討したのだけれど、CMakeにした理由は :

  • LLVMOpenCVがCMakeなので、十分に普及していると判断した。CMakeは、autotoolsと違って、ビルドする全員がCMakeをインストールしている必要が有るため、普及していないと採用しづらい。
  • CTest(同梱のテストツール)にビルド/テスト結果をXMLで報告するインターフェースが有る。
  • nmoshはアプリケーション組込みインタプリタになれるようにしているので、その特徴を生かすため。CMakeは単にsubdirectoryとして指定するだけで、そこで定義されたターゲットが使えるようになるという地味に便利な機能が有る。LLVMをリンクしたプロジェクトを作りたければ、LLVMをsubdirectoryに指定して、target_link_library(myProgram LLVM...)のように指定するだけ。

ただ、通常の人間は./configureのインターフェースに慣れ親しんでいるので、autotools側もメンテナンスを続けることになる。この辺の手間を解消するために、ソースコードの列挙だけ別に書いておいて./gen-git-build.shの実行時にそれぞれのツールへの入力(Makefile.amとCMakeLists.txt)を生成するようにするかも。
(nmoshの指向しているアプリケーション組込みはGaucheのそれとは逆方向で、"アプリケーションのmainをSchemeで書けるようにする"ことを目的としている。つまり、個々のアプリケーションモジュールはCやC++で書き、それらをくっつけるグルー言語としてmoshを使えるようにしていきたい。この分野のものにはSWIGが有るが、(普通のWindows/Macintoshアプリケーションに要求されるような)単一アプリケーションバイナリを提供するためには、インタプリタそのものが十分にポータブルでないといけない。。)
テストは今のところGCのテストとgoogletestによるテストにのみ対応。Schemeテストはそのうち追加予定。
また、重要な機能としてはFFIのサポートが無い。単純にconfigure時にフラグとしてホスト判定を保存してしまうと、Universal Binaryがビルドできなくなってしまうので。。これはconfig.h側で判定するように変更予定。

MSVCビルドの変更(cmakeブランチ)

MSVCビルドはCMake経由のビルドに変更した。
ただ、今までのMSVCサポートに存在したリンク時最適化等の指定が無くなっている。そのうち変更可能なオプションになる予定。
CMakeに移行したので、MSVC上でのビルドのためにはCMakeのインストールが必須になった。
また、従来静的リンクしていたGMP(MPIR)を、ユーザが明示的に指示する形に変更した。MPIRのソリューションファイルにはdllビルドとlib(静的リンク)ビルドの両方が有るので、適切なバージョンを選択されたい。バイナリ版は検討中。もちろん、CPU固有の最適化を使うこともできる。
従来、GMPを静的リンクしていた場合は、GPLクリーンでないR6RSスクリプトの実行にライセンス上の懸念が有った。今回の変更で、少くともユーザは容易にmoshバイナリのライセンスを選択できるようになった。また、この変更によってgmp.hを含まなくなったので、moshのソースツリーから(L)GPLライセンスのコードは無くなった。(nmoshのビルドに使っているalexpanderのようにGPLライセンスを選択可能なコードは有るが、そもそもBSDLでもGPLライセンスは選択可能。)
従来のMSVC9に加えて、新にMSVC10をサポートした。どちらも今後しばらくはTier1として運用。MSVC8以前はサポートしなくなった。

XCodeのサポート(cmakeブランチ)

CMake経由でApple XCodeでのビルドに対応した。テスト類も通過する。
XCodeコンパイラは微妙にLLVMが統合されている都合で、moshのdirect-threaded codeが正常に動作しない。今のところこれは無効にされるので、通常のビルドよりもパフォーマンスに劣るはず。
今のところXCodeを使うメリットは殆ど無くて、これはそのうちリリースされるXCode4対応を見て。XCode4がリリースされれば、病的に高速なコンパイラや微妙に便利なデバッガの恩恵を得られるようになるはず。
XCode+SnowLeopardの組合せはそのうちTier1アーキテクチャに追加予定。

Eclipse CDTのサポート(cmakeブランチ)

CMake経由でEclipse CDTでのビルドに対応した。テスト類のサポートはまだ。
EclipseはTier1になる予定は無い。