2011/03/18

Objective-Cはじめました

【ミッション: Windows に Objective-C 開発環境を導入せよ】

iPhone アプリ開発者のしゃりんくんのお陰で、ぼくも Objective-C という言語に興味を持ってしまった。これは Apple 製品向け言語であり、iPhone や iPad 向けアプリのほぼ全てが Objective-C で開発されているという。

ぼくは Apple 製品に関してはあくまで一ユーザであり、決してディベロッパではない。そもそも Apple 製品向けアプリの開発には Mac が必要であり、いくらモチベーションが高くとも現状では難しいのだ。

しかし、今は金銭的事情によりすぐには無理でも、将来的には憧れの Mac を手に入れる日が来るかも知れない。

そこで、せいぜい Windows 上に何とかして Objective-C 環境を構築して、文法だけでも勉強してみようかなと思い立った。



Windows で Objective-C を使うには、GNUstep を導入する必要があるらしい。公式情報は英語だが、iPhone アプリ開発者人口の増加に伴い、日本語の情報も Web 上に散見されるようになった印象がある。

今回は、ぼくが見た限りではいちばん親切に解説してくれていた『[技術メモ]Windows で Objective-C の環境を作る。』を参考にした。

まずはここから、
  1. gnustep-system-0.19.2-setup.exe
  2. gnustep-core-0.19.2-setup.exe
  3. SystemPreferences-1.0.2-2-setup.exe
  4. gorm-1.2.4-setup.exe
  5. Calculator-1.0.0-2-setup.exe
の順にダウンロード & インストール。なんか不必要そうなものもある気がするが気にしない。

インストール先は「D:\GNUstep」にした(デフォルトでは「C:\GNUstep」)。



次に、コマンドプロンプトで gcc コマンドを使えるようにするため、環境変数 Path に「D:\GNUstep\bin;」を追加する。このとき、誤って Path を上書きしてしまわないように注意(GNUstep を C ドライブにインストールした場合は C:\GNUstep\bin; 。以下同様に読み替えること)。


この時点でコマンドプロンプトを起動し、gcc を空打ちしてみるのもよいかも知れない。ちゃんとパスが通っていれば、コマンドが見つからない類のエラーは出ないはずだ。



これで一応は Objective-C で書かれたソースをコンパイルできるようになったらしいので、『Objective-CのコマンドラインでHello World!』のソースを丸ごとパクってコンパイルできるかどうか試してみた。

ちなみに、下記ソースは hello.m という名前で適当な場所(ちなみにぼくは F:\objectivec の下)に保存。

#include <Foundation/NSObject.h>
#include <stdio.h>

@interface HelloWorld : NSObject
- (void) hello;
@end

@implementation HelloWorld

- (void) hello{
  printf("Hello World.\n");
}

@end

int main(int argc, char **argv){
  id obj = [HelloWorld alloc];
  [obj hello];
  
  return 0;
}

コンパイルは
gcc -o hello hello.m -I d:\GNUstep\GNUstep\System\Library\Headers -L d:\GNUstep\GNUstep\System\Library\Libraries -lobjc -lgnustep-base  -fconstant-string-class=NSConstantString -enable-auto-import
を改行なしで一気に打ち込む。なお、インクルードパスライブラリパスは、gcc 実行時のカレントフォルダに依存しないよう、絶対パスで指定した方が幸せになれるかも知れない。


コンパイルに成功すると hello.exe が生成され、これを実行すると Hello World. と表示される。

ソースの方も、全く見慣れない構文であるにも拘らず、オブジェクト指向にある程度慣れているせいか、感覚的に理解できる。

恐らく、同様の処理を Java で書くならば以下のようになるだろう(違ったらごめん)。

interface IHelloWorld {
     public void hello();
}

class CHelloWorld implements IHelloWorld {
     @Override
     public void hello() {
         System.out.println("Hello world");
     }
}

class Main {
    public static void main(String[] args) {
        IHelloWorld obj = new CHelloWorld();
        obj.hello();
    }
}

……こう書くと、途端に抵抗が無くなるから不思議である。

どうやらぼくは、使い慣れた言語との対比から新しい言語を攻略するというアプローチが有効なのかも知れない。

もうちょっと興味が出てきたら、入門書を探しに行く。 → いった