iPhone アプリ開発者のしゃりんくんのお陰で、ぼくも Objective-C という言語に興味を持ってしまった。これは Apple 製品向け言語であり、iPhone や iPad 向けアプリのほぼ全てが Objective-C で開発されているという。
ぼくは Apple 製品に関してはあくまで一ユーザであり、決してディベロッパではない。そもそも Apple 製品向けアプリの開発には Mac が必要であり、いくらモチベーションが高くとも現状では難しいのだ。
しかし、今は金銭的事情によりすぐには無理でも、将来的には憧れの Mac を手に入れる日が来るかも知れない。
そこで、せいぜい Windows 上に何とかして Objective-C 環境を構築して、文法だけでも勉強してみようかなと思い立った。
Windows で Objective-C を使うには、GNUstep を導入する必要があるらしい。公式情報は英語だが、iPhone アプリ開発者人口の増加に伴い、日本語の情報も Web 上に散見されるようになった印象がある。
今回は、ぼくが見た限りではいちばん親切に解説してくれていた『[技術メモ]Windows で Objective-C の環境を作る。』を参考にした。
まずはここから、
- gnustep-system-0.19.2-setup.exe
- gnustep-core-0.19.2-setup.exe
- SystemPreferences-1.0.2-2-setup.exe
- gorm-1.2.4-setup.exe
- 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(); } }
……こう書くと、途端に抵抗が無くなるから不思議である。
どうやらぼくは、使い慣れた言語との対比から新しい言語を攻略するというアプローチが有効なのかも知れない。
もうちょっと興味が出てきたら、入門書を探しに行く。 → いった。