GNUコンパイラコレクションのインストール
LinuxやFreeBSDは,そもそもgccでコンパイルされているので当然gccが入っているのですが,当然安定性重視で最新バージョンでは無いので,少し新しいバージョンをインストールしてみたくなりました.
そこで,安定版最新の4.4.2を取ってきます.
> wget http://gcc.cybermirror.org/releases/gcc-4.4.2/gcc-4.4.2.tar.bz2
富豪的に色々な言語を入れたいので(さすがにfortranやadaはいいや...),適当にオプションを指定します.
> ./configure --enable-stagel-languages=c --enable-languages=c,c++,objc,obj-c++,java > gmake -j 4
しかし,エラーが出て止まります...
/usr/bin/ld: unrecognized option '-Wl,-rpath'
libiconvが/usr/local/libにあるからっぽいです.色々整っている普通のlinuxだとこんなエラーは出ないのかもしれません.
このrpathオプションは使わないようにすることが出来て,次のようにオプションを指定してコンパイルします.
> ./configure --enable-stagel-languages=c --enable-languages=c,c++,objc,obj-c++,java --disable-rpath > su # gmake install # rehash
Hello,Worldくらいのサンプルプログラムを試してみましょう.
K&Rのみたいじゃなく,せっかくオブジェクト指向の言語ばっかりなので,クラスを作ってインスタンスにメッセージを送ってハローと言ってもらうことにします.
public class Hello { public void sayHello() { System.out.println("Hello,Java World"); } }
-
- メインプログラム
public class Main { public static void main(String[] args) { Hello msg = new Hello(); msg.sayHello(); } }
-
- コンパイル&実行
> /usr/local/bin/gcj -o hello.out --main=Main Hello.java Main.java > ./hello.out Hello,Java World
- Objective-C的バージョン
- ヘッダファイル
#import <stdio.h> #import <objc/Object.h> @interface Main:Object - (void) sayHello; @end
-
- メインプログラム
#import "Hello.mh" @implementation Main:Object - (void) sayHello { printf("Hello, Objective-C World\n"); } @end int main(int argc, char *argv[]) { id msg = [Main alloc]; [msg sayHello]; return(0); }
-
- コンパイル&実行
> /usr/local/bin/gcc -o hello-objc.out Main.m -lobjc > ./hello-objc.out Hello, Objective-C World
#import <iostream> using namespace std; class Main { public: void sayHello() { cout<<"Hello, C++ World"<<endl; }; };
-
- メインプログラム
#include "Hello.h" int main(int argc, char*argv[]) { Main *msg = new Main(); msg->sayHello(); return(0); }
-
- コンパイル&実行
> /usr/local/bin/g++ -o hello-cpp.out Main.cc In file included from Main.cc:1: Hello.h:1:2: warning: #import is a deprecated GCC extension > ./hello-cpp.out Hello, C++ World
こう見ると,名著「アルゴリズム+データ構造=プログラム」を考えると,上記で一番美しいのはobjective-cだと思います.
オブジェクトがデータと自分の振る舞いを知っていて,メッセージを受け取ると,それに応じた振る舞いをするという.
Javaは最も手続き的言語でFortranやCobolに似ていて,C++は自由度が高いのでプログラマの腕次第,という感じです.