Unixの哲学は、共有メモリ空間やリンクではなく、パイプ、fifo、ソケットなどのプロセス間通信形式と連携する、小規模で一般的に再利用可能な連携プログラムの使用を推奨します。 MH と uzbl プログラムは、デザインに Unix 哲学を実装するアプリケーションの例としてよく引用されます。
それでは、Webアプリケーションの設計では、Unixの哲学は完全に放棄されていませんか?要求を処理するほとんどすべてのWebアプリケーションは、1つのリソースだけでなく、ドメイン全体のすべてのリソースに対する完全な要求/応答サイクル(外部データベースプログラムへの呼び出しを除く)を処理する単一の大規模な長期実行プロセスとして構築されました。
これは、主にWeb要求に対する動的応答を構築するために外部プログラムのコレクションにパイピングすると、過度のプロセス開始時間オーバーヘッドが発生するためですか?出力をRubyまたはPythonスクリプトにパイプする場合は状況を理解できますが、コンパイルされたHaskellのような言語を使用すると、Webアプリケーションを構築するときにUnixの哲学に従うための実際の障壁が消える可能性がありますか?
答え1
私の考えは、アプリケーション間で線を引く場所(アプリケーションの定義など)と念頭に置いているユースケースによって大きく異なります。
wget
/のマージでWebブラウザを実装できますが、curl
HTML / XMLパーサーは各ドキュメントノードに対して単純なアプリケーションを呼び出し、スタンドアロンJavaScriptエンジンはすべてのノードと対話し、「シンプル」ディスプレイは「ちょうど」上記の内容を画面に出力しますそして(入力をいくつかのコア調整プロセスに返す)、今日の他のブラウザより(おそらく)混乱しているでしょう。
データを外部プロセスに配管する場合 - 実際にはそれがすべてです。ここに行く。平均的なWebアプリケーションコードのサイズが心配な場合はそうです。サイズが大きい場合が多いです(通常は「単純な」アプリケーションではなく、解釈されたプログラミング言語で書かれたプラットフォームの上にあるレイヤーだからです)。しかし、同等のレベルで比較します。メールクライアント、オフィススイートなど、必要に応じて指定してください。これらすべては非常に複雑で、パイプを介して通信する複数のプロセスで実装するには多くの機能があります。このようなアプリケーションを使用して行う作業も複雑な場合が多い。複雑な問題に対する簡単で良い解決策はありません。
今、UNIXのモットーである「少ないことをするがうまくいくアプリケーション」の背後に隠れた動機を見なければならない時です。 「アプリケーション」を「ユニバーサルモジュラーユニット」に置き換えると、基本的で良いプログラミング方法の1つが得られます。部品を個別に再利用して開発するためのモジュール式作業。 IMHO、それは本当に重要なことです(プログラミング言語の選択はそれとは何の関係もありません)。
メモ (コメント後):最も厳しい意味では、ほとんどあなたの言葉が正しいです。 WebアプリケーションはUNIXの哲学に従いません(複数の小さな独立したプログラムに分割されています)。ただし、アプリの全体的な概念は多少曖昧に見え、sed
いくつかの点でアプリと見なすことができます。状態、通常はフィルタとしてのみ機能します。
したがって、文字通りどれだけ受け入れたいかによって異なります。プロセスの一般的な定義(カーネルが認識するという意味で)単一のプロセスとして実行されるプロセスを使用する場合、たとえばhttpdモジュールによって解釈されるPHP Webアプリケーションは完全に反対です。ロードされた共有ライブラリはまだ単一のプロセスの範囲に属していますか(同じアドレス空間を使用するため)、それとも独立していますか(プログラマの観点から不変、完全に再利用可能、明確に定義されたAPI通信を介して)。
一方、今日のほとんどのWebアプリケーションはクライアントとサーバーの部分に分かれて別々のプロセスで実行され、しばしば異なるシステム(または物理的に別々のハードウェア)で実行されます。 2つの部分は、明確に定義された(通常はテキスト)インターフェース(HTTP経由のXML / HTML / JSON)を介して互いに通信します。一般的に(少なくともブラウザでは)いくつかあります。糸アプリケーション(JavaScript/DOM、入力/出力...)で作業するクライアントであり、時にはプラグイン(Java、Flash...)を実行する別のプロセスでもあります。これは、特にLinuxの元のUNIX哲学とまったく同じです。糸はいプロセス(ほぼ)すべてのアカウントを介して。
それに加えて、サーバー部分はほぼ常にいくつかの部分に分けられます。典型的な例は、構造化(または構造化されていない)データに対して要求された操作を実行する別々のデータベースエンジンです。データベースをWebサーバーに統合することはあまり意味がありません。ただし、データベースを要求の解析、データストアからのデータのインポート、データのフィルタリングなどを担当する複数のプロセスに分割することはあまり意味がありません。すべてのタスクを実行できる巨大企業とほぼゼロに近いグループを作成する必要があります。会社員はほとんどの時間を互いに話し合い、過ごす。
についてはテキストインターフェース:40年前に処理されたデータについての事実は、今日必ずしも真実ではありません。バイナリ形式は、逆シリアル化に必要なスペースと消費電力の面でより安価で、データ量がはるかに大きくなります。
もう一つの重要な質問は、UNIX哲学の実際の目標は何ですか?私は数値シミュレーション、銀行システム、公的にアクセス可能なフォトギャラリー/ソーシャルネットワークがなかったと思います。システムメンテナンスしかし、これらのサービスを実行してきたことは確実であり、今後もその可能性が高いです。
答え2
Unixの哲学がWebアプリケーションのデザインに存在しているかどうかは不明です。ただし、多くのWebアプリケーションは実際には説明どおりに機能できますが、今日のWebアプリケーションはデータ消費者になる可能性が高いと仮定することもできます(ますますAPI / Webを検討してください)。 Web消費のためのデータを生成するサービスベースの方法)。
これは、最終的に相互に協働する小型で再利用可能なコンポーネント(JavaScript関数形式)の使用を奨励していると考えられるため、小さな並列処理が可能です。