Objective-C 入門(1) 他の言語と比較して `hello, world'

Mac 使いとして、Objective-C の一つや二つ使えないのは悲しいので(Cocoaが使えない!)勉強してみることにしました。
初心者の観点でしかかけませんが、何かお気づきの点はアドバイス頂ければ幸いです。

他の言語と比較して `hello, world'



まずは処理系のインストール

Mac な人はそのまま何も考えずにプログラミングに入れます ;-)
Linux な人は、処理系をインストールしてみましょう。
とりえあず、Debian GNU/Linux 4.0(etch) では apt-get を使って Objective-C 対応の gcc (gobjc) と、フレームワーク(GNUstep) をインストールすることができます。

% sudo apt-get install build-essential gobjc libgnustep-base-dev gnustep-devel


C++ で `hello, world'

main.cpp


#include

#include "Hello.h"

int
main(int argc, char *argv[])
{
using std::cout;
using std::endl;

CHello *hello;

hello = new CHello("hello, world");

cout << *hello->getMessage() << endl;

delete hello;

return (0);
}

Hello.h


#ifndef HELLO_H_
#define HELLO_H_

#include

using std::string;

class CHello {
private:
string * m_message;

public:
CHello(const char *message_);
virtual ~CHello();

string *getMessage(void);
};
#endif /*HELLO_H_*/

Hello.cpp


#include "Hello.h"

using std::string;

CHello::CHello(const char *message_)
{
m_message = new string(message_);
}

CHello::~CHello()
{
delete m_message;
}

string *
CHello::getMessage()
{
return (m_message);
}

Makefile


CC = g++
CPPFLAGS= -Wall -g
LDFLAGS =

LD = g++

HELLO = hello

SRCS = main.cpp Hello.cpp

HEADS = $(SRCS:.cpp=.h)
OBJS = $(SRCS:.cpp=.o)

all: $(HELLO)

clean:
$(RM) $(RMFLAGS) $(OBJS) $(HELLO)

$(HELLO): $(OBJS)
$(CC) $(LDFLAGS) -o $(HELLO) $(OBJS)

.SUFFIXES:.o .cpp
.cpp.o:
$(CC) -c $(CPPFLAGS) $<

コンパイルと実行


% make
g++ -c -Wall -g main.cpp
g++ -c -Wall -g Hello.cpp
g++ -o hello main.o Hello.o
% ./hello
hello, world

Objective-C で `hello, world'

では、これを Objective-C で書いてみると・・・

main.m


#import
#import

#import "Hello.h"

int
main(int argc, char *argv[])
{
NSAutoreleasePool *pool;
id hello;

pool = [[NSAutoreleasePool alloc] init];

hello = [[CHello alloc] init:"hello, world"];

printf("%s\n", [[hello getMessage] cStringUsingEncoding:NSUTF8StringEncoding]);

[hello dealloc];

return (0);
}

Hello.h


#ifndef HELLO_H_
#define HELLO_H_

#import
#import

@interface CHello :NSObject
{
@private
NSString *m_message;
}
- (id) init:(const char *) message_;
- (void) dealloc;

- (NSString *) getMessage;
@end
#endif /*HELLO_H_*/

Hello.m


#import "Hello.h"

@implementation CHello
- (id) init:(const char *) message_ {
m_message = [[NSString alloc] initWithCString:message_ encoding:NSUTF8StringEncoding];

return (self);
}

- (void) dealloc {
[m_message release];

[super dealloc];
}

- (NSString *) getMessage {
return (m_message);
}
@end

Makefile


CC = gcc
CFLAGS = -Wall -g -I/usr/include/GNUstep/Headers/
LDFLAGS = -lobjc -L/usr/lib/GNUstep/System/Library/Libraries/ -lgnustep-base

LD = gcc

HELLO = hello

SRCS = main.m Hello.m

HEADS = $(SRCS:.m=.h)
OBJS = $(SRCS:.m=.o)

all: $(HELLO)

clean:
$(RM) $(RMFLAGS) $(OBJS) $(HELLO)

$(HELLO): $(OBJS)
$(CC) $(LDFLAGS) -o $(HELLO) $(OBJS)

.SUFFIXES:.o .m
.m.o:
$(CC) -c $(CFLAGS) $<

コンパイルと実行


% make
gcc -c -Wall -g -I/usr/include/GNUstep/Headers/ main.m
gcc -c -Wall -g -I/usr/include/GNUstep/Headers/ Hello.m
gcc -lobjc -L/usr/lib/GNUstep/System/Library/Libraries/ -lgnustep-base -o hello main.o Hello.o
% ./hello
hello, world

めでたく同じ結果となりました!

次回はこの `hello, world' を OSX 上で動かしてみたいと思います