NeWS

NeWS（Network extensible Window System）は、1980年代中ごろにサン・マイクロシステムズが開発したウィンドウシステム。古くは "SunDew" と呼ばれ、後にJavaを設計したジェームズ・ゴスリンが主任アーキテクトとして設計に当たった。NeWS インタプリタは PostScript に基づいている（後の Display PostScript に似ているが、2つのプロジェクトに関係はない）。 NeWS はプリンタとは違って、複数の PostScript プログラムによって生成されたウィンドウ群を同時に画面に表示するため、PostScript インタプリタをマルチタスク化するところから出発した。また、canvases と呼ばれる表示域に基づいた完全な表示階層システムを追加した。多くのGUIのビューシステムと同様、表示の木構造の概念があり、それにしたがってイベントが渡される。NeWS には、タイマや他の自動イベント、マウスとキーボードなどのデバイスの入力キュー、その他の対話処理に必要な機能など、完全なイベントのモデルが構築されている。 特に興味深いのは、継承を伴う完全なオブジェクト指向プログラミングスタイルが追加されていた点である。このため、アプリケーション構築に外部のオブジェクト指向言語を必要としなかった。 これらの追加機能は全て PostScript への拡張として実装されたため、単純な PostScript のコードを書くだけで、ウィンドウを表示するインタラクティブなプログラムとして動作させることができた。よく知られたデモとして、約2ページのコードでできた時計のアプリケーションと、視線でカーソルを追いかける一対の目玉を描くプログラムがあった。目玉のプログラムは1988年のSIGGRAPHで展示され、後に登場した有名な X Window System のアプリケーション xeyes に影響を与えた。 NeWS にはユーザインタフェースの要素（ウィジェット）のライブラリがいくつか含まれており、それら自身も NeWS で書かれていた。これらのウィジェットは NeWS インタプリタによって実行され、ウィジェットが要求したときだけ外部プログラム（または他のNeWSコード）と通信が必要になるだけである。例えば、トグルボタンの表示ルーチンはボタンが押されているかどうかの状態を問い合わせることができ、それに従って表示を変化させる。ボタンの PostScript コードは、マウスのクリックに反応することもできる。これらは全てウィンドウサーバ内でクライアントプログラムとやり取りせずに行われ、ボタンの上でマウスがリリースされたときだけ制御のためのイベントが送られる。 これは、X Window System のサーバモデルよりも洗練されている。X の場合、「マウスのボタンがここで押下された」、「マウスの現在位置はここ」、「マウスのボタンがここでリリースされた」といったイベントがクライアントに送られ、クライアント側でそれがボタンに関わるイベントかどうかを判断し、状態を変更し、新たな状態の描画をサーバに要求する。クライアントとサーバが同じマシンにない場合、これらのやり取りがネットワーク上を行き来し、性能が低下する。 そのようなライブラリの好例として TNT (The NeWS Toolkit) が1989年、サンによってリリースされた。サンは例として示すためにもっと小さいツールキットもリリースした。 NeWS は広く採用されることはなかったが、いくつかの企業がライセンスを受け、様々な用途に利用した。SGIはこれを 4Sight と名づけ、従来使っていた独自の IRIS GL というウィンドウシステムの後継とした。NeWS 上で動作する数少ない商用製品としては、Frame Technology Corp. が開発したDTPソフトである FrameMaker の OPEN LOOK 版がある。その開発にはサン・マイクロシステムズとNSAが資金提供していた。また、 Arthur van Hoff の開発した HyperLook は対話型アプリケーション設計システムであった。 自由に利用可能な X11 が既に一般化しつつあったため、NeWS の最初のバージョンでは呼び出しを NeWS PostScript に変換することで X11 をエミュレートしていた。性能に問題があり、X11 の正確なピクセル結果に依存しているプログラムがあったことから、サンはXサーバとインタプリタを並行動作させるハイブリッド型の Xnews をリリースした。無理な統合をしたため、NeWS インタプリタの性能は大幅に低下し、Xサーバもよい実装とは言えなかった。サンはまた OPEN LOOK のルック・アンド・フィールを実装した2種類のツールキットを開発している。1つは OLIT であり、Motif と同様に Xt (X Intrinsics) を使っている。もう1つは XView で、サンの以前のウィンドウシステム SunView と同じAPIを実装していた。 OPEN LOOK が Motif に敗北したことが明らかになり、アドビシステムズが FrameMaker を取得すると、NeWS 上のアプリケーション製品は皆無となった。現在では多くのUNIXシステムが（サンの製品も含め） X Window System を使っている。 NeWS の設計は色々な意味でシンクライアント向きであり、ディスプレイ側に多くの処理を移動でき、クライアントプログラムの意味論からGUIの意味論を分離できる。PostScript の描画モデルを採用していたため、他のグラフィックスAPIよりもはるかに使い易くて強力である。従って、誰もが成功を信じて疑わなかった。 NeWS が市場に受け入れられなかった理由としては、以下のようなことが挙げられる。 NeWS を使うにはサンからライセンスを受ける必要があり、一方 X Window System は MIT Licenseでソースコードが配布されていた。NeWS ライブラリを使った製品を出荷する場合、サン、アドビシステムズ、パロアルト研究所に対してライセンス料を支払う必要があった。 X Window System の勝利が明らかとなるころまで、NeWS には頑健な再利用可能コードのライブラリが存在しなかった。サンはJavaではこの過ちを繰り返さなかった。問題をさらに悪化させたのは、サンが様々な種類のウィジェットセットを提供して開発者を混乱させた点である。 PostScript は後置記法とスタックをベースとしていて、数式を記述するのが苦手な言語である。これは印刷では問題ではないが、ユーザインタフェースでは例えば、スライダーからどれだけ下の位置でマウスがクリックされたかなどを計算する必要があり、数式が重要だった。C言語風の構文のコンパイラがいくつか登場したが（pdb、c2ps など）、これらは使いにくく、サンがサポートしたものでもなかった。 NeWS でアプリケーションを開発する場合、クライアント側とサーバ側を全く異なるプログラミング言語で書く必要があり、しかもそれらの間で非同期な通信が行われる。この通信の調整は難しいが、サンは若干のサポートしか提供していなかった。 NeWS のウィンドウサーバは競合する他のウィンドウシステムほど安定した実装になったことがない。NeWS と X11 のマージで事態はさらに悪化し、またそれと同時にリリースされた Solaris 2 にも性能問題が存在していた。 経営陣は、X11 とどう対抗していったらいいか、NeWS に適した市場はどこかについて混乱していた。 NeWS と Display PostScript (DPS) を比較すると、どちらも同じイメージングモデルと言語を基にしていながら、その手法は大きく異なる。DPSでは PostScript のコマンドは描画でのみ使用され、他の操作（ウィンドウ生成など）は別にシステムインタフェースとして実装されていた。DPS には NeWS のような面白い機能（例えば、PostScript コードでウィンドウの形状を描くなど）はなく、低レベルな Xlib ライブラリを必要とし、DPS と X の調整のための扱いにくいグルーコードを必要としていた。しかし、そのためにDPSのコードの大部分はインタプリタで解釈実行されるのではなくコンパイルして実行されるので、作成とデバッグが容易で高速に動作した。結果として NeWS のように PostScript に基づいた表示であってもエンジン部分はかなり小さくなり、高速化され、「自然」なプログラミング環境になっていた。 ^ Don Hopkins. “NeWS - Network extensible Window System”. 2008年1月8日閲覧。 ^ Gosling, James (1986年). “Article 5 - SunDew”. In F.R.A. Hopgood, D.A. Duce .... Methodology of Window Management (Eurographics Seminars) Proceedings of an Alvey Workshop at Cosener's House, Abingdon, UK, April 1985. UK: Springer-Verlag. ISBN 3-540-16116-3  ^ HyperLook (aka HyperNeWS (aka GoodNeWS)) a short description of NeWS The NeWS eyeball program