logo
美しきObjective-C
Objective-Cというプログラミング言語があります。
C言語をベースにオブジェクト指向言語のSmallTalkの拡張を施した言語です。
オブジェクト指向を取り入れたC言語にC++がありますが
根本から拡張されているC++と違い
Objective-Cは素のままのC言語にSmallTalkを融合させたような形を取ります。



ロードモジュールと奇跡と魔法を呼び覚ます神々の言語
Objective-Cは世界で2番目に美しいGUIを生み出した現AppleComputer社CEOである
Steve Jobs氏がNeXTコンピュータのOSであるNeXTSTEPで採用した言語です。

NeXTSTEP自体はPC/AT互換機やHewlett Packard社のHP9000、
Sun Microsystems社のSparcStationにも移植されたようですが、残念ながら私は触れた事がありません。
現在では希にYahoo Auctionに出品されますが、
出荷台数も少なく、ファンも多い為かかなりの高値になってしまい手も足も出ないのが現状です。

そのNeXTを受け継いだのが世界で2番目に美しいGUIを持つAppleComputer社のMacOSXです。
MacOSXの開発者向けドキュメントを読めば一目瞭然ですが、
NSStringやNSArray、NSWindow等
MacOSXのAPI群(?)であるCocoaフレームワークの接頭子には"NS"が付きます。
そう、NextStepです。

そのCocoaフレームワークでのプログラミングに使われるのがObjective-Cですが、
Objective-CやMacOSだけでの物ではありません。
GNU Compiler CollectionのCコンパイラであるgccでObjective-Cを使うことが出来ます。
そう、gccの動く環境さえあれば誰でもObjective-Cの世界に触れる事が出来ます。

Objective-Cを解説したWebページは多数存在します。
私などが書くよりも遙かに優れた資料をそこで手にする事ができるでしょう。
そこで私は、Objective-Cの"外見的な"美しさについて論説したいと思います。



HelloWorld

C++とObjective-CでHelloWorldプログラムを記述してみます。

まずはC++です。

hello.h
1 class Hello
2 {
3 public:
4     Hello();
5     void SayHello( void );
6 };


hello.cpp
1 #include <stdio.h>
2 #include "hello.h"
3
4 Hello::Hello()
5 {
6 }
7
8 void Hello::SayHello( void )
9 {
10     puts( "Hello World" );
11 }
12
13 int main( void )
14 {
15     Hello *hello;
16
17     hello = new Hello();
18
19     hello->SayHello();
20
21     delete hello;
22
23     return 0;
24 }


次にObjective-Cです。

hello.h
1   #import <objc/Object.h>
2
3   @interface Hello : Object
4
5   -init;
6   -(void)SayHello;
7
8   @end


hello.m
1 #import <stdio.h>
2 #import "hello.h"
3
4 @implementation Hello
5
6 -init
7 {
8     [ super init ];
9
10     return self;
11 }
12 -(void)SayHello
13 {
14     puts( "Hello World" );
15 }
16
17 @end
18
19 int main( void )
20 {
21     id hello;
22
23     hello = [ [ Hello alloc ] init ];
24
25     [ hello SayHello ];
26
27     [ hello free ];
28
29     return 0;
30 }



双方共、実行するとコンソールにHello Worldの出力を得る事が出来ます。


Objective-Cの美しさ

私は初めてObjective-Cに取り組んだ時(とは言っても2ヶ月前ですが)、この"@implementation"と
大括弧で囲む書き方にどうしても馴染めませんでした。
そもそも私の頭は十代から叩き込まれたCOBOLとアセンブラでガチガチになっていますので無理も無いですが。

ここを精神論で解釈して行くとObjective-Cの美しさが見えてきます。
重要なのは"囲み"です。

C++でのクラスの宣言を見てみましょう。
1 class Hello
2 {
3 public:
4     Hello();
5     void SayHello( void );
6 };


classキーワードの後に名称が続き、中括弧で囲まれた空間の中でメンバの宣言を行います。
これを私の"外見から得たイメージ図"で表現すると右記(fig1)のようになります。
中括弧というのは両端が鋭く尖っています。
これが重要です。
鋭く尖った突起が両サイドに付いている物体を見て何を思い浮かべますか?
手裏剣や旧日本軍の銃剣、竹槍・・・私は暴力的な物ばかりが浮かびます。
そう、C++のクラス宣言は暴力的で閉鎖的な血生臭い外見をしているのです。

ではObjective-Cのクラス宣言を見てみましょう。
1 @interface Hello : Object
2
3 -init;
4 -(void)SayHello;
5
6 @end


