GNUコンパイラコレクションのインストール

LinuxFreeBSDは,そもそも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
#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
  • C++バージョン
    • ヘッダファイル
#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は最も手続き的言語でFortranCobolに似ていて,C++は自由度が高いのでプログラマの腕次第,という感じです.