振り返ってみる

「Ada言語の現状」という検索キーワードでここにたどり着いた方がおられるらしい。ふと振り返ってみると、私が最初にAdaに触れてから、随分とAdaも変わりました。昔語りをしてみましょう。
まず、言語仕様そのものが2回版上げされています。Ada2005とAda2012です。2012のほうは、主にシンタックスシュガーが追加されたばかりで(私の中では)面白みのない改訂ということになってます。しかし、Ada2005は熱かった。世間的にAdaが一番使われていたのはAda95でそれからは降下の一方でしょうけれども、Adaを語る時は2005を基準に語りたくなる版です。
型システムやgeneric、内部表現節なんかは、Ada83の時点でほぼ完成していました、ようです。ただしAda83は余りにも柔軟性がなくて、変数のアドレスを取ることすらできませんでした、ようです。access型(ポインタ)は動的に確保したメモリ専用でした、ようです。一方で、変数をビット単位で自在に配置できたわけですから、アンバランスだったのでしょう。
Ada95で、C言語でできるようなことは一通りできるようになりました。それとパッケージの階層化とそれに伴うライブラリの整備、数値型のモデル変更。tagged型やprotectedは、まあどうでもいいです。とにかくAda2005がAda 95 Amendment 1、Ada2012がAmendment 2と呼ばれていたぐらいですから、Ada95はAdaの基本です。
Ada2005は、built-in-placeやextended return、downward closureなど、他の手続き型言語ではできないようなことが追加された版です。Ada83の時点で変数のレイアウト(データ)には強い言語だったのですが、Ada2005ではコードの側がPascalの枠を超えて強化されたわけです。これには本当にワクワクしました。access型も制限が緩和されてぐっと使いやすくなりました。packageや型の循環参照もある程度許されるようになりました。interfaceやコンテナライブラリやtaskのプロファイルは、まあどうでもいいです。
この流れで、Ada2012で追加されたのはシンタックスシュガー(と実にどうでもいい劣化Eiffel化)ぐらいなものですから、ショボーンですよ、ええ。Ada2012がいかにショボーンな版なのかは、Rationale for the Ada95 StandardRationale for Ada 2005Rationale for Ada 2012の分量を見比べていただければ一目瞭然かと。95と2005のRationaleは何度読んでも飽きません。

実装の方に目を向けますと、この間、gccのAdaフロントエンドであるGNATは、随分とまともになりました。Janus/AdaのRandy大先生は委員会のボスですし、Irvine Compilerの中の人もcomp.lang.adaの常連です。AonixもIBMもまだ活動してるようです、とはいえ、興味本位で手を出すならgcc一択なのは間違いありません。サイトには値段書いてないコンパイラもあるんだぜ、恐ろしや恐ろしや。

私が最初にAdaを触り始めた頃は、Aonixのフリー版のほうが主流だったと思います。これにはVisualC++の4ぐらい風のIDEも付いてました。gccのバージョンは3.xで、GNAT 3.15pという版が広く使われていたと思います。
そうこうしているうちにAonixのフリー版が無くなって、gccが4.xにバージョンアップして……gcc 4.2か4.3ぐらいまでのGNATフロントエンドは、はっきり言って酷いもんでした。事ある毎にBUG BOXが出て、出力コードの品質は明らかに他言語のフロントエンドに劣り、ライブラリは何かを勘違いしたとしか思えない物体の塊でした。
この時代にAdaを試された方は、言語仕様にはそれなりに感動しつつ面倒だなあと思いつつ、コンパイラの出来とあわせてまあこんなもんかで止まっている方が多いのではないでしょうか?
確か記憶が確かなら、gcc 4.4か4.5ぐらいで何が起きたかだいぶまともになったように思います。JVMや.NET用のバックエンドもこの頃にマージされた筈ですが、関係あるかはわかりません。言語仕様で見ても、4.3ぐらい?でAda 2005モードがデフォルトに採用されたはず。(Ada2005が実装され始めた4.2前後のバージョンは不安定が極まっていました。access型周りの変更に伴い、なんでもないようなコードで落ちまくってました、ええ)
ですので、これ以降のバージョンを触っていないのであれば、勿体無いの一言です。
まず、静的に初期化可能なグローバル変数(定数)は静的に初期化されるようになりました。以前は、例えばVMTみたいな固定テーブルであっても実行時に初期化コードが走ってひとつずつ値を組み立ててました。ありえんですよねー。
配列操作がインライン展開されるようになりました。今ならこういうコードも気にしなくていいです。
gccのビルトイン関数をImportして使えるようになりました。GNATの馬鹿な動作のせいで思うようなコードが得られなくても、ビルトイン関数を呼べばだいたい何とかなります。
DWARF例外テーブルの生成をOFFにできないのと、自動ベクトル化をONにできないことを除けば、Cフロントエンドと比べて生成コードの質が劣るということはなくなりました。
そして、Ada2005のanonymous access型や、面白みは無いのですが劣化STLなコンテナライブラリ、Ada2012の各シンタックスシュガー(4.7から)は、Ada95と比べて確実に記述量を減らしてくれます。(乱用すると実行ファイルサイズが膨れ上がります)
gcc 4.8では目立った新機能は無さげなのですが、AdaCoreの開発ログを見ると、地味な改良は続いています。
どこが直されるかは、恐らくAdaCoreの顧客優先で、gccのBugzillaとかにいくらレポートしても完全に無視されてるっぽいのですが、とにかく以前と比べてだいぶBUG BOXを見なくなったのは確かです。まだまだbuggyではあるのですが、構文が増えたりビルトイン関数が使えるようになったりで回避策も増えたため、以前だとどうにもならずにGNATの悪口を書き連ねて終わりだった(この日記を読み返すと我ながら言葉遣いが酷い)のが、割りとなんとかなるようになったのは確かです。

……これぐらい書いておけば、検索主さんの需要は満たせるでしょうか?不足であれば、Ada自体の記事としては、とにかくRationaleが素晴らしいので、リンクから飛んでみてください。あるいは、Wiki Booksがおすすめです。残念ながら日本語で検索しても、古い情報か、(私を含め勉強中の人が書いた)誤解を含んだ記事しか出てきません(「こんなもんか」で書かれた大抵の記事よりも、今のAdaは遥かにいろんな事ができますので、そう思っておいたほうがいいです。C++98以前の処理系の独自拡張を使わなければ何もできなかった頃のC++と今のC++が別物なのと同じです)ので、一次情報に近いところを当たると良いと思います。