ロード トップ 最近 履歴 差分 ピックアップ 検索 全部 ヘルプ 編集

[logo] UNIXという考え方


という名の書籍が出てます。オーム社、Mike Gancarz、訳by芳尾 桂 ISBN:4-27-406406-9

あれ?ISBNうまく出ないなあ。使い方間違ってるでしょうか?


この本のもう一つの楽しみかた:unixという考え方のどこがどう 駄目なのか?を考えるための読本として読む(笑)

GNOME作者の『unix終わってる!(りょうせいさんとこに和訳あり?)』 との併読がお奨め(笑)

unix人がどこをどう勘違い(今から思えば)したのか?が 結構読み解ける感じです。


例えば、(programを)keep smallしましょうといっても、 実は1次元ではなく、どこをどう小さくすると良いか 見極めるって課題が有る。 unix人はそこを(今から思えば)読み違えてる。

p22。 半日で寿命が尽きるまでに一目散に生殖するという 単機能(笑)かつ短寿命な虫 (イナゴの大群の中の個体とかのことらしい) をunixプロセスに喩えているが、 まさに読み違えを浮き彫りにするという意味でも良い喩えだ。

これは、unixプロセスは、簡単な構造だが長寿命なモノを サポートするのが不得手だ、と暴露しているようなものだ。

言い換えれば、「機能」とは「時間?」を持たないものだ、と 決め付けているということだ。

runではなくexistを第一義としたoopのほうが、 長寿命を簡単に記述できる(そして一方で、短寿命の記述を 阻害している訳ではない)という意味では、 unixの流儀よりも更に優れたkeep smallの実現方法 なんじゃないか?と、俺が思う所以。 -戯

あの文脈でunixのプロセスを虫に喩えるのは、実は間違っていると思う。
虫がしている唯一の行為である生殖は、子孫を残すための行為だ。 虫の集団は、個体の生殖を通して、そういう大集団の寿命を、維持しているわけだ。

一方、unixのプロセスは、子孫を残さない。パイプで繋げば 複数プロセスが合体することは有るが、短寿命のモノを 幾つ並べても短寿命のままなのであって(笑)、それは生殖とは違う。
あるいは入出力をファイルに落とすことをもって寿命の延長に喩える という手も有るが、ここで問題になるのはファイルのデータ構造の体系が unixには存在しない事だ。プロセスの構造は存在するのにね。

思うにnixのプロセスが残すファイルは、生命たる子孫なんかではなく、 せいぜい(それよりはフォーマットにおいて数段下の存在である) タンパク質の肉団子に過ぎない、のではないだろうか? つまり虫個体から見ればそれは餌か仲間の死体かのどっちかだ。

寿命だって、それ自体は充分シンプルな概念であるはずだ。 しかしunixはそこから背を向けた。 寿命を簡単に記述する手段を手放した。

卑近な手段として寿命を記述するためにしばしば(無限)ループが使われる。 そして、それを使った瞬間に、unixといえどもWindowsを笑えなくなるのだ(笑)

thttpd (Tiki:thttpd)の起動コマンド thttpd_wrapper は、thttpdが落ちるのが前提で書いてある。いさぎよし。長寿命なものを作るのはコストがかかるから短寿命ですませる部分は済ませる。これはこれで見識。runかexistかは、UNIXがどうのこうのとはあまり関係ない気がするが。。カーネルだけ長寿命、あとはぼちぼちでいいんじゃないだろうか。。httpdとかデータベースサーバーとかORBとか最近は落ちちゃ困るサービスが増えてるから一概にはいえなくなってきてますが。


典型的なUNIXアプリにはコマンドパーサーが無い。
その代わり、コマンドの起動時に、ユーザーがコマンドラインに
動作パラメータも入力することが前提となっている。

プログラムの肥大化は、それでは防げないのではないか? コマンド起動時引数と起動後コマンド入力との間に フクザツ度の差が有るのか?どちらも文字(列)じゃないか?

更にいえば、GUIのCheckBoxプチプチ押すほうが更にシンプル (つまりよりUNIX的)だ、ということになりかねない(笑)。

この本は、シンプルという概念の”原因”および”結果”を、 (今から思えば)勘違いしてるのだと思う。 原因とは、ナニをすればシンプルになるか?という判断であり、 結果とは、シンプルにすれば何がもたらされるか?という判断 (この本では大抵”UNIX的”になるとまとめられてしまっている)である。 まぁ意図的にそうしている可能性も有りそうな気がするけど。


結局unixのアプローチは、(常にではないがしばしば不可避の) 対話型Interfaceを、複雑さから救うことが出来ない。

皮肉(だと指摘されているが)でも何でもなく、 プログラムが人と対話しないとならない状況は、 必ずしばしば有るのだ。if文の後ろのカッコを 常に計算機が自律的に解決できるわけではあるまい。


要するに部品化のこと(メリット)を色々な角度から 説明(説得)している感じ。

だが他の部品化方法は無かったのか? 他の部品化の方法と比べた場合、どっちがどう 優れているんだ?…という話は、少なくとも 前半には(笑)書いていない…

