Adaは、 Pascalなどの言語に触発された、構造化、静的型付け、命令型、オブジェクト指向の 高水準プログラミング言語です。契約による設計(DbC)、非常に強い型付け、明示的な並行性、タスク、同期メッセージパッシング、保護されたオブジェクト、非決定性などの言語サポートが組み込まれています。Adaは、コンパイラを使用して実行時エラーではなくエラーを検出することで、コードの安全性と保守性を向上させます。Adaは、国際標準化機構(ISO)と国際電気標準会議(IEC)によって共同で定義された国際技術標準です。2023年5月現在、この標準規格ISO/IEC 8652:2023は非公式にAda 2022と呼ばれています。[11] [アップデート]
Adaは、1977年から1983年にかけて米国国防総省(DoD)との契約に基づき、ハネウェル社のフランス人コンピュータ科学者 ジャン・イクビア率いるチームによって、当時DoDで使用されていた450以上のプログラミング言語に取って代わるものとして設計されました。[12] Adaは、世界初のコンピュータプログラマーとして知られるエイダ・ラブレス(1815-1852)にちなんで名付けられました。 [13]
Adaはもともと組み込みシステムとリアルタイムシステム向けに設計されました。 1992年から1995年にかけてIntermetrics社のS. Tucker Taftによって設計されたAda 95改訂版では、システムプログラミング、数値計算、金融、そしてオブジェクト指向プログラミング(OOP)のサポートが強化されました。
Adaの機能には、強力な型付け、モジュール型プログラミング機構(パッケージ)、実行時チェック、並列処理(タスク、同期メッセージパッシング、保護オブジェクト、非決定性SELECT文)、例外処理、ジェネリックなどがあります。Ada 95では、動的ディスパッチを含むオブジェクト指向プログラミングのサポートが追加されました。
Ada の構文では、基本的な演算を実行する方法の選択肢が最小限に抑えられており、記号 ( や など) よりも英語のキーワード ( や など) が優先or elseされます。Ada では基本的な算術演算子、、、 を使用しますが、その他の記号は使用しません。コードブロックは「declare」、「begin」、「end」などの単語で区切られ、「end」の後には (ほとんどの場合) ブロックを閉じるキーワード (例: ... 、... ) が続きます。条件ブロックの場合、これにより、 C や Java などの他の言語で誤ってネストされた「if」式とペアになる可能性のある、ぶら下がった else を回避できます。
and then||&&+-*/ifend ifloopend loop
Adaは、非常に大規模なソフトウェアシステムの開発向けに設計されています。Adaパッケージは個別にコンパイルできます。また、Adaパッケージ仕様(パッケージインターフェース)も実装なしで個別にコンパイルでき、整合性をチェックできます。これにより、実装開始前の設計段階で早期に問題を検出できます。
他の言語では実行時まで検出できなかったり、ソースコードに明示的なチェックを追加する必要があるバグを回避するために、多数のコンパイル時チェックがサポートされている。たとえば、構文では、不一致の終了トークンによるエラーを防ぐために、明示的に名前付きのブロックの終了が必要である。強い型付けに準拠することで、コンパイル時または実行時に多くの一般的なソフトウェアエラー(間違ったパラメータ、範囲違反、無効な参照、不一致の型など)を検出できる。並行性は言語仕様の一部であるため、コンパイラは場合によっては潜在的なデッドロックを検出できる。[14]コンパイラは通常、識別子のスペルミス、パッケージの可視性、冗長な宣言などをチェックし、警告とエラーを修正する方法に関する有用な提案を提供できる。
Adaは、未割り当てメモリへのアクセス、バッファオーバーフローエラー、範囲違反、off-by-oneエラー、配列アクセスエラー、その他の検出可能なバグから保護するための実行時チェックもサポートしています。これらのチェックは実行効率を優先して無効にすることもできますが、多くの場合、効率的にコンパイルできます。また、プログラム検証を支援する機能も備えています。これらの理由から、Adaは、いかなる異常も事故による死亡、負傷、または深刻な経済的損失など、非常に深刻な結果につながる可能性のある重要なシステムで使用されることがあります。Adaが使用されているシステムの例としては、航空電子工学、航空管制、鉄道、銀行、軍事、宇宙技術などが挙げられます。[15] [16]
Ada の動的メモリ管理は高水準かつ型安全です。Ada には汎用ポインタや型指定のないポインタはなく、また暗黙的にポインタ型を宣言することもありません。その代わりに、すべての動的メモリの割り当てと解放は明示的に宣言されたアクセス型を介して行う必要があります。各アクセス型には、メモリ管理の低水準の詳細を扱うストレージプールが関連付けられています。プログラマはデフォルトのストレージプールを使用することも、新しいストレージプールを定義することもできます (これは特にNon-Uniform Memory Accessに関係します)。すべて同じ型を指定しながらも異なるストレージプールを使用する、複数の異なるアクセス型を宣言することも可能です。また、この言語はコンパイル時と実行時の両方でアクセシビリティ チェックを提供しており、アクセス値がそれが指すオブジェクトの型よりも長く存続できないことを保証します。[17]
言語のセマンティクスではアクセスできないオブジェクトの自動ガベージコレクションが可能ですが、リアルタイムシステムでは予測できない動作を引き起こす可能性があるため、ほとんどの実装ではデフォルトでサポートされていません。Adaは限定的な領域ベースのメモリ管理をサポートしており、Adaではストレージプールを破棄すると、プール内のすべてのオブジェクトも破棄されます。
二重ダッシュ( --) は、エムダッシュに似ており、コメントテキストを示します。コメントは行末で終了します。閉じられていないコメントによって誤ってソースコードの一部分全体が無効になるのを防ぐため、コメントを複数行にまたがることはできません。したがって、コードブロック全体を無効にするには、各行 (または列) の前に を個別に付ける必要があります--。これにより、ページ全体に '--' の列が作成され、無効なコードであることが明確に示されますが、ブロックコメントをサポートしていないエディターでは、大きなブロックの実験的な無効化/再有効化がより時間のかかるプロセスになります。
セミコロン(;)は文の終了記号であり、ヌルまたは無処理文は です。終了する文のない
null;単一の文は許可されません。;
ほとんどのISO規格とは異なり、Ada言語定義(AdaリファレンスマニュアルまたはARM、あるいは言語リファレンスマニュアルまたはLRMと呼ばれる)はフリーコンテンツです。そのため、Adaコンパイラを実装するプログラマだけでなく、Adaプログラマにとって共通のリファレンスとなっています。リファレンスマニュアルとは別に、言語設計と様々な言語構成要素の使用方法を解説した詳細な根拠文書も用意されています。この文書もプログラマに広く利用されています。言語が改訂された際には、新たな根拠文書が作成されました。
多くの Ada プログラマーが Ada ソース コードの作成を支援するために使用する注目すべき無料ソフトウェアツールの1 つが、GNAT Programming Studio です。これは、GNU コンパイラー コレクションの一部です。
AlireはAda用のパッケージおよびツールチェーン管理ツールです。[18]
1970年代、米国国防総省(DoD)は、組み込みコンピュータシステムのプロジェクトで使用されているさまざまなプログラミング言語の数に懸念を抱きました。これらの言語の多くは時代遅れであったり、ハードウェアに依存していたり、安全なモジュールプログラミングをサポートしていなかったりしました。1975年に、高階言語ワーキンググループ(HOLWG)というワーキンググループが結成され、省と英国国防省の要件に一般的に適したプログラミング言語を見つけるか作成することで、この数を減らすことが目的でした。最初の仮案[19]から始まった多くの反復の後、最終的なプログラミング言語はAdaと名付けられました。そのようなプロジェクトで使用されていた高水準プログラミング言語の総数は、1983年の450以上から1996年には37にまで減少しました。
HOLWGは、プログラミング言語が満たすべき要件を述べた一連の文書であるSteelman言語要件を作成した。多くの既存言語が正式に検討されたが、チームは1977年に既存の言語では仕様を満たしていないという結論に達した。この要件は、1978年に米国国防総省の共通高階言語プログラムで作成された。この文書の前身は、順に「ストローマン」、「ウッデンマン」、「ティンマン」、「アイアンマン」と呼ばれていた。[20]この要件は組み込みコンピュータアプリケーションのニーズに焦点を当て、信頼性、保守性、効率性を重視した。特に、例外処理機能、実行時チェック、並列コンピューティングが含まれていた。
既存の言語はこれらの基準を十分に満たしていないという結論に至り、[21]より要件を満たす言語を作成するためのコンテストが開催されました。このコンテストで優勝した設計がAdaプログラミング言語となりました。結果として生まれた言語は、Steelmanの要件に完全に準拠しているわけではありませんが、かなり忠実に準拠していました。

