この文書は InformIT: GNUstep: A Free Software alternative to OpenStep の日本語訳です。

gnustep

近年、ギークの世界での OS X の人気によって 多くの人々が Cocoa を通じて OpenStep を知ることになりました。GNUstep は OpenStep の代替物となるフリーソフトウェアです。

Sun, NeXT, そして GNU

Steve Jobs は Apple を去ったあと、完全なコンピュータを作成する目的で新会社 NeXT を設立しました。そして1989年に NeXTStep と命名されたオペレーティング システムをリリースしました。

NeXTStep は6,500ドルの Next Cube だけで利用できるにもかかわらず信じられないほどの影響力がありました。世界初のウェブブラウザ WorldWideWeb (後にNexusに改名) は、この NeXTStep で開発されました。開発者の Tim Berners-Lee は NeXTStep という超一流の開発環境が無ければ不可能であったと主張しました。その他、Doom を含め NeXT のマシンで様々なソフトウェアが開発されました。

数年後の1993年、NeXT は OpenStep という仕様を策定するためにサン マイクロシステムズと手を組みました。クロス プラットフォーム開発を意図した整理された NeXT API でした。その構成要素は2つに分けられました:

  • ファウンデーション キットは文字列や配列、ファイル入出力などの低レベル層のライブラリを提供
  • アプリケーション キットは GUI ツールキットと関連するサービスを提供

NeXT が x86 をはじめとするいくつかのアーキテクチャで利用可能な新しいOS(オペレーティング システム)をリリースするあいだにサンは Solaris 上で OpenStep をサポートしました。NeXT もまた Windows で動作する仕様の実装を提供しました。

当時、NeXTシステムにはGNUプロジェクトからの強い関心がありました。今日も多くの人々が OPENSTEPを理想的なUNIX OSと考えます。しばらくの間GNUオペレーティングシステムは、NeXTStepと類似のものを目的としました;より野心的なデザインであるけれども、GNU HURDカーネルはNeXTStepと同じ Mach を基礎にしました。GUI層は NeXT APIのGNU実装によって提供されました。このプロジェクトは OpenStep仕様がリリースされた時は熱狂的でしたが、KDEとGNOMEによって徐々に曇らせられました。

GNUstep の大きな問題のひとつに、ほとんどの開発者がNeXTStepあるいはOPENSTEPに触れることができなかったという事実でした。その時 Apple が NeXT を買収したのです。この事で参入障壁が一気に低下しました(注: Mac OS X の発売)。マシンが手頃な価格になったのです。それまで NeXTのハードウェアが少なくとも5,000ドルとi486バージョンの OS が 499ドルで入手可能でした。

多くの開発者が Apple の実装 (Cocoa として知られる) を通して OpenStep API のエレガントさに慣れ、再びプロジェクトへの関心が寄せられるようになりました。現在の GNUstep は OpenStep 仕様といくつかの OS X の拡張を実装しています。

GNUstep はウィンドウ マネージャではない

しばしばGNUstepが何であるかと混乱しているのを見かけますが GNUstep は開発環境です。アプリケーションを書くのに使えるワンセットのライブラリと開発ツールなのです。

GNUstep環境で使用される最も一般的なウインドウ マネージャは WindowMaker ですが、WindowMaker は GNUstepを使いません。その代わりに、CでGNUstepの機能のいくらかを実装した WINGS(WINGS Is Not GNUstep)と呼ばれているライブラリを使います。

GNUstep は “OS X のための WINE” ではありません。GNUstep は API レベルで多くの OS X の機能を実装していますがABI はまったく異なります。Apple は GNUバージョンを使うことより、Apple 自身のObjective-Cランタイムを保持します。

Objective-C

