週刊mosh - 0.2.7進捗

再起動中...
mosh-currentの更新を再開しました。http://storage.osdev.info/pub/mosh/mosh-current.tar.gz

処理中のIssue

psyntax-moshのいくつかのバグフィックス
このバグはSRFIライブラリ( https://launchpad.net/scheme-libraries )をアップデートする過程で発見された。まだpsyntax-moshにはいくつかのバグが残っているので、最新版への追従はできていない。
nmoshは最新のSRFIライブラリを使用できる。(srfi-updateブランチ)

OpenされたIssue

対応したIssue

ライブラリのprecompile

従来、psyntax-moshはmake installの最後に、misc/scripts/precompile-target.scmを実行して、$HOME/.moshの中にキャッシュを生成していた。これは非常に限られたケース(sudo make install かつ 過去にmoshを通常のユーザ権限で実行したことがある状態)でしか正常に動作しないことが分かっているので、0.2.7からは”mosh_config --precompile"でprecompileできるように変えたい。
しかし、psyntax-moshは"ファイルを確実にキャッシュさせる"手段が存在しないので難航中。psyntax-moshがライブラリをキャッシュするのは、プログラム(*.sps)を実行して、かつ、正常に全てが展開された場合のみ。例えば、REPLからimportしたライブラリは何故かキャッシュされない。
簡単にはmosh_config --precompileとすると、実際にprecompileする代わりにスクリプトを出力することにして、

mosh_config --precompile | mosh

のように、パイプで実行させることだろう。。
nmoshでは単にevalするか、

nmosh library.sls

のようにして、プログラムのようにライブラリを実行すればキャッシュされる。mosh_configはnmosh向けには提供されないので、"nmosh -T precompile"でprecompileを行うことにする。

プラットフォームサポート

現状ではPowerPCMIPSでテストできていない状態。0.2.7をこれらでテストせずにリリースするかは未定。

NetBSDでのコンパイルを解禁。しかし、gcc4.1やgcc4.3では正常にコンパイルされないので難しいところ(i386)。amd64や他のアーキテクチャはまだテストしていない。

Win64での動作はそれなりにmatureだが、何らかの理由でpointerが32bitに切り詰められるケース有り。
これは、そもそもmoshがsizeof(intptr_t) != sizeof(long)な環境を想定していないことに因るので、解決にはかなり抜本的な対策が必要。
今のmoshには、整数オブジェクトを生成する方法がmakeInteger(long)しか無い。Win64の場合、makePointerInteger(intptr_t)とmakeInteger(long)に分割する必要が有る。これを0.2.7でやるかは未定。。

Gaucheでbootstrapできない問題

moshはbootstrapにGaucheを使っている。このため、Gaucheの仕様変更にも追従する必要がある。

  • 0.8.x → 0.9: Gaucheは0.9からinternされないシンボルをサポートしたため、(gensym)で生成したシンボルを変換する必要が有った。
  • 0.9 → 0.9.1(今回の問題): Gauche 0.9.1で導入されたmatchの最適化で、moshVMコンパイラGaucheで実行することができなくなった。

細かい事情はchatonのログに有る。
対策としては、Gauche側のutil.matchではなく、moshの提供するmatch構文をGauche側でも常に使用するようにした。可能な限りGauche側の構文を使わないことで、Gauche側の変更に対してよりrobustになることが期待される。
原理的には、moshのbootstrapにmoshを使うこともできる。しかし、moshのコアはR6RSでないので、R6RS Schemeであるmoshでbootstrapするのは難しい。