新しいプログラミング言語の提案依頼書が発行され、4つの請負業者がRed(ベンジャミン・ブロスゴール率いるインターメトリクス)、Green(ジャン・イクビア率いるハネウェル)、Blue(ジョン・グッドイナフ率いるソフテック) [22]、Yellow(ジェイ・スピッツェン率いるSRIインターナショナル)の名前で提案の開発のために雇われました。1978年4月、公開の精査の後、RedとGreenの提案は次の段階に進みました。1979年5月、ハネウェルのジャン・イクビアによって設計されたグリーンの提案が選ばれ、通常エイダ・ラブレスとして知られるオーガスタ・エイダ・キング、ラブレス伯爵夫人にちなんでAdaと名付けられました。この提案は、イクビアと彼のグループが1970年代に開発した言語LISの影響を受けていました。 Adaの暫定リファレンスマニュアルは、1979年6月にACM SIGPLAN Noticesに掲載されました。Military Standardリファレンスマニュアルは1980年12月10日(エイダ・ラブレスの誕生日)に承認され、エイダ・ラブレスの生誕年にちなんでMIL-STD-1815という番号が与えられました。1981年、トニー・ホーアはチューリング賞受賞スピーチでAdaが過度に複雑で信頼性に欠けると批判しましたが[23]、その後、Adaの教科書に書いた序文でその批判を撤回したようです[24] 。
Adaは初期の頃、プログラミングコミュニティ全体から大きな注目を集めました。支持者をはじめとする人々は、Adaが防衛関連分野だけでなく、汎用プログラミングの主要言語になる可能性があると予測していました。[25]イクビアは、10年以内に残るプログラミング言語はAdaとLispの2つだけになると公言しました。[26] 初期のAdaコンパイラは、大規模で複雑な言語の実装に苦労し、コンパイル時と実行時の両方のパフォーマンスが遅く、ツールも原始的でした。[25] コンパイラベンダーは、Ada言語開発のもう一つの革新的な機能として求められていた、政府が義務付けた大規模な言語適合性テストであるAdaコンパイラ検証機能(ACVC)の検証スイートに合格することに、ほとんどの労力を費やしました。[26]
最初の検証済みAda実装はNYU Ada/Edトランスレータ[27]で、 1983年4月11日に認定されました。NYU Ada/Edは高級セット言語SETLで実装されています。[28] Alsys、TeleSoft、DDC-I、Advanced Computer Techniques、Tartan Laboratories、Irvine Compiler、TLD Systems、Verdixなど、いくつかの民間企業がAdaコンパイラと関連開発ツールの提供を開始しました。[29]防衛、航空宇宙、または関連産業で重要なビジネスを展開しているコンピュータメーカーも、自社のプラットフォームでAdaコンパイラとツールを提供しました。これらには、Concurrent Computer Corporation、Cray Research、Inc.、Digital Equipment Corporation、Harris Computer Systems、およびSiemens Nixdorf Informationssysteme AGが含まれます。[29]
1991年、米国国防総省はすべてのソフトウェアにAdaの使用を義務付け始めました(Ada義務)[30]が、この規則にはしばしば例外が認められました。[25] 国防総省のAda義務は、国防総省が市販の(COTS)技術を採用し始めた1997年に事実上廃止されました。[25]他のNATO諸国でも同様の要件がありました。NATOの指揮統制やその他の機能を含むシステムにはAdaが必須であり、スウェーデン、ドイツ、カナダなどの国では防衛関連のアプリケーションにAdaが義務付けられているか、推奨されている言語でした。[31]
1980年代後半から1990年代初頭にかけて、Adaコンパイラのパフォーマンスは向上しましたが、ほとんどのリアルタイムプログラマが慣れ親しんだものとは異なるタスクモデルなど、Adaの能力を最大限に活用するための障壁がまだありました。[26]
Ada のセーフティクリティカルなサポート機能のおかげで、Ada は軍事用途だけではなく、ソフトウェアのバグが深刻な結果をもたらす可能性がある商用プロジェクトにも使用されています。たとえば、航空電子機器や航空管制、アリアネ 4 や 5などの商用ロケット、人工衛星やその他の宇宙システム、鉄道輸送、銀行などです。[16]たとえば、ボーイング 777のフライ・バイ・ワイヤシステムソフトウェアである プライマリフライトコントロールシステムはAda で書かれており、空気力学的に不安定なユーロファイター タイフーン、[32]サーブ グリペン、[33]ロッキードマーチン F-22 ラプターのフライ・バイ・ワイヤシステムやグラマン F-14 トムキャットの DFCS 代替フライトコントロールシステムもAdaで書かれています。カナダの自動航空交通システムは 100 万行の Ada ( SLOCカウント)で書かれています。 Adaは他の航空交通システムにも利用されており、例えば英国の次世代航空交通管制システムである暫定将来エリア管制ツール支援(iFACTS)はSPARK Adaを使用して設計・実装されている。[34] また、フランスのTGV高速鉄道システムのTVM車内信号システムや、パリ、ロンドン、香港、ニューヨークの地下鉄近郊列車にも利用されている。[16] [35]
Ada 95言語の改訂版はSteelmanの要件を超え、組み込みシステムに加えて汎用システムを対象とし、オブジェクト指向プログラミングをサポートする機能を追加しました。[36]
予備的なAdaはACM Sigplan Notices Vol 14, No 6, June 1979に掲載されています[37]
Adaは1980年にANSI規格ANSI/ MIL-STD 1815として初めて発行されました。この最初のバージョンには多くの誤りや矛盾があったため、[a] 1983年にANSI/MIL-STD 1815Aとして改訂版が発行されました。その後、変更はなく、1987年にISO規格となりました。[39]このバージョンの言語は、ANSIによる採用日にちなんでAda 83として一般的に知られていますが、 ISOによる採用日にちなんでAda 87と呼ばれることもあります。 [40]フランス語訳もあり、1988年にはDINによってドイツ語に翻訳され、DIN 66268となりました。
Ada 95は、ISO/IEC/ANSI共同規格ISO/IEC 8652:1995 [41] [42]として1995年2月に発行され、最初のISO規格オブジェクト指向プログラミング言語となりました。この規格の改訂と将来の普及を支援するため、米国空軍はGNAT コンパイラの開発に資金を提供しました。現在、GNATコンパイラはGNUコンパイラコレクションの一部となっています。
Ada言語の技術的内容の改善と更新作業は継続して行われています。Ada 95の技術的正誤表は2001年10月に発行され[43] [44]、主要な改訂版であるISO/IEC 8652:1995/Amd 1:2007 [45] [46]は2007年3月9日に発行されました。この改訂版は、新規格の作業がその年に完了したため、 一般的にAda 2005と呼ばれています。
ストックホルムで開催されたAda-Europe 2012会議で、Adaリソース協会(ARA)とAda-Europeは、Ada言語の最新バージョンの設計が完了し、リファレンスマニュアルを国際標準化機構(ISO)と国際電気標準会議(IEC)のISO/IEC JTC 1/SC 22 /WG 9に承認のために提出したことを発表しました。 ISO/IEC 8652:2012 [47](Ada 2012 RMを参照)は2012年12月に発行され、Ada 2012として知られています。技術的な正誤表であるISO/IEC 8652:2012/COR 1:2016が発行されました[48](TC 1のRM 2012を参照)。
2023年5月2日、Adaコミュニティはプログラミング言語標準のAda 2022版の発行が正式に承認されました。 [11]
Ada 83、95といった名称にもかかわらず、法的にはAda規格はISO/IECの最終規格である1つだけです。新しい規格バージョンが承認されると、以前の規格は廃止されます。その他の名称は、特定の版を指す非公式な名称です。
その他の関連規格には、ISO/IEC 8651 -3:1988情報処理システム - コンピュータ グラフィックス - グラフィカル カーネル システム (GKS) 言語バインディング - パート 3: Ada などがあります。
Adaは、 if、then、else、while、forなどの予約語を用いた制御構造を特徴とするALGOLライクなプログラミング言語です。しかし、Adaには、型定義、レコード、ポインタ、列挙体など、オリジナルのALGOL 60には含まれていなかった多くのデータ構造化機能やその他の抽象化も備わっています。これらの構造は、一部はPascalから継承、あるいはPascalに着想を得たものです。
言語構文の一般的な例としては、 「Hello, World!」プログラムがあります: (hello.adb)
Ada.Text_IOで; Ada.Text_IOを使用します ;
手順 こんにちは は
始める
Put_Line ( "こんにちは、世界!" );
終わり;
このプログラムは、無料で入手できるオープンソースコンパイラGNATを使用して、次のように実行することで コンパイルできます。
gnatmake hello.adb
Adaの型システムは、定義済みのプリミティブ型の集合に基づくのではなく、ユーザーが独自の型を宣言できます。この宣言は、型の内部表現に基づくのではなく、達成すべき目標の記述に基づいています。これにより、コンパイラは型に適したメモリサイズを決定し、コンパイル時および実行時に型定義の違反(範囲違反、バッファオーバーラン、型の一貫性など)をチェックできます。Adaは、範囲で定義される数値型、モジュロ型、集約型(レコードと配列)、および列挙型をサポートしています。アクセス型は、指定された型のインスタンスへの参照を定義します。型指定のないポインタは許可されません。言語によって提供される特別な型は、タスク型と保護型です。
たとえば、日付は次のように表されます。
タイプ Day_type の 範囲は 1 .. 31です。
Month_type 型の範囲は 1 .. 12です。
タイプ Year_type の 範囲は 1800 .. 2100です。
タイプ Hoursは mod 24です 。
曜日の タイプは(月曜日、火曜日、水曜日、木曜日、金曜日、土曜日、日曜日)です。
日付 の種類は
記録
日 : Day_type ;
月 : Month_type ;
年 : Year_type ;
レコード終了;
重要な注意: Day_type、Month_type、Year_type、Hours は互換性のない型であるため、たとえば次の式は無効です。
今日: Day_type := 4 ;
現在の月: 月の種類 := 10 ;
... 今日 + 現在の月 ... -- 不正
定義済みのプラス演算子は同じ型の値のみを追加できるため、式は不正です。
サブタイプを宣言することで型を細分化できます。
サブタイプ Working_Hours は 時間 範囲 0 .. 12です。1 日の労働時間は最大 12 時間です。
サブタイプ Working_Dayは、 平日の範囲が月曜日から金曜日です。-- 勤務日数
Work_Load : Working_Hoursの定数 配列( Working_Day ) -- 暗黙的な型宣言
:= ( Friday => 6 , Monday => 4 , others => 10 ); -- 初期化された勤務時間の参照テーブル
型には、limited、abstract、privateなどの修飾子を付けることができます。private型は内部構造を表示しません。つまり、limited型のオブジェクトはコピーできません。[49] Ada 95では、型のオブジェクト指向拡張のための機能がさらに追加されました。
Adaは構造化プログラミング言語です。つまり、制御フローは標準的なステートメントに構造化されています。すべての標準的な構文と深層レベルの早期終了がサポートされているため、同じくサポートされている「go to」コマンドを使用する必要はほとんどありません。
-- a が b と等しくない間、ループします。
while a /= b ループ
Ada . Text_IO . Put_Line ( "待機中" );
ループを終了します。
a > b ならば
Ada . Text_IO . Put_Line ( "条件が満たされました" );
それ以外
Ada . Text_IO . Put_Line ( "条件が満たされていません" );
終了の 場合;
for i in 1 .. 10 ループ
Ada . Text_IO . Put ( "反復処理: " );
Ada.Text_IO.Put ( i ) ;
Ada . Text_IO . Put_Line ;
ループを終了します。
ループ
a := a + 1 ;
a = 10のときに 終了します。
ループを終了します。
ケース i は
0 の場合=> Ada.Text_IO.Put ( " zero " ) ;
1 = > Ada.Text_IO.Put ( "one " ) ;の場合
2 = > Ada.Text_IO.Put ( "two " ) ;の場合
-- case ステートメントは、考えられるすべてのケースをカバーする必要があります。
when others => Ada . Text_IO . Put ( "上記のいずれでもない" );
終了 ケース;
for aWeekday in Weekday '範囲 ループ -- 列挙をループします
Put_Line ( Weekday ' Image ( aWeekday ) ); -- 列挙体の文字列表現を出力する
aWeekday がWorking_Dayの 場合-- 列挙のサブタイプのチェック
Put_Line ( " を " &に機能させる
Working_Hours ' Image ( Work_Load ( aWeekday )) ); -- ルックアップテーブルへのアクセス
終了の 場合;
ループを終了します。
Ada プログラムの各部分には、パッケージ、プロシージャ、関数があります。
関数は手続きとは異なり、値を返さなければなりません。関数呼び出しは「文として」使用することはできず、その結果は変数に代入されなければなりません。しかし、Ada 2012以降、関数は純粋である必要はなく、適切に宣言されたパラメータやグローバル状態を変更することができます。[50]
例: パッケージ仕様 (example.ads)
パッケージの 例 は
型 Number の 範囲は 1 .. 11です。
手順 Print_and_Increment ( j : in out Number );
例の終了;
パッケージ本体 (example.adb)
Ada.Text_IOを使用;
パッケージ 本体の 例 は
i : Number := Number '最初;
手順 Print_and_Increment ( j : in out Number ) は
関数 Next ( k : in Number ) 戻り 値 Number is
始める
k + 1を返します。
次へ終了;
始める
Ada . Text_IO . Put_Line ( "合計は: " & Number ' Image ( j ) );
j := 次へ ( j );
Print_and_Increment を終了します。
-- パッケージが作成された時に実行されるパッケージ初期化
始める
while i < Number '最後の ループ
印刷と増分 ( i );
ループを終了します。
例の終了;
このプログラムは、例えば、無料で利用できるオープンソースコンパイラGNATを使用して、次のように実行することで コンパイルできます。
gnatmake -z example.adb
パッケージ、プロシージャ、関数は任意の深さまでネストすることができ、それぞれが論理的に最も外側のブロックになることもできます。
各パッケージ、プロシージャ、または関数には、定数、型、変数、およびその他のプロシージャ、関数、およびパッケージの独自の宣言を含めることができ、これらは任意の順序で宣言できます。
プラグマはコンパイラに情報を伝え、コンパイルされた出力の特定の操作を可能にするコンパイラディレクティブです。 [51] 一部のプラグマは言語に組み込まれていますが、[52]その他のプラグマは実装に固有です。
コンパイラ プラグマの一般的な使用例としては、実行時の型チェックや配列の添え字境界チェックなどの特定の機能を無効にしたり、関数呼び出しの代わりにオブジェクト コードを挿入するようにコンパイラに指示したりすることが挙げられます (C/C++ がインライン関数で行うように)。
Adaは1977年から1980年にかけて最初に設計された時からジェネリック関数を採用しています。標準ライブラリは多くのサービスを提供するためにジェネリック関数を使用しています。Ada 2005では、C++の標準テンプレートライブラリに着想を得た包括的なジェネリックコンテナライブラリが標準ライブラリに追加されました。[53] [54]
ジェネリックユニットとは、1つ以上のジェネリック形式パラメータを取るパッケージまたはサブプログラムである。[55]
ジェネリック仮パラメータとは、値、変数、定数、型、サブプログラム、あるいは指定された別のジェネリックユニットのインスタンスです。ジェネリック仮パラメータの場合、構文は離散型、浮動小数点型、固定小数点型、アクセス型(ポインタ型)などを区別します。一部の仮パラメータにはデフォルト値を設定できます。[56]
ジェネリックユニットをインスタンス化する には、プログラマーは各形式引数に実引数を渡します。ジェネリックインスタンスは他のユニットと同様に動作します。例えばループ内など、実行時にジェネリックユニットをインスタンス化することも可能です。 [56]{{cite journal}}: CS1 maint: DOIは2025年7月時点で非アクティブです(リンク)
これらの文書は、印刷物を含むさまざまな形式で公開されています。