MakingSenseofStreamProcessing / Composability Requires a Uniform Interface


MakingSenseofStreamProcessing

コンポーザビリティには、統一されたインタフェースが必要

要約

  • Linuxではファイルディスクリプタ(バイトのストリーム)として統一されたインタフェースを提供する。これによってUnixツールを配線(ワイヤリング)から分離することができ、構成可能(コンポーザブル)にさせることを意味する。

詳細

  • すべてstdin、stdout、およびstderrは同じインタフェースを実装しているファイルディスクリプタであり、ファイルのように読み書き可能なバイトストリームであるために、Unixのツールは構成可能(コンポーザブル)であると述べた。このインタフェースは、誰もが簡単に実装でき十分に簡単だが、どのような用途にも使用できて十分に強力だ。
  • 図4-14。Unixでは、stdin、stdout、およびstderrは、全て同じこと’ファイルディスクリプタ(すなわちバイトのストリーム)’だ。それらは互換性を高くさせる。
  • すべてのUnixツールは、同じインターフェイスを実装しているので、統一されたインタフェースを呼び出すことができる。gunzipとwcのツールが共通で何もないように見えるにもかかわらず、これが2つのツールをパイプすることができる理由だ。これは、knobblyビットと溝の同じパターンを実装する、レゴブロックのようなものだ。
  • 図4-15。 ファイルの抽象化は、多くの異なるハードウェアとソフトウェアの概念を表すために使用することができる
  • UNIXではファイルディスクリプタの統一されたインタフェースは、単にプロセスの入力と出力に適用されるだけではない。むしろ、それは非常に広く適用されるパターン(図4-15)だ。ファイルシステム上のファイルを開くと、ファイルディスクリプタを取得する。パイプとUnixソケットは、同じマシン上の別のプロセスへの通信チャネルであるファイルディスクリプタを提供する。Linuxでは、/ dev内の仮想ファイルは、デバイスドライバのインタフェースである。それでUSBポート、あるいはGPUさえコミュニケートできる。 / procの仮想ファイルは、カーネル用のAPIだが、ファイルとして公開されているので、通常のファイルと同じツールを使用してそれらにアクセスすることができる。
  • 別のマシン上のプロセスへのTCP接続さえファイルディスクリプタである。最も一般的にTCP接続を確立するために使用されているBSDソケットAPIは「Unixy」として間違いないのにも関わらず。プラン9は、ネットワークであっても正常に同じ統一されたインタフェースに統合さる可能性を示している。
  • 最初の近似として、Unixではすべてがファイルだ。この統一性はUnixツールのロジックを、ワイヤリングから分離することができ、構成可能(コンポーザブル)にさせることを意味する。sedは、それが別のプロセスへのパイプ、またはソケット、あるいはデバイスドライバ、またはファイルシステム上の実際のファイルを扱っているかどうかを気にする必要はない - それらはすべて同じように見える。
  • 図4-16。ファイルには、ただのバイトのストリームであり、ほとんどのプログラムは、それで有用な何かを行う前に、そのストリームを解析する必要がある。
  • ファイルはバイトのストリームである。ファイルの終わり(EOF)でストリームが終了したことを示すかもしれない(ストリームは任意の長さにすることができ、どれくらい入力が長いのかプロセスは事前に知っていない可能性がある)。
  • いくつかのツール(例えば、GZIP)は、バイトストリームに対して純粋に動作し、データの構造を気にしない。しかし、ほとんどのツールはそれで何か役に立つ(図4-16)を行うために、入力を解析する必要がある。このため、ほとんどのUnixツールは、タブまたはスペース、または多分カンマで区切られたフィールドで、それぞれ1行に記録された、ASCIIを使用する。
  • 今日、ファイルはバイトストリームが良い統一されたインタフェースであることが判明していることを示しているのは全く明らかだ。しかし、Unixの実装は全く異なってそう行うことを決めた可能性がある。例えば、それはプロセスからプロセスに強く型付けされたレコードを渡すためのスキーマを使用する関数コールバックインターフェースだったかもしれない。あるいは、それは(System V IPCまたはmmapなどの)のメモリを共有している可能性もあるかもしれない。それとも、それはビットストリームではなく、バイトストリームだったかもしれない。
  • ある意味では、バイトストリームは、最小公倍数であり、最も簡単なインターフェースだ。すべてはバイトのストリームで表現することができ、送信方法に全く依存しない(別のプロセスからのパイプ、ディスク上のファイル、TCP接続、テープなど)しかし、次のセクションで議論しなければならないように、これは欠点でもある。