status

nmoshは一応暮らせるレベルに達した。まだ通らないテストが幾つか有るのと、エラー表示が死ぬほど不親切という問題があるが。。

デメリット

  • 多くのバグ
  • 起動が4倍遅い。メモリの確保量が多く、起動中に起きるGCの時間が長くなるため(typ. 40ms)。
  • expandがかなり遅い。
  • キャッシュが少々大きい。
  • スタックトレースが不親切

スクリプト自体のパフォーマンスはそれほど変わらない(〜 70 %程度)が観測可能な程度には遅くなる。これはlet等も全て展開してしまうので、単にプログラムステップが増えることに因る。
スタックトレースは微妙に難しい問題。スタックトレースを表示させるにはVMに例外をcatchさせる必要があるが、どうしてもランタイム側で一旦例外をcatchせざるを得ないのでランタイム側より先のスタックフレームは表示されないことになる(平たく言えば、アプリケーション中で例外が発生しても、何処で発生したのかを知る方法は無い)。スタックトレースを採取するためのAPIを追加することで対処できるかもしれない。

メリット

  • プログラム中にライブラリを含むことができる
  • loadが使える
  • REPLでライブラリをリロードできる
  • (nmosh expand)のような内部を操作するライブラリを提供している

ランタイムはlarcenyに近いので、larcenyのR6RSプログラムは多少の手間で移植することができると考えられる。
また、将来的にはライブラリを含んだプログラム全体をcacheする機能の提供を予定している。
プログラム中にライブラリを含むことは出来るが、重要な用途であるところの(mosh concurrent)では利用できない。moshのconcurrentではVMに対してloadするファイルを指示するインターフェースが無いため。これはそのうちランタイム側で対処する予定(親のライブラリ→ファイル mappingを子にも継承する)。
重要な利点は対話的開発の改善にある。Larceny用のswankがSLIMEのリポジトリに有るので需要が有れば移植するかもしれない。

互換性

moshで動いていたスクリプトはnmoshでは動かなくなるかも知れない。特にimport levelの取り扱いがより厳密になる。

R6RS libraryのversionは無視しても良いという噂があるので現在確認中。
nmoshは(使用していない)psyntaxを含んでいるが、psyntax moshはnmoshのランタイムを含んでいないので(nmosh expander)のようなnmoshランタイムに依存したライブラリを使うことは出来ない。
nmosh専用のライブラリを使わない限り、nmoshで動作するスクリプトmoshでも動作することが期待される。

ビルド

細かいことは :

基本的な流れとしては、git版のmoshをインストール→fatmoshをチェックアウト→ビルド/インストール。fmt等の非標準ライブラリはインストールされないので、手動でコピーするなどして対応されたい。
moshとnmoshの両方がインストールされる。nmoshは新しいランタイムを使用し、moshは従来のpsyntaxによるランタイムを使用する。一応moshとnmoshのライブラリは互換するが、nmoshのために専用のライブラリが必要なときは.nmosh.slsのような名前にすればそちらがロードされる。
現在のfatmoshブランチのライブラリは/usr/local/share/mosh/0.2.2以下にインストールされる。このため、特にprefixを分けなくても、moshだけを入れ替えることで本流と共存することもできる(masterは0.2.0としてインストールされる)。

rlwrapとの連携

rlwrapの補完ファイルを作るために、ext/newruntime/tools/mkcompl.scmが提供されている。ext/newruntime上でmake r6rs.scmしたあと、nmosh tools/mkcompl.scmとすることで、nmoshのREPL上で使える定義が一覧される。これにimportを加え*1、uniqすることで.nmosh_completionsを作ることが出来る。
他はGauche同様。see http://d.hatena.ne.jp/rui314/20070604/p1

トラブルシューティング

nmoshのキャッシュは、異なるファイルによって実装される同名のライブラリを想定していない。このため、ライブラリをアップデートしたときに、無効なキャッシュを読み取ってしまい起動しなくなるかもしれない。
単に~/.nmosh-cacheディレクトリを削除すれば起動する可能性が高い。
また、ランタイムライブラリは頻繁に更新しているので、git pullしてからビルドすると直るかもしれない。これは単にgit pullしてmakeするだけでは行えないので、HACKING参照のこと。
実行中のランタイムのバージョンはnmosh -vで参照できる。

oku@oku-mini9 ~
$ nmosh -v
Mosh R6RS scheme interpreter, version 0.2.2 (revision UNKNOWN UNKNOWN UNKNOWN)
nmosh expander/runtime built from :
[commit]4707fcd 2010-01-06 03:51:02 +0900

このとき、git log 4707fcd.. ext/newruntimeのようにすれば、まだ適用していない変更を見ることができる。
moshと同様に、nmosh --verboseでライブラリのロード過程を見ることが出来る。ただし、幾つかのmoshのオプション、--disable-acc等は機能しない。

*1:原理的には、importは唯一のいかなるライブラリからも提供されていないシンボルとなる。