結局unixのpipeアーキテクチャの問題は、 ”pipeでviエディタを作れるか?”の一言で 要約されるだろうと思う。 そういう方向性の部品化だって有るハズなのに、 unix pipeはそうではない。-戯

--

テキストエディットコントロールというコンポーネントを書くことはできても、 テキストエディットコントロールコンポーネント組み立て方式で書けるか と言えば書けないですよね。

スラドでも指摘されていたはずですが。


部品化を『層』で表現しているようだが、 他は無いのか?少なくともpipeはNetworkモデルを うまく扱えないようで、つまりpipeは階層化モデルをしか サポートしていないように見える。 『木を守る』とのことだが、 Printerを使わないという意味でなら賛同するが、 Treeモデルのみの世界に拘泥するという意味なら 結構心配だ(笑)

層の話と少し関係があるが、unixのpipeは結局1次元だ。 つまり、入口と出口の二つの口しかない。 せっかく計算機のランダムアクセスアーキテクチャが 思考を次元の束縛から開放してくれたというのに、だ(笑)。

それに、CPU稼動率を競ってもしょーがなく、 それよりは常時”触れる”計算機が真にパワフルな計算機だ、と p48に書いてあるじゃないか。ならば、 触れるが殆ど常時独り言しか言っていない計算機ソフト/OSに、 パワフルの称号は与えられないんじゃないのか?


逆にいえば、UI以外はバックグラウンドに回してしまえば目的は果たせるはずで、 ”UI以外をバックグラウンドに回す”ことがスムーズに記述できないことを嘆くほうが 本末転倒じゃないのではないかと…


よく言われる(この本でも言及してる/というか言及を避けている(笑))問題である UIの問題は、たぶん二次的問題なのだろうな。

元々はやはり”状態を保持することをサポート(=簡単にする)してくれない”ことが 問題なんだろう。UIの問題は”命令ではなく状態に基づくUI”をサポート してくれない問題、と言い換えられそう。

状態に基づくUIとは、例えばGUIのボタンだ。 それを押してもボタンは相変わらずそこに”ある”だろう (勿論消すことも出来るが、それは権利であって義務じゃない)。

命令によるUIならば、さっきと”同じ(正確には同値の)”選択肢が 再び現れたとき、その選択肢はさっきと”同じ(同一の)”選択肢 なのか?などと悩むことはできない。できないというのは不可能 という意味であって、不要と言い換えることが安全に可能であるかどうかは ひたすら案件に依存する。無理がある場合も有るはずだということだ。

状態によるUIならば、”同一の”選択肢を示すのは容易だ。 同じボタンを相変わらずそこに置いたままにしておけばよい。


GNOME作者氏のunix批判(?)は、直接的には、OOPでいうところのClass (しかも柔らか系で実行時にinterfaceを列挙できるような奴)の ようなもののunix上での不在を嘆くモノだ。

だが、半分はそういう問題だが、残り半分は二次的問題なんだろうな。

やはり”状態”を持つアプリの作成をサポートする部品化手法 の不在を嘆いている(のから話が派生してClassの話になる)のだろうな… と憶測しますぅ。 -戯


よしんばFilter softという考え方が優れているのだとしても、 unixのfilterアーキテクチャがどれくらい理想から離れたサブセットなのか? という問題は残っている。 IOが1つづつしかないのは健全といえるのか? Error処理のサポートはあれでよいのか?(この本いわくソレはStderrに レポートするものなのだそうだ。するとそれを監視する人間様が必要なのか?(笑) いや勿論stderrをどこか別のところにリダイレクトすりゃヨイんだけど、 それじゃ結局話は元に戻るだけだし)

p101

入力をstdinから取得するプログラムは、
どこからデータが来ても構わないと仮定している。

”どこから”の意味を(場合によっては)履き違えているといえそうだな。

unix pipeは、 アプリケーションインスタンス(プロセス)1つづつに別々の接続先を 指定することは出来るが、 1つのプロセスで複数の接続先を”同時に”使うことが出来ないじゃないか。

いや、情報を区別する手段が有るならどの手段でもよいのだけど、 複数のプロセスの出力を混ぜて次のプロセスの(1つの)stdinに 突っ込むことは出来る(shスクリプトで()を使って書くアレね)が、 それはあくまで混ぜているだけであって、 受け取ったプログラムの中でどうやって 混ぜたものを分離するか?の処方箋を、 unixはナニも与えてくれない。混ぜ損である。

その破綻ぶりがすごく卑近に判りやすい例の一つが、diffだと思う。 入力が二つあるというただそれだけの理由で、入力ストリームを いったんファイルに落とさないとならない(笑)。

それとも敗北を認めて(笑)名前付きpipeとかを使うとか?

プロセスごとにオープンしたパイプのファイル記述子をdupで切り替えていけば複数の子プロセスとパイプのやりとりは簡単にできますよ。


頭から尻尾まで連続して処理行おうぜっていう 手続き指向(ってのかな)のモデルの拡張の余地は、 unix程度のソレが限界なんじゃないかな?


解決策(?)を妄想:

なんかどうやっても駄目なような気がする。


unixと、(例えば)Smalltalkを比べると、その違いの"急所"は何処だろう?

名前:コメント:


(最終更新 Wed Jun 15 14:49:36 2005)