勝手に補足

最近Adaの解説を書いている人が多い気が。驚くべきことにサンプル数2でも有意な(ry

インドリさん
yamicha.comさん

これ自体は非常に喜ばしいことなのですが、明らかに試しながら書かれているにも関わらず解説口調のため、一度突っ込みたくなると止まらず……というわけで勝手に補足させていただきます。
もう心の中では精一杯応援してます本当ですあとサインください。

インドリさん編。

http://indori.blog32.fc2.com/blog-entry-515.html

なお、文字コードはShift-JISにしてね!絶対ピヨ。

……ええと……いえ、なんでもございません。

cd /d C:\hello.ada

……ええと……いえ、なんでもございません。

http://indori.blog32.fc2.com/blog-entry-556.html

それに、昔のプログラム言語はオーバーロードがなかったら型ごとに関数を用意するのは当たり前だったんだ。昨今のプログラミング言語が型を意識せずに関数を使えるのはオーバーロードのお陰ピヨ。

Adaは最初からオーバーロードありました……。

http://indori.blog32.fc2.com/blog-entry-565.html

間違ってもgnatcleanは使用したら駄目ピヨォッ!!

気分的には激しく同意したいのですが、普段自分がボロカスに言っているのを棚に上げて余りにもAdaCoreが可哀想に思えて……。
とりあえず-fとか渡さない限り大丈夫ですよ……gnatcleanはむしろ.exeまで消すので融通が利かず(特定ファイルを残すオプションも無さげ)、また長いコマンドですのでタイプ数も含めて最初からdelとかrm使ったほうが遥かにマシという存在感の無さが哀れなコマンドです。
ああ、環境変数ADA_INCLUDE_PATHでgccのadaincludeディレクトリを指す使い方であればやめた方がいいです……じゃあどうすればいいかというとこれがgccを再ビルドする羽目に……configureで静的にディレクトリ決めうつ作りは心底罪と思います。とりあえずMinGWのやつならC:\mingwに置けばOKです。最悪--RTSで。

http://indori.blog32.fc2.com/blog-entry-588.html

どうやらNum < 0の結果とNumの等価性を判定しようとしているらしい。それで、BooleanとIntegerの型が違うからエラーが発生するというわけ。

まるで比較対象がBoolean型であればOKのような記述ですが、そもそもwhenのとこには定数しか書けませんです。

yamicha.comさん編

http://void.yamicha.com/blog/?mode=view&number=673

Adaのオブジェクト指向システムは後付けであるため、95の時点では少々不自然な書き方をしなければなりませんでしたが、05ではより自然に書けるようになっています。今から習得するならAda 05でしょう。ところが、MinGW付属のツールではAda 95のコンパイラしか手に入りません。したがって、何とか自力でAda 05を入手する必要があります。

この記事が書かれたのって2008年10月ですよね……。
MinGWのでもlibre2.adacore.comのでもAda2005は通りますですよ。

Adaの関数を理解する上で最初に押さえておくべきは、Adaの引数は参照渡しであるという点です。

石川先生、どうぞ。

http://void.yamicha.com/blog/?mode=view&number=675

type TShort is new Integer range -32768 .. 32767;

↑はIntegerの継承。完全に新しい型を作るのは↓です。

type TShort is range -32768 .. 32767;

実装依存の気もしますが継承だと16bitの範囲を指定しても実際にはIntegerと同じ領域が取られる気がしますような気がします違ってたらスミマセン。

http://void.yamicha.com/blog/?mode=view&number=677

サブプログラムがプリミティブになる条件の説明が必要なような……同じpackage内で宣言された、その型(とクラスワイド型)を引数・返値に使うサブプログラムは型のプリミティブとなって継承の時にくっついてきたりドット記法に使えたりまあいろいろです。(←自分で解説する気は無い)

メソッドの1つ目の引数にレコードを取り、2つ目以降の引数に必要な引数を記述します。

1つ目には限定されてないです。2つ目でも3つ目でも返値でもいいです。

http://void.yamicha.com/blog/?mode=view&number=678

Ada 83は当時としては非常に先進的な言語で、最近の多くの言語の機能を先取りしています。Ada 95でオブジェクト指向関連の機能が導入されたとはいえ、Adaの原型は83の時点で完成されていたといえるでしょう。(少なくとも当初は)Cとほぼ完全な互換性を有してはいるものの、ほとんど別物になってしまったC++とは違い、Ada 95はあくまで83の拡張の範囲内に位置しています。

まあ確かにAda95のRationalにはこんな風に書いてます。

こうして完成したAda 95は、実質的には、既存のAda 83アプリケーションと上位互換性があります。上位互換性に欠けるのは、病的なまでに特殊な機能の組合せを使ったときで、ほとんど実際に出会うことはないでしょう。もし真の意味で上位互換性に完全を期待すれば、ある種のエラーはそのまま言語に残存するでしょう。不特定多数の要求を満たすこともできないでしょう。第4章でくわしく説明されているとおり、言語を改訂するときには完全な上位互換性を確保することはできないのです。Ada 95を設計するにあたって、既存のAdaプログラムを移行するためにかかるコストを最小限におさえることに細心の注意をはらいました。
http://web.archive.org/web/20020606231107/www.tsujiken.ee.kogakuin.ac.jp/jada95_01.html

しかしAda2005のRationalにはこんな文章が!

対照的にAda95からAda2005への変更は控え目です. Ada95はAda83と互換性がありますがほぼ新言語です. しかしながら, 新言語は常に驚き無慈悲にもとても注意されたデザインが常に熱心に使われるようになるとは限りません.
……
さらなる重要な声明は"技術的に優れた結果を生むために, 利用者への影響が許容できると判断されるとき後方互換性で妥協するのが許可されている"ということです. 言い換えれば互換性について神経質にならないでください.
http://panathenaia.halfmoon.jp/alang/Ada05_rational_00.html ←私が訳しかけて投げ出したやつ

実際with Text_IO;→with Ada.Text_IO;って#include →#include に匹敵しますよねしませんかそうですか。

−− 実体型
var : Integer;
var : String(1..10);

−− 実体のない型
var : String; -- エラー

実体型ってどこから出た言葉だろう……。単にdiscriminantを持っている(具体的なdiscriminantの値なしには変数宣言できない)型ってだけの話なのに。
yamicha.comさん全体的に専門用語が変です。

type Some is new array(<>) of Integer

こんなとこにつっこむのは野暮すぎると思いつつこれがコンパイル通る文脈って無いですよね。

http://void.yamicha.com/blog/?mode=view&number=681

匿名のaccess constantもありますぜ。
あとまあaccess型についてはスコープとの関係は避けて通れないと思います。内側のaccess型は外に持ち出せないとか、'Unchecked_Accessとか。

AdaのGCの実装は、完全に実装者に一任されています。すなわち、GCのタイミングは処理系によって全く異なるのです。これはJavaサードパーティ実装でも同じなのですが、JavaにはまだSystem.gcの逃げ道があるのに比べ、Adaには全く逃げ道がありません。しかも、GNATのGC実装はといえば、プログラムの実行中には全くGCを走らせず、終了時になって全メモリを解放するという極めておざなりなものなのです。

ローカルスコープで宣言した非匿名access型であれば、スコープを抜ける時にその型でnewしたメモリは一掃されることになっています。GNATには未実装ですが……。
GNATでも、Storage_Poolをローカルスコープ内で宣言して、for T'Storage_Pool use...で明示的に結び付けてやれば、同等の効果を得ることができます。

http://void.yamicha.com/blog/?mode=view&number=688

(Ada 83にはこの抜け道すら存在したのか不明です)。

function "+" (...) renames Package_Name."+";でOK。

基底で定義された演算子は必ず継承しなければならないようです。

演算子に限らずその型を返値とするプリミティブな関数は必ずoverrideする必要があります。

http://void.yamicha.com/blog/?mode=view&number=689

Adaにインタフェースが導入されたのは95の時点でしたが

2005から!

synchronized interfaceはlimited interfaceを内包し、task及びprotected interfaceはsynchronized interfaceを内包するようです。

逆では?AがBを内包するってのが抱え込むとかの意味ならA⊇Bですよね。
ふつー内包って[x | x <- [1..5], x > 3]とかを指すみたいです。部分集合とかそういう言葉の方が良いかと。

ところで、ここで気になるのがlimited interfaceとsynchronized interfaceの差異です。

synchronized interfaceはスレッド用の属性とか持ってたりするのでは。

GNATではsynchronized interfaceもtask interfaceもprotected interfaceも平気で普通のレコードにインプリメントできてしまうのですが

そうなのかー。まあGNATだし(ry

これはおそらく、JavaC#ジェネリッククラスが「カスタマイズを可能にしたクラス」であるのに対し、C++やAdaでは型を与えるたびに実体を作成するようになっているためでしょう。一方、C++にはジェネリックの実体を作成するたびにサイズが増大するデメリットがありますが、Adaにはありません。強力なジェネリックがウリのAdaらしい仕様といえるでしょう。

ふつーに実行ファイルサイズ増大します……。
RMではコード共有タイプの実装も認められてますが、恐らくそんなコンパイラは存在しないというかrepresentationのことを考えたらできないような……。

http://void.yamicha.com/blog/?mode=view&number=690

arr'First..arr'Last

余計な突っ込みですがarr'RangeでOKです。

Javaのtry-catch-finallyと同等

finallyはないです……。

C++の後釜を狙っているらしい某言語に至っては、switchにおいてdefaultを書き忘れても堂々とコンパイルが通り、しかもswitchのcaseに該当する値がなければその場でプログラムが落ちるという最悪の実装となっています。

D……ですよね。Dは……部分範囲型が無いため仕方が無い面もあると思います。部分範囲型無しで全列挙を強制すると悲惨なことに。
それよりDelphiをどうにか(ry

フォールスルーの機能はなさそうですが、そこは仕方ありません。

関数内関数でOK。

tree : Tree_Data := Tree_Data'(10 , 20);

余談ですが型が特定できれば型名要らないです。

tree : Tree_Data := (10, 20);

http://void.yamicha.com/blog/?mode=view&number=704 (2009-03-18追記)

OCamlのデータは基本的に値渡しなのですが、そのような言語にこの種の機能が搭載されているのは非常に助かります。同じく関数型であるHaskellにはバリアントがあり、JavaC#のクラスは参照渡しが標準で、C++はvoid*など反則的なポインタの扱い方ができるとして、Adaは値渡しの上にこのようなスタイルは用いられません。したがって、例えば連想配列などからデータを取り出したいとして、Javaその他ではデータが存在しなければnullを返せるところを、Adaでは例外を投げるしか方法がありません。関数型、特に純粋なプログラミングが強制または推奨されている言語では、データが値渡しにされる場合が多いため、これは非常にありがたい機能です。
…(中略)…
モナドを使える方にとっては、実に基本的なコードでしょう。ひとたびNothingとなれば、残り全部がNothingです。OCamlは非純粋関数型言語ですし、例外の機能も備えているため、モナドのような奇策を用いなくても何とかなるのですが、そのような使い方はあまり行わないにしても、少なくともAdaのような苦労をする必要がないのは助かります。

void *(でNULLを返すこと)が有りなのになんでaccess型(でnullを返すこと)は無しなんですかー!!
あとPascal、Adaにはバリアントレコードという機能がありまして(ry

Adaの解説記事について私見

解説記事は正直Ada95と2005のRationalが凄い魔力を持っていますのであれ以上を書くのは無理な気ががが。
C99のRationalも読みましたが普通で面白みはあまりありませんでした。それが普通ですよね。Issuesでの議論の熱さも合わせて、Ada標準化委員会は異常。(誉め言葉)