2012-01-25

テキストフォーマットからの脱却

ありのさんにPowerShellの話の要望を出したら運良く書いていただいたのだが、これが面白い。
私のざっくりとした把握では、PowerShellではテキストだけじゃなくてオブジェクトも直接パイプを使って受け渡しできるみたいなシステムだったかと思うけど、やっぱしそういうのは面白いなと思う。興味はあるけどWindowsはもうずっと使ってないからなぁ。

似たようなことを考える人は、たぶんほかにもいて、たとえばTermKitはJSオブジェクトを受け渡すような感じになっているし、きっと似たようなことを考えて、UNIXな世界に持ち込もうとした人はほかにもいたのだと思うが、今のところ全滅な気がする。

しかし、なんでUNIX系のシステムではこういう考え方が普及しないのか。
個人的には、UNIXの世界の根底に流れる思想がテキスト志向だからだと思う。もともとUNIXの開発の名目は文書処理システムだった、といった神話があるが、真偽はさておき、UNIX系システムには共通のフォーマットというものがない。データは基本的には行志向のhuman-readableな文字列で、それぞれのプロセスがそれぞれなりに文字列処理をするという文化になっている。そんななかで成長してきた便利ツールも、ファイルも、そういった文化を受け継いでいる。単純な空白区切りやタブ区切りでも、よっぽど変な場合を除いてはだいたいうまく動くし問題ないわけ。
そして、その文化を反映するようにUNIXではテキスト処理のツールというのがものすごく充実している。catやheadやtailを使って人間が目で見て、簡単なエディタ(ed/sed/vi)でちょちょっといじれて、cutやheadやtailやuniqやsortやgrepで処理できる世界がもうそこに展開されている。たとえばちょうど偶然nokunoさんがテキスト処理用のUNIXコマンドまとめという記事を書いているが、これがまさにUNIXなのだと思う。
日付の処理も、dateコマンドとexprで頑張る変態テクニックが、きっと探せば出てきて、それがきっとUNIX wayなのだ。

そんな世界をPowerShellみたいな世界観にもっていくのは大変だ。できるのはほぼ同じ事なうえに、過去の資産を生かせない。ここでいう過去の資産ってのは別に各種ツールの実装の問題だけじゃなくて、今まで持っていたデータファイルなども含まれる。こういったものをうまく扱えるようにしつつ、過去の資産と比べて実利がなければうまくいかないし、UNIXの世界はよく言えば自由、悪く言えばカオスなので、オブジェクトの形式を揃えるなんて夢のまた夢だろう。
psやtopのようなコマンドを簡単に処理できればいかに楽かと思う時もあるのだけど、そういうのはperlとかpythonとかrubyとかで、直接APIを叩くほうがいいってことになってしまう。

実際、こういうツールの代わりに、irbを立ち上げっぱなしにして、何かあったらrubyを使うという人はわりといると思う。
それはまぁ、合理的な選択でもある。

PowerShellでなんでああいうことができたのかというと、まず .NET 環境というものがあるWindowsだからだったのだと思うし、UNIXとは「文化がちがーう」という奴なのでこれはまあ仕方ないというしかない。だけど、こういうテクノロジーの可能性を見るのはとても面白いなーと。