GNUstep は C 言語で書かれていません。プログラミング言語は Objective-C が使われています。Objective-C は C++ とは違って、C の純粋なスーパーセットです。つまり有効な C プログラムは有効な Objective-C プログラムであることを意味します。Objective-CはSmalltalkのようなオブジェクト指向構文と意味論を加えます。C言語に追加された出来事は非常に小さいです; オブジェクト指向の概念をよく知っているCプログラマーなら短時間でObjective-Cを学ぶことができます。

Objective-C の核となるのがメッセージ パッシング構文です。 メッセージ パッシングとはオブジェクトの交信方法であり、C++のような言語のメソッド呼び出しに似ています。メッセージ パッシング構文は紛らわしいと時々考えられます。Objective-C メッセージのあらゆるパラメータが命名されるので、名前:値 という組のリストはメソッド呼び出しのあとに続きます。このアプローチはコードを読みやすくします。あなたがパラメータの順序とその意味を決して忘れるこはないでしょう。しかし、Smalltalk経験のない開発者はこのアプローチを理解し難いかもしれません。

Objective-Cは一般的なプログラミング言語にはない機能もあります。なかでも役に立つのがカテゴリです。Objective-C カテゴリとは実行時に追加されるメソッドの集合を指します。これらのメッソドはオブジェクトのどんなインスタンスにも利用できるのです。

C++ と違い Objective-C はレイト バウンド(実行時にバインドされる)動的言語です。メソッドは実行時に調査されます。もしメソッドが見つからなければデフォルト メソッドが呼ばれます。この移譲の機構をオーバーライドすることもできます。また特定のメソッドをサポートするかどうか確認するためにオブジェクトについて調査することも可能です。この方策は キー値コーディング (key-value coding) のために GNUstep と Cocoa で使われています。明確なメカニズムによってインスタンス変数を直接セットすることも get/set メソッド(これらが実装されているなら)を使用することも許可します。

ファウンデーション キット

OpenStep のコアとなるのがファウンデーション キットです。GNUstep の実装は GNUstep Base と言います。GUI の有無に関係なく、すべての OpenStep プログラムで使用できます。

基本的なデータ型を象徴する NSString といったクラスがあります。これはOpenStep仕様のいたるところで使われ非常に強力な役目をはたします。NSString クラスはオブジェクトの型をサポートする printf の類似物を含んでいます。

さらに、ファウンデーション キットは分散オブジェクトをサポートする多くのクラスがあります。これらのクラスは、異なるマシンを含み、プログラムが異なったプロセスの中に広げられるのを許容します。 Javaは同様の設備をRMIの形で供給しますが、より多くの接着剤コードを必要とします。

ツールキットは、ユーザー情報を格納する方法がなければ完全と言えないでしょう。OpenStepは完全を目指すためにユーザ標準システムを提供します。この仕組みはWindows のレジストリがUNIX哲学で設計されたようなものです。プロパティを保存する標準的な方法があり、それは標準的なOpenStepコンテナクラス(辞書、配列、など)をシリアライズした形式です。レジストリとは異なり、各々のアプリケーションのプロパティは標準規格のプロパティ リスト ファイルに保存されて、テキストエディタ(またはコマンドラインデフォルトのプログラム)で簡単に編集することができます。

GUIについて

GUI 層(アプリケーション キット)は、あなたが想像するGUIツールキットのすべてを提供します。ウィンドウの作成、ウィジェットなど、ユーザ相互作用を管理するためのイベント ループもあります。

ドキュメント ドリブンのアプリケーションを作成する仕組みを持たなければ”アプリケーション キット”と呼べません。OpenStep の NSDocument と関連するクラスは少数のメソッドをオーバーライドすることで、そのようなアプリケーション作成をとても簡単にします。

OpenStep が PostScript 表示モデルに基づいて構築されたのでWYSWYGの概念はツールキットに組み込まれています。表示できるものは何でも印刷できます。

サービス

NeXT のオペレーティングシステムの強力な機能のひとつにサービスがあります。 OS X にもある機能ですがしばしば見すごされています。サービスはひとつのアプリケーションが他のアプリケーションにデータを送り出す機能です。GNUstep ではこのサービスがメニューで健在です(OS Xではアプリケーション メニューのなかに隠されています)。サービスは様々な異なる用途を実現させます。メール クライアントはEメール メッセージの選択された部分だけを送信したり、TeXサービスは選択されたテキストを活字に組んだ方程式に置換するかもしれません。

GNUstep ターミナルの例を挙げましょう。”ターミナル サービス” はその他のアプリケーションすべてに提供されます。このサービスはどのようなシェルコマンドもサービスとして許可します。Sort コマンドは選択されたテキストを並べかえることができますし、calc, dc, bc などは選択された式を評価することができます。

バンドル

Mac OS ではどのようなアプリケーションもひとつのファイルです。このファイルは2つのフォークを入れてあるでしょう。 データ フォークは実際のバイナリーを含んでいます。そして、リソース フォークは必要である付加的なリソースを含んでいます。フォークのコンセプトはディレクトリと似ています。どちらもファイルシステム上で階層構造を提示する方法です。NeXT のチームはこれらがあまりにも似ているのでフォークの使用を止めました。

フォークの変りに NeXT は広範囲にわたってバンドルを使用しました。バンドルは我々がよく知っているディレクトリ構造です。グラフィカルなファイル ブラウザで見るとバンドルは慣習的にはファイルとして表示されます。NeXT のアプリケーションはバンドル(ディレクトリ)で、.app という拡張子を持っています。バンドルにはバイナリと必要とする非標準的なライブラリ、そしてその他のあらゆるリソースを含んでいます。ファイル ブラウザでバンドルをダブルクリックすると起動するようになっています。

バンドルはOpenStepで広範囲に使用されています。リッチテキストの標準フォーマットであるRTFDはRTFドキュメントと図表などのあらゆるオブジェクトを含むバンドルになっています。バンドルを使用した革新はフレームワークの概念でした。フレームワークはライブラリと一連のヘッダファイルを含むバンドルです。フレームワークは内部にバージョンと複数のアーキテクチャをサポートします。フレームワークはインターフェースと実装を一つの場所に格納するのでインストールも使用も削除も非常に簡単になっています。

少し話題を離れますが、GNUstep を含め OpenStepシステムへのソフトウェアのインストールは通常 .app バンドルを適当な場所にドラッグするだけです。アンインストールは .app バンドルを削除するだけです。バンドルがプラットフォーム特有のバイナリとリソースをサポートするのでアプリケーションをファイル サーバー上で異なる環境から共有することも可能です。OS X, GNUstep/Linux, GNUstep/FreeBSD, GNUstep/Solaris (SPARC) or GNUstep/Solaris (x86) で構築したコードをバンドルに含めてあなた自身の .app を作成することができるのです。

GORMツールキット

OpenStep は GUI を設計するために少し変わった仕組みを提供します。多くのツールキットは以下の2つのうちのひとつを用います:

  • プログラム的にレイアウトとウィジェットの位置を作成します。Java の AWT が良い例です。
  • マークアップ言語(XMLの方言)を用いてGUIのレイアウトを定義してプログラムにロードします。XUL がこの形式です。

OpenStep はプログラムの生成計画に基づいています。OpenStepが不明な構成要素はオブジェクトのグラフをシリアライズ/デシリアライズするメカニズムです。グラフを手動で生成することが可能ではありますが通常はNeXT Interface Builder ユーティリティを使用します。生成されるファイルはファイル拡張子から NIB (NIBは NeXT Interface Builderの短縮)と呼ばれます。

GNUstep には NeXT Interface Builder を置き換えた Graphical Object Relationship Modeller (Gorm) が在ります。名前が示すようにインターフェース設計以上の機能を提供します。例としてドキュメント ドリブンのアプリケーションの使用があります。ドキュメントを備えたビュークラスのウィンドウがモデルとコントローラーを含んで同じ NIB に保存されます。新しいドキュメントを作成したい場合、単にNIBのコピーを作って継続します。

NeXTStepかOS Xからコードを移植するときGNUstepユーザが伝統的に行きあたった1つの問題はNeXTのバイナリのNIB形式がよく理解されていなかったということでした。回避策としてはプログラムをNeXTマシンで動かすしてビルトイン ライブラリを使って NIB を読み込み GNUstep ライブラリを書いてゆくことでした。しかし OPENSTEP(または、OS X)マシンへのアクセスを必要としたので、これは最適解ではありませんでした。

OS X 10.2 から Apple は NIB ファイルに XML フォーマットを導入しました。若干のリバースエンジニアリングを経て理解されるようになり、GNUstep(および、Gorm)の最新版ではそれを使うことができます。この取り決めのおかげで OS Xからアプリケーションを移植するのがはるかに簡単になります。

GNUstep Make

GNUstep Make パッケージは GNU メイクファイル のコレクションを含み、GNUstep プログラムを構築するためのスケルトンを提供します。これは、GNUstepアプリケーションをコマンドラインから作り上げることを比較的簡単にします。以下のコードはシンプルなコマンドラインツールを構築するのに用いられる単純なGNUメイクファイルです:

# Include the common variables defined by the Makefile Package
include $(GNUSTEP_MAKEFILES)/common.make
# Build a simple Objective-C program
TOOL_NAME = ExampleProgram
# The Objective-C files to compile
ExampleProgram_OBJC_FILES = Example.m
-include GNUmakefile.preamble
# Include in the rules for making command line tools
include $(GNUSTEP_MAKEFILES)/tool.make
-include GNUmakefile.postamble

最初と最後の数行で GNUstep のメイク規則をインクルードしています。追加する唯一の行はツールの名前とソースファイルの指定です。 他にはCソースファイル、フレームワークなどを追加するために定義された標準の変数名があります。

でも不細工!

一般にGNUstepに向けられる不満のうちの1つはルックスが悪いということです。理由のひとつにGNUstep は NeXT のカラースキーマを採用していることが挙げられます。NeXT マシンのモニタは常に高い品質で慎重に調整されていました。パソコンのモニタの大半は調整されていませんので、ガンマが低くなります。結果的に NeXT のカラースキーマが暗く見えてしまうのです。

他の問題にウィジェットの形があります。1980年代後半に良く見えていたデザインは、現在では時代遅れに見えます。このファッション問題にもかかわらず、彼らはまだ非常に使えます。より新しい見栄えを望んでいる人々のために、Cameleonテーマエンジンが GNUstep に追加されました。これは最新のルックスを実現します。Nesedahテーマは数々のユーザビリティ レビューの上で進化し、現代的でプロフェッショナルなルックスを手に入れました。

GNUstep アプリケーションに慣れない要因としてメニューがあります。どんなGNUstepアプリケーションでもメインメニューは画面の左上隅に配置されます。または右クリックすることによってメニューを呼び出すこともできます。 ユーザビリティの観点からスクリーンの角は非常にクリックしやすいのでかなり良いプランですが、多くのユーザにとってなじみがない傾向があります。WildMenusバンドルを追加すれば Mac OSユーザーにとって身近な水平のメニューバーに変えることもできます。

まとめ

GNUstep は私のお気に入りのフリーソフトウェア プロジェクトのひとつです。開発環境は私が今までに使用した中で最も良いものの1つです。そして、チームはりっぱな仕事をし続けています。

近年、ギークの世界での OS X の人気によって多くの人々がCocoa を通じて OpenStep を知ることになりました。GNUstep は OpenStep の代替物となるフリーソフトウェアです。

参考文献


最終更新日: 2009年11月25日(水) / カテゴリー: プログラミング・ソフトウェア開発


Back to top