WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

Objective-Cで”Hello World!”(Xcode未使用)

      2015/01/14

Xcodeを使わないHello World!の出力

ここではプログラミング言語の入門の定番である”Hello World!”の出力をObjective-Cでやってみます。

実はXcodeでは”Hello World!”を出力するコードが雛形として用意されています。このこと(Xcodeでの”Hello World!”)については下記の記事が詳しいです。
はじめてのObjective-C まずは”Hello, World!”から

ここではXcodeを使わず、テキストエディタで書いたコードをコンパイラでコンパイルして”Hello World!”を実行してみます。
コンパイラはclangでもgccでもどちらでもかまいませんが、どちらもない場合はXcodeなどを経由してインストールしておく必要があります※1

コードの実装

“Hello World!”を出力するコードは以下の通りになります。

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

@interface Greeter : NSObject
- (void) sayHello;
@end

@implementation Greeter

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

@end

int main(void) {
  id greeter = [Greeter alloc];
  [greeter sayHello];

  return 0;
}

テキストエディタでhello_world.mというファイル名でこれを保存し、以下のコマンドでコンパイルしてみてください。
実行すると”Hello World!”と出力されるはずです。

$ clang hello_world.m -framework Foundation
$ ./a.out
Hello World.

このファイルの先頭ではFoundation/NSObject.hをインポート(読み込み)しています。また、コンパイル時にも-frameworkで”Foundation”と指定しています。
これは、Foundationフレームワークというものを使うための処理です。

FoundationフレームワークはObjective-Cでプログラミングを行うためのライブラリで、Objective-Cでプログラミングを行う時にこれを読み込む必要があります。

分割コンパイル

このような単純なコードだと上記のようにひとつのファイルに必要な処理をすべてまとめて書いたほうが楽なんですが、コードが複雑になるとファイルを分割しないと保守性が低下することになります(※2)。

Objective-Cではひとつのクラスを実装するときにインターフェースファイルと実装ファイルにの2つのファイルを作成するのが普通です。

インターフェースファイルにはクラスに含まれるインスタンス変数やメソッドのプロトタイプ宣言を行います。つまりヘッダファイルです。ファイル名は「クラス名.h」になります。
実装ファイルではインターフェースファイルで宣言したクラスのメソッドなどを実装します。ファイル名は「クラス名.m」になります。

今回の例では以下の通りとなります。

Greeter.h

#include <Foundation/NSObject.h>

@interface Greeter : NSObject
- (void) sayHello;
@end

Greeter.m

#import "Greeter.h"
#import <stdio.h>

@implementation Greeter

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

@end

実装ファイルでは、インターフェース情報を知る必要があるため、必ず対応するインターフェースファイルをインポートする必要があります。

また、main関数を定義するファイルも作りますが、GreeterクラスのようなObjective-C特有の記法を用いているものを実行するため、拡張子は.mにする必要があります。

main.m

#import "Greeter.h"

int main(void) {
  id greeter = [Greeter alloc];
  [greeter sayHello];

  return 0;
}

この3つのファイルをC言語での分割コンパイルと同じように実行することができます。
例えば、コンパイルからリンクまでを一括で行う場合は以下の通りです。

$ clang main.m Greeter.m -framework Foundation
$ ./a.out
Hello World.

オブジェクトファイルを作成してからリンクを行うパターンは以下の通りです。

$ clang -c main.m
$ clang -c Greeter.m
$ clang main.o Greeter.o -framework Foundation

謝辞

このページを作成するにあたって以下を参考にさせていただきました。ありがとうございます。

注釈

1

clangに関しての簡単な説明は以下のページを見てください。
作成したソースコードをコンパイルする

gccのインストールは下記のページが参考になります。
Mountain Lion (Mac OS X 10.8)にgccをインストールする – memo.yomukaku.net

2

また、ひとつのファイルにまとめる方法だとインターフェース部を先に記述しなければなりません。C言語でプロトタイプ宣言をしないと関数の定義を先に行わなければいけないのと同じです。

 - Objective-C , ,