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 の下)に保存。

  1. #include <Foundation/NSObject.h>  
  2. #include <stdio.h>  
  3.   
  4. @interface HelloWorld : NSObject  
  5. - (void) hello;  
  6. @end  
  7.   
  8. @implementation HelloWorld  
  9.   
  10. - (void) hello{  
  11.   printf("Hello World.\n");  
  12. }  
  13.   
  14. @end  
  15.   
  16. int main(int argc, char **argv){  
  17.   id obj = [HelloWorld alloc];  
  18.   [obj hello];  
  19.     
  20.   return 0;  
  21. }  

コンパイルは
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 で書くならば以下のようになるだろう(違ったらごめん)。

  1. interface IHelloWorld {  
  2.      public void hello();  
  3. }  
  4.   
  5. class CHelloWorld implements IHelloWorld {  
  6.      @Override  
  7.      public void hello() {  
  8.          System.out.println("Hello world");  
  9.      }  
  10. }  
  11.   
  12. class Main {  
  13.     public static void main(String[] args) {  
  14.         IHelloWorld obj = new CHelloWorld();  
  15.         obj.hello();  
  16.     }  
  17. }  

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

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

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