@interfaceと@endで囲まれた中にメンバを宣言して行きます。
これを私の"外見から得たイメージ図"で表現すると右記(fig2)のようになります
C++の暴力的で閉鎖的な外見とは対照的に丸みを帯びた柔らかい外見的印象を受けます。
ここで重要な役割を果たしているのが"@"です。
元々円に近い形の"@"で天地を囲むので柔らかく明るい印象のソースに仕上がります。


fig1
fig1
fig2
fig2
囲み

クラスからメソッドを呼び出す過程です。

C++でのメソッドの呼び出しを見てみましょう

1   hello->SayHello();


helloに対して"->"演算子を使用してメンバを呼び出します。
この外見を言葉で表すとこんな感じになります。

俺様はhelloだ!SayHelloの糞野郎を出してやるぜ!

"->"これはまさに武器の図柄です。
棒の先に矢尻状の物が取り付けられた槍のような形状をしています。
恐らくは"hello"が"SayHello"を槍で突き刺し外に出しているのでしょう。
コンソールの出力"Hello World"はメソッド"SayHello"の断末魔の叫びです。

ではObjective-Cでの場合はどうでしょう。

1   [ hello SayHello ];


"["と"]"の間にオブジェクトとメソッドが並んだ形状です。
この外見を言葉で表すとこんな感じになります。

helloよ、SayHelloを出してくれないか?

helloからは銃器や刃物に該当するものは出ていません。
ここで重要なファクターを秘めているのが大括弧です。
"hello"と"SayHello"を器のような形状の物で優しく包みます。

これが大量に並ぶと一目瞭然です。

C++
1     hello->SayHello();
2     hello->SayHello();
3     hello->SayHello();
4     hello->SayHello();
5     hello->SayHello();
6     hello->SayHello();
7     hello->SayHello();
8     hello->SayHello();
9     hello->SayHello();


Objective-C
1     [ hello SayHello ];
2     [ hello SayHello ];
3     [ hello SayHello ];
4     [ hello SayHello ];
5     [ hello SayHello ];
6     [ hello SayHello ];
7     [ hello SayHello ];
8     [ hello SayHello ];
9     [ hello SayHello ];


並べば並ぶほどC++は暴力的な外見を増します。
9行並べてみましたが、C++の方は既に地獄絵図です。
helloから突き出た針山にSayHelloが突き刺さっています。
非常に血生臭く暴力的です。


メンバの実装

クラスメンバを宣言したらメンバを実装しなくてはなりません。
ここがJavaやC#との大きな違いです。

C++
1 void Hello::SayHello( void )
2 {
3     puts( "Hello World" );
4 }


Objective-C
1 @implementation Hello
2 -(void)SayHello
3 {
4     puts( "Hello World" );
5 }
6 @end


両者共に基本形はCですが大きな違いがあります。

C++の場合、"戻値の型 クラス名称::メンバ"の形式で記述します。
この"::"が非常に美しくありません。
一体何なのでしょうか?
何故に"::"を選んだのか私には全く理解出来ません。
4個の"黒点"が均等に並んでいます。
:: :: :: :: :: :: :: :: :: :: :: ::
:: :: :: :: :: :: :: :: :: :: :: ::
:: :: :: :: :: :: :: :: :: :: :: ::
:: :: :: :: :: :: :: :: :: :: :: ::
:: :: :: :: :: :: :: :: :: :: :: ::
:: :: :: :: :: :: :: :: :: :: :: ::
:: :: :: :: :: :: :: :: :: :: :: ::
:: :: :: :: :: :: :: :: :: :: :: ::
:: :: :: :: :: :: :: :: :: :: :: ::
殺戮凶器に昆虫の大群です。
不気味極まりないですね。
考えているうちに寒気がしてきました。

Objective-Cの場合は"@implementation~@end"句で天地を囲みます
囲まれた中にメンバを記述して行くのですが、"::"のような薄気味悪い記号はありません。

-(戻値の型) メンバ名:(型) 引数:(型) 引数・・・

この形状で実装を行います。

"-("この形が重要です。
丁度、航空機の主翼の断面図のような"形"になります
非常に滑らかでスピーディーかつシャープな印象を受けますね。
先頭の"-"を"+"にすると、C++で言うところのスタティックメンバと同じ役割を果たします。
シャープな内容物を"@implementation~@end"が優しく包み込み、全体を柔らかな印象にしてくれます。

このように美しい外見をしているので、Objective-Cでのプログラミングは目に優しく
長時間のコーディングでも目に疲れを覚える事はありません。
もっとも、エディタの背景色を目に優しい色にしておかなければ目は疲れてしまいますが。