Ada

**Ada**（エイダ）は、構造化・静的型付け・命令型・オブジェクト指向のパラダイムを持つ汎用プログラミング言語の一つである。構文はAlgol系である。

史上初のプログラマとされるエイダ・ラブレスの名前にちなんで**Ada**と命名されている。**ADA**と表記するのは誤り。

フリーのコンパイラとしては、GNATなどがある。

## 特徴

1979年、米国国防総省が信頼性、保守性に優れた、主として組み込みシステム向けの言語を作りたいという意図のもと、国際競争入札を行い4社に発注、各設計仕様書の表紙が赤、青、黄、緑だったことから、そのままそれぞれの言語名称としてRED、BLUE、YELLOW、GREENと呼ばれた。この入札で優勝したのはフランス人チームで、公平を期すため選定時にはGREENと名付けられた。そのような理由から、イメージカラーは緑である。特徴的な要件としては、大規模開発や長期保守性の観点から、
* コーディング効率よりも可読性を重視すること
* プリプロセッサマクロを持たないこと
などがあった。

プログラム言語としての機能としては、
* 強い型検査（コンパイル時および実行時）。属性によって型に関する情報が取得できる。
* 複雑な型を持つ定数。
* 手続き・関数・演算子の多重定義。
* プラグマを使った処理系依存の機能の指定。
* パッケージ（後にC++がnamespaceとして追従）
* 汎用プログラミング（後にC++がテンプレートとして追従）
* 並行プログラミング（タスク、entry/accept/select文など）
* 例外
など、当時としては先進的な機能を意欲的に取り入れたため、米国国防総省は大きなものとなってしまった言語仕様をまとめるのに、初版のStrawman（わら男、案山子の意味もある）からWoodenman（木男）、Tinman（ブリキ男、前述の案山子とともに『オズの魔法使い』に出てくる）、Ironman（鉄男）、最終版のSteelman（鋼鉄男）に至るまで5つのバージョンに分けて策定を行った。

言語仕様の大きさや厳密さのため、当時のコンピュータが持っていた資源では、処理系の実装にミニコンやワークステーション程度を必要とし、16ビットパソコンには市場性といった事情もあり実装はほとんどない。実際にはAdaは、大企業において、主として信頼性や保守性を要求されるシステムの開発でのみ普及した。というよりも、実際にどの程度徹底されたかは不明だが、策定の主体であった米国国防総省が発注するようなもの、即ち兵器の開発において条件とされたと言われる。

この時期としては先進的であった、その他の特徴としては、
; コンパイラの認定制度
: 仕様準拠か否かの検証プログラムキットが規定され、合格しない処理系は「Adaコンパイラ」と称することができない。
; 自動ビルド
: 複数モジュールの依存性から、再コンパイルの要否を自動判定する（いわゆるMakefileの記述が不要）
などがあげられる。

策定作業中に仕様が大きくなっていった際には、仕様が高度に巨大化した言語が、兵器のように高度な信頼性を要求される分野に、国防総省の「お墨付き」として使用されることを危ぶむ向きもあった。たとえばアントニー・ホーアは1980年度のチューリング賞受賞者だが、その受賞記念講演 (Turing Award Lecture) *"The Emperor's Old Clothes"* において、自身のALGOL 68（:en:ALGOL 68、やはり仕様の巨大化で知られる）に関する経験などに触れたうえで、Adaへの憂慮で締めくくっている。

## 標準
言語仕様は、最初に1983年にMIL規格として規格化され、エイダ・ラブレスの生年である1815年に因んで、**MIL-STD-1815**と採番された。この規格はANSI標準、1987年にISO標準 ISO/IEC 8652:1987 として標準化された。

1990年より、主としてタスキング仕様の改善およびオブジェクト指向の導入を目的として、ISO標準 (ISO/IEC 8652:1987) の改訂作業が開始された。1995年2月15日にISO標準として改訂が承認され、オブジェクト指向言語のうち、史上初の国際標準となった。1995年の規格は、オブジェクト指向の他、下記のような仕様も標準化されている。

* 他言語 (C/FORTRAN/COBOL) との相互運用インターフェイス
*: この時点でC++との相互運用インターフェイスが標準化できなかったのは、C++の標準化がまだだったからである（C++の標準は、紛糾を経て約3年半後の1998年9月1日に承認された）
* 分散処理 (RPC)

2000年にTechnical Amendmentが発行された（ISO/IEC 8652:1995/COR1:2000）。同改訂版は、JISでは2002年版 (JIS X 3009:2002) に対応する。JIS X 3009は本文の翻訳はしていない「要約JIS」であった。2012年1月20日を以って「国際規格周知を目的として要約JISを発行したが，周知としての目的は終了したため。」として廃止されている。

Ada の ISO 規格は、その後、2005年と2012年にも改訂されている。

## コード例
Adaのソースコードは各パッケージの宣言部を .ads ファイル (specification file) に、実装部を .adb ファイル (body file) に記述する。

リファレンスマニュアルなどでは慣例的に3スペース（空白3個）のインデントが使われている。大文字と小文字を区別しないが、識別子は慣例的に単語の先頭を大文字にして、さらに単語間をアンダースコアでつなぐ（キャメルケースとスネークケースの併用）。

### Hello World

```ada
-- Ada.Text_IO パッケージを取り込む。
with Ada.Text_IO;
-- use 節で指定することでパッケージ名の修飾を省略することも可能。
--use Ada.Text_IO;

procedure Program is
begin
   Ada.Text_IO.Put_Line("Hello, world!");
   --Put_Line("Hello, world!");
end Program;
```


### ループと条件分岐

```ada
with Ada.Text_IO, Ada.Integer_Text_IO, Ada.Float_Text_IO;
use Ada.Text_IO;

procedure Program is
   I : Integer := 0;
   F : Float;
begin
   for I in 0 .. 10 loop
      -- 左寄せで出力。
      Ada.Integer_Text_IO.Put(I, 0);
      if I mod 2 = 0 then
         Put_Line(": even number.");
      else
         Put_Line(": odd number.");
      end if;
      F := Float(I) * 0.1;
      Ada.Float_Text_IO.Put(F, 0, 1, 0);
      Put_Line("");
   end loop;
end Program;
```


## 利用例
1990年代の利用例としてはF-22戦闘機や97式魚雷などがある。2000年代に開発されたF-35戦闘機以降はモジュールの一部をC++へ移行している。

民生品ではあまり利用されていないが、信頼性を重視する航空機の制御ソフトウェアに利用されることがある。例としてはボーイング777など。

## 脚注
### 注釈

### 出典

## 外部リンク
* Ada Information Clearing House
* Ada規格
* Steelman仕様
* About Ada - Adacore

## 関連項目
* 予約語 (Ada)
* ジェネリックプログラミング