Yash-rs 今後の方向性
3 年位前から yash を Rust で再実装してゐる (yash-rs)。基本的な部分はかなり出来上がってきつつあるのでここで今後の方向性を整理しておく。
直近のマイルストーン (POSIX 2018 scripting) ではシェルとして POSIX の要求を全て満たすことを目標としてゐる。ただし、以下の点は除く。
- 対話シェルに関する機能
- ロケール対応
その後の発展の方向性にはいろいろな選択肢がある。第一には、test とか printf などのユーティリティを組込みにして性能を向上すること。これはシェルスクリプトの実行環境としての使ひ勝手をよくするものだが、単に POSIX 準拠の高性能な環境が欲しいだけなら既存の yash なり他のシェルなりを使へばよいので、そこまで優先度は高くない。
第二には、[[ ]] 構文のやうな拡張機能を実装して、POSIX の範囲外での他のシェルとの互換性を高めることもできる。これにより他のシェルから新しい yash に乗り換えてもらひやすくなるが、これも (単独では) それほど重要ではない。
第三には、POSIX 的に可搬でないスクリプトを検出する機能を増強すること。これは既存の yash でも posixly-correct オプションを使へば似たやうな効果がある程度得られるが、新しい yash ではこれを別のオプションに分けたいと思ってゐる。その理由は純粋にオプションの利用目的が違ふからである。「POSIX の規定に反するシェルの挙動を禁止して、POSIX シェル向けに書かれたスクリプトが意図通りに動くやうにする」のは「POSIX が要求しないシェルの動作を無効化して、POSIX シェル向けに書いたつもりのスクリプトが意図通りに動くかどうか検査する」のとは異なる行為である。後者の目的においては、例へばシェルの実装によって結果が一定しない可能性のある箇所を警告するなど、POSIX の要求を超えて厳しく動作するモードを導入することも考へられる。
第四は、対話シェルとしての実用性を強化すること。とはいへ、現行の yash を単にコピーするつもりはない。コマンド履歴の管理方法についてはかねてより改善要望 (yash #25) があるところだし、vi/emacs モードの動きももっと柔軟にカスタマイズできるやうにしたい。もっとも、それらを全て実現するのには途方もない時間がかかりさうだが。
第五はロケールへの対応であるが、POSIX の要求するロケール処理を忠実に満たすには Rust では String の使用を諦めなければならず、全く現実的でないので、やるとしてもエラーメッセージの翻訳等の限られた対応に留まるだらう。
いろいろ検討してゐるところではあるが、せっかく Rust で書き直してゐるのだから Rust でしかできない (といふか C ではあまりにも大変でやりたくない) ことをやりたい。また、現行 yash の開発を始めた十年以上前に比べて bash をはじめとする他のシェルの POSIX 対応は改善されてきてゐるので、ただ POSIX に細かく準拠することが売りになる時代はもう過ぎた感がある。結局、Solaris みたいな微妙な環境を除けば sh としてインストールされるシェルは bash と dash のどちらかしかないので、POSIX を基準としてスクリプトの可搬性や互換性が維持される世の中は今後もあまり訪れる気配がなく、POSIX 絡みのあれやこれやを頑張ることにどれほどの需要があるのかは怪しい。さういふことを考へると、新しい yash では POSIX のことはそれほど気にかけずに独自の存在意義を探してゆく方が将来性があるのではないかと思ってゐる。
| 固定リンク
コメント