目次へ戻る §21へ戻る §23へ進む

22. gcc-4 と Ada 2005

2009/1/30 (鈴)

[本章の内容は Cygwin 1.5.25 で確認しました]

22.1 gcc-4.exe

少し前から Cygwin で gcc 4.3.2 がサポートされています。 今までの gcc 3.4.4 が gcc.exe というコマンド名であるのに対して gcc 4.3.2 は gcc-4.exe というコマンド名です。

01:~$ gcc --version
gcc (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

01:~$ gcc-4 --version
gcc-4 (GCC) 4.3.2 20080827 (alpha-testing) 1
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

01:~$ 

gcc-4.exe は gcc4-core パッケージに属しています。

01:~$ type gcc-4
gcc-4 is /usr/bin/gcc-4
01:~$ cygcheck -f /usr/bin/gcc-4
gcc4-core-4.3.2-1
01:~$ 

/usr/lib/gcc/ 以下の付属ライブラリもバージョン番号で分かれていますから共存が可能です。

01:~$ ls /usr/lib/gcc/i686-pc-cygwin/
3.4.4/  4.3.2/
01:~$ 

22.2 Ada 2005

ここで注目すべき点は,gcc4-ada パッケージをインストールすれば,gnat-4.exe として Ada 2005 (www.adaic.org および www.ada-auth.org を参照) を手軽に試すことができる点です。 流行を四半世紀先取りしてジェネリクスを備えた Ada 83,仮想関数を採り入れた Ada 95 に続き,Ada 2005 では限定的な多重継承の代用としての Java ライクな interface を採り入れたほか, 言語仕様のあちこちを強化しています。

言語仕様が長期にわたり大胆に拡張されながら,初期から連続性を保ち,まとまりのよさを維持している点は, 健全な成長に失敗する例が多いプログラミング言語界にあって模範とすべき貴重な例といってよいかもしれません。

gcc 4.3.2 に含まれる GNU Ada コンパイラ gnat 自体のリファレンス・マニュアルは下記にあります。

http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gnat_rm/

22.3 gcc4-ada のはじめかた

gcc4-ada をはじめる良いてほどきは,

http://gcc.gnu.org/onlinedocs/gcc-4.3.2/gnat_ugn_unw/

にある gcc 4.3.2 用の "GNAT User's Guide" の最初の1章 "Getting Started with GNAT" を 1.4 節 "Using the gnatmake Utility" まで試すことです。

ただし,Cygwin では従来の gcc との共存のためコマンド名を変えていますから,次のように読み替える必要があります。

gcc ⇒ gcc-4
gnatbind ⇒ gnatbind-4
gnatlink ⇒ gnatlink-4 --GCC=gcc-4
gnatmake ⇒ gnatmake-4 --GCC=gcc-4 --GNATBIND=gnatbind-4 --GNATLINK="gnatlink-4 --GCC=gcc-4"

各コマンドは "-4" 付きの名前に改名されていますが,各コマンドが依存する他のコマンド名をそのままにして パッケージを作成しているために,そのままでは実行時に依存するコマンドを見つけることができなくなります (このこと自体はほとんど gcc4-ada-4.3.2-1 パッケージのバグですが…)。 上記の読み替えでのオプション指定は,改名後の他コマンド名を陽に指定するものです。

もしも ~/.bash_profile で下記のように ~/bin/ にプライベートに PATH を最優先で通しているならば,

# Set PATH so it includes users' private bin if it exists
if [ -d "${HOME}/bin" ] ; then
  PATH=${HOME}/bin:${PATH}
fi

さしあたり,次のようにシンボリック・リンクをはれば読み替えが不要になります。

01:~$ cd bin
01:~/bin$ ln -s /usr/bin/gcc-4 gcc
01:~/bin$ ln -s /usr/bin/gnatbind-4 gnatbind
01:~/bin$ ln -s /usr/bin/gnatlink-4 gnatlink
01:~/bin$ ln -s /usr/bin/gnatmake-4 gnatmake

ただし,gcc から /usr/bin/gcc-4 へのシンボリック・リンクは Ada 以外のプログラムのコンパイルにも影響がありますから, 普段は消しておくなり,

01:~/bin$ mv gcc gcc~

のようにシンボリック・リンクを別の名前にして,Ada 用に使うときだけ gcc という名前にするなりします。

GNU の流儀にしたがい,可能なオプション類は --help オプションで確認できます。 gnatmake および gcc のオプションとして -gnaty を与えるとコーディング・スタイルのチェックをしてくれます。 gnatmake の他の重要なオプションとして下記があります。

-gnatwa オプショナルな警告を出力するようにする。
-gnatW8 ワイド文字のエンコーディングを UTF-8 として読む。同類に -gnatWe (EUC), -gatWs (SJIS) など。

エディタは Meadow 2.10 以降 (または同等の Emacs) が使えます。 Ada モードは他の言語モードと同じ感覚で使えます。 自動インデントが賢く,使っていて心地よく感じます。 デフォルト設定は当然ながら GNAT 推奨スタイルに従っています。 元々 GNAT がアメリカ空軍の委託によって開発されたことと関係があるのか知りませんが, このスタイルは ACM SIGAda の記事でも広く使われており,事実上,業界標準といってよさそうです。

22.4 使用例

個々のコマンドを個別に使うこともできますが,上記で紹介した "Using the gnatmake Utility" にあるように gnatamke だけで実際の作業には十分です。 複数のファイルからなるプログラムでも,依存関係を自動的に調査してコンパイルします。 例えば,次の三つのファイルがあるとします。

gmain.adb:

with Greetings;
procedure Gmain is
begin
   Greetings.Hello;
   Greetings.Goodbye;
end Gmain;

greetings.ads:

package Greetings is
   procedure Hello;
   procedure Goodbye;
end Greetings;

greetings.adb:

with Ada.Text_IO; use Ada.Text_IO;
package body Greetings is
   procedure Hello is
   begin
      Put_Line ("Hello WORLD");
   end Hello;

   procedure Goodbye is
   begin
      Put_Line ("Goodbye WORLD");
   end Goodbye;
end Greetings;

あらかじめ,前節のように ~/bin/ にコマンド名の読み替え不要のためのシンボリック・リンクを作ってあるとします。 このとき,次のようにコンパイルして実行できます。

01:~/tmp/ada$ ls
gmain.ada  greetings.adb  greetings.ads
01:~/tmp/ada$ gnatmake gmain
gcc-4 -c gmain.adb
gcc-4 -c greetings.adb
gnatbind-4 -x gmain.ali
gnatlink-4 gmain.ali --GCC=gcc-4
01:~/tmp/ada$ ls
gmain.adb  gmain.exe*  greeings.adb  greeings.ali
gmain.ali  gmain.o     greeings.ads  greeings.o
01:~/tmp/ada$ ./gmain
Hello WORLD
Goodbye WORLD
01:~/tmp/ada$ 

今度は -g スイッチでデバッグ情報を付けてコンパイルしてみます。 すでにコンパイル済みのプログラムですから,-s スイッチも与えます。 これは,前回からコンパイラ・スイッチが変更されていた場合に再コンパイルを起こします。 デバッグ情報付きですから,gdb でソースコード・デバッグができます。

01:~/tmp/ada$ gnatmake -s -g gmain
gcc-4 -c -g gmain.adb
gcc-4 -c -g greetings.adb
gnatbind-4 -x gmain.ali
gnatlink-4 gmain.ali --GCC=gcc-4 -g
01:~/tmp/ada$ ls
b~gmain.adb  b~gmain.ali  gmain.adb  gmain.exe*  greetings.adb  greetings.ali
b~gmain.ads  b~gmain.o    gmain.ali  gmain.o     greetings.ads  greetings.o
01:~/tmp/ada$ ./gmain.exe
Hello WORLD
Goodbye WORLD
01:~/tmp/ada$ gdb gmain
GNU gdb 6.8.0.20080328-cvs (cygwin-special)
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-pc-cygwin"...
(gdb) list
1       with Greetings;
2       procedure Gmain is
3       begin
4          Greetings.Hello;
5          Greetings.Goodbye;
6       end Gmain;
(gdb) break Gmain
Breakpoint 1 at 0x4013ee: file gmain.adb, line 4.
(gdb) run
Starting program: /home/suzuki/tmp/ada/gmain.exe
[New thread 880.0x42c]
[New thread 880.0x294]

Breakpoint 1, gmain () at gmain.adb:4
4          Greetings.Hello;
(gdb) s
greetings.hello () at greetings.adb:5
5             Put_Line ("Hello WORLD");
(gdb) where
#0  greetings.hello () at greetings.adb:5
#1  0x004013f3 in gmain () at gmain.adb:4
(gdb) 
目次へ戻る §21へ戻る §23へ進む

Copyright (c) 2009 Oki Software Co., Ltd.