Ada(プログラミング言語)

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ
エイダ
slogan.svgのエイダマスコット
パラダイムマルチパラダイム構造化命令型オブジェクト指向配列
家族パスカル
によって設計された
  • MIL-STD-1815、Ada 83:Jean Ichbiah
  • Ada 95:タッカータフト
  • Ada 2005:タッカータフト
  • エイダ2012:タッカータフト
初登場1980年2月; 42年前 (1980-02
安定リリース
Ada 2012 TC1 [1] [2]
規律の入力静的強力安全主格
OSマルチプラットフォームまたはクロスプラットフォーム
ファイル名拡張子.adb、.ads
Webサイトwww .adaic .org
主な実装
AdaCore GNAT[3]
GreenHillsソフトウェア最適化Ada95コンパイラ、
PTC ApexAdaおよびObjectAda、[4]
MapuSoft Ada-C / C ++チェンジャー、[5]以前は「AdaMagicwith C Intermediate」、[6]
DDC-Iスコア
方言
SPARKRavenscarプロフィール
に影響を受けた
ALGOL 68PascalSimula 67[7] C ++(Ada 95)、Smalltalk(Ada 95)、Modula-2(Ada 95)Java(Ada 2005)、Eiffel(Ada 2012)
影響を受ける
C ++Chapel[8] Drago[9] DEiffel、Griffin、[10] JavaNimParaSailPL / SQLPL / pgSQLPythonRubySeed7、SPARforte、[11] SparkelSQL / PSMVHDL

Adaは、構造化され、静的に型付けされ、命令型で、オブジェクト指向 の高水準プログラミング言語であり、 Pascalや他の言語から拡張されています。契約による設計(DbC)、非常に強力な型指定、明示的な同時実行、タスク、同期メッセージパッシング、保護されたオブジェクト、および非決定論に対する言語サポートが組み込まれていますAdaは、コンパイラを使用して実行時エラーを優先してエラーを検出することにより、コードの安全性と保守性を向上させますAdaは国際 的な技術標準であり、国際標準化機構(ISO)、および国際電気標準会議(IEC)。2020年の時点で、非公式にAda 2012と呼ばれる標準[12]は、ISO / IEC 8652:2012です。[13]

Adaは元々 、1977年から1983年にかけて米国国防総省(DoD)と契約し、当時DoDが使用していた450以上のプログラミング言語に取って代わる、 CIIHoneywellBullのフランスのコンピューター科学者 JeanIchbiahが率いるチームによって設計されました。[14] Adaは、最初のコンピュータープログラマーとして認められているAda Lovelace(1815–1852)にちなんで名付けられました。[15]

機能

Adaは元々、組み込みおよびリアルタイムシステム用に設計されました。1992年から1995年の間にIntermetricsのS.TuckerTaftによって設計されたAda95リビジョンは、システム、数値、財務、およびオブジェクト指向プログラミング(OOP)のサポートを改善しました。

Adaの機能には、強い型付けモジュラープログラミングメカニズム(パッケージ)、ランタイムチェック並列処理タスク、同期メッセージパッシング、保護されたオブジェクト、および非決定論的selectステートメント)、例外処理、およびジェネリックが含まれます。Ada 95は、動的ディスパッチを含むオブジェクト指向プログラミングのサポートを追加しました。

Adaの構文は、基本的な操作を実行する方法の選択を最小限に抑え、記号("||"や"&&"など)よりも英語のキーワード("orelse"や"andthen"など)を優先します。Adaは、基本的な算術演算子「+」、「-」、「*」、および「/」を使用しますが、他の記号の使用は避けます。コードブロックは、「declare」、「begin」、「end」などの単語で区切られます。「end」(ほとんどの場合)の後には、閉じるブロックの識別子が続きます(たとえば、if ... end ifloop ... end loop)。条件付きブロックの場合、これにより、CやJavaなどの他の言語での間違ったネストされたif式とペアになる可能性 のあるぶら下がりelseが回避されます。

Adaは、非常に大規模なソフトウェアシステムを開発するために設計されています。Adaパッケージは個別にコンパイルできます。Adaパッケージ仕様(パッケージインターフェイス)は、一貫性をチェックするために実装せずに個別にコンパイルすることもできます。これにより、実装を開始する前の設計段階の早い段階で問題を検出できます。

他の言語で実行時まで検出できないバグや、ソースコードに明示的なチェックを追加する必要があるバグを回避するために、多数のコンパイル時チェックがサポートされています。たとえば、構文では、エンドトークンの不一致によるエラーを防ぐために、明示的に名前を付けてブロックを閉じる必要があります。強い型付けを順守することで、コンパイル時または実行時のいずれかで、多くの一般的なソフトウェアエラー(間違ったパラメーター、範囲違反、無効な参照、不一致の型など)を検出できます。並行性は言語仕様の一部であるため、コンパイラーは潜在的なデッドロックを検出できる場合があります。[16]コンパイラは通常、スペルミスのある識別子、パッケージの可視性、冗長な宣言などをチェックし、エラーを修正する方法に関する警告と有用な提案を提供できます。

Adaは、未割り当てメモリへのアクセス、バッファオーバーフローエラー、範囲違反、オフバイワンエラー、アレイアクセスエラー、およびその他の検出可能なバグから保護するためのランタイムチェックもサポートしています。これらのチェックは、実行時の効率を上げるために無効にすることができますが、多くの場合、効率的にコンパイルできます。また、プログラム検証を支援する機能も含まれていますこれらの理由から、Adaは重要なシステムで広く使用されており、異常が発生すると、事故による死亡、負傷、深刻な経済的損失など、非常に深刻な結果を招く可能性があります。Adaが使用されるシステムの例には、アビオニクス航空交通管制、鉄道、銀行、軍事、宇宙技術が含まれます。[17][18]

Adaの動的メモリ管理は、高レベルでタイプセーフです。Adaには、一般的なポインターや型指定されていないポインターはありません。また、ポインタ型を暗黙的に宣言することもありません。代わりに、すべての動的メモリ割り当てと割り当て解除は、明示的に宣言されたアクセスタイプを介して行われる必要があります。各アクセスタイプには、メモリ管理の低レベルの詳細を処理するストレージプールが関連付けられています。プログラマーは、デフォルトのストレージプールを使用するか、新しいストレージプールを定義することができます(これは、Non-Uniform Memory Accessに特に関係します)。すべて同じタイプを指定しているが、異なるストレージプールを使用するいくつかの異なるアクセスタイプを宣言することも可能です。また、言語はアクセシビリティチェックを提供します、コンパイル時と実行時の両方で、アクセス値がそれが指すオブジェクトのタイプよりも長く存続できないことを保証します。[19]

言語のセマンティクスでは、アクセスできないオブジェクトの自動ガベージコレクションが可能ですが、リアルタイムシステムで予測できない動作が発生するため、ほとんどの実装ではデフォルトでサポートされていません。Adaは、限定された形式のリージョンベースのメモリ管理をサポートしています。また、ストレージプールを破棄するとプール内のすべてのオブジェクトも破棄されるため、ストレージプールをクリエイティブに使用すると、限定された形式の自動ガベージコレクションが提供されます。

emダッシュに似た二重ダッシュ( "-")は、コメントテキストを示します。コメントは行末で停止し、閉じられていないコメントがソースコードのセクション全体を誤って無効にするのを防ぎます。コードのブロック全体を無効にするには、各行(または列)の前に「-」を個別に付ける必要があります。ページの下に「-」が繰り返される列で無効化されたコードを明確に示しますが、これにより、大きなブロックの実験的な無効化/再有効化がより引き出されたプロセスになります。

セミコロン( ";")はステートメントターミネーターであり、nullまたはno-operationステートメントはnull;です。;終了するステートメントのない シングルは許可されていません。

ほとんどのISO標準とは異なり、Ada言語定義(AdaリファレンスマニュアルまたはARM、あるいは言語リファレンスマニュアルまたはLRMとして知られている)は無料のコンテンツです。したがって、これは、Adaコンパイラーを実装するプログラマーだけでなく、Adaプログラマーにとっても一般的なリファレンスです。リファレンスマニュアルとは別に、言語設計とさまざまな言語構造の使用法を説明する広範な理論的根拠文書もあります。このドキュメントは、プログラマーによっても広く使用されています。言語が改訂されたとき、新しい理論的根拠文書が書かれました。

多くのAdaプログラマーがAdaソースコードの記述を支援するために使用している注目すべきフリーソフトウェアツールの1つは、 GNUコンパイラコレクションの一部であるGNATプログラミングスタジオです。

歴史

1970年代、米国国防総省(DoD)は、組み込みコンピュータシステムプロジェクトで使用されているさまざまなプログラミング言語の数に懸念を抱きました。その多くは廃止されたか、ハードウェアに依存し、安全なモジュラープログラミングをサポートしていませんでした。1975年に、部門および英国国防省の要件に一般的に適したプログラミング言語を検索または作成することにより、この数を減らすことを目的として、ワーキンググループである高次言語ワーキンググループ(HOLWG)が設立されましオリジナルのストローマンの提案から始まる多くの反復の後最終的なプログラミング言語はAdaと名付けられました。このようなプロジェクトで使用されている高級プログラミング言語の総数は、1983年の450以上から1996年には37に減少しました。

HOLWGワーキンググループは、Steelman言語要件を作成しました。これは、プログラミング言語が満たすべきと感じた要件を示す一連のドキュメントです。多くの既存の言語が正式にレビューされましたが、チームは1977年に、仕様を満たす既存の言語はないと結論付けました。

オーガスタエイダキング、ラブレス伯爵夫人。

新しいプログラミング言語の提案のリクエストが発行され、4人の請負業者が雇われて、Red( Benjamin Brosgolが率いるIntermetrics )、Green( CII Honeywell Bull 、 Jean Ichbiahが率いる)、Blue(SofTech、が率いる)の名前で提案を作成しました。 John Goodenough)[20]およびYellow(SRI International、Jay Spitzenが率いる)。1978年4月、公の精査の後、赤と緑の提案は次の段階に移りました。1979年5月、CII HoneywellBullのJeanIchbiahによって設計されたGreen提案が選ばれ、Adaという名前が付けられました。これはラブレス伯爵夫人のAugustaAdaにちなんでいます。この提案は、 LISという言語の影響を受けましたIchbiahと彼のグループが1970年代に開発したこと。予備のAdaリファレンスマニュアルは1979年6月にACMSIGPLANNoticesに公開されました。軍用規格リファレンスマニュアルは1980年12月10日(Ada Lovelaceの誕生日)に承認され、AdaLovelaceの誕生に敬意を表して番号MIL-STD-1815が与えられました。年。1981年、CAR Hoareチューリング賞のスピーチを利用して、エイダが過度に複雑で信頼性が低いことを批判しましたが[21]、その後、エイダの教科書のために書いた序文で撤回したようです。[22]

Adaは、初期の頃からプログラミングコミュニティ全体から大きな注目を集めていました。その支持者やその他の人々は、それが防衛関連の仕事だけでなく、汎用プログラミングの主要な言語になるかもしれないと予測しました。[23] Ichbiahは、10年以内に、AdaとLispの2つのプログラミング言語しか残らないと公に述べた[24] 初期のAdaコンパイラーは、大規模で複雑な言語の実装に苦労し、コンパイル時と実行時の両方のパフォーマンスが遅く、ツールが原始的である傾向がありました。[23] コンパイラベンダーは、Ada言語の取り組みの別の新しい機能で必要とされた、政府が要求する大規模な言語準拠テストの「ACVC」検証スイートに合格するためにほとんどの努力を費やしました。[24] 1975年から1983年に始まったコンピューターハッカースラングの辞書であるジャーゴンファイルは、エイダのエントリで次のように述べています。使用、そして全体的に悲惨な数十億ドルのブーンドッグル...エイダラブレス...彼女の名前が後に付けられた使用でほぼ確実に白くなります;それについて言われている最も親切なことはおそらくあるということです広大な象の塊の中から抜け出すために叫んでいる良い小さな言語。」

最初に検証されたAdaの実装は、1983年4月11日に認定されたNYU Ada /Edトランスレータ[25]でした。NYUAda /Edは、高レベルの設定言語SETLで実装されています。[26] AlsysTeleSoftDDC-IAdvanced Computer TechniquesTartan LaboratoriesIrvineCompilerTLD SystemsVerdixなど、いくつかの営利企業がAdaコンパイラと関連する開発ツールの提供を開始しました。[27]

1991年に、米国国防総省はすべてのソフトウェアにAda( Adaマンデート)の使用を要求し始めましたが[28]、この規則の例外がしばしば認められました。[23] DoDが市販の( COTS)テクノロジー を採用し始めたため、国防総省のAdaの任務は1997年に事実上削除されました。[23]他のNATO諸国にも同様の要件がありました。Adaはコマンドアンドコントロールおよびその他の機能を含むNATOシステムに必要であり、Adaはスウェーデン、ドイツ、カナダなどの国の防衛関連アプリケーションに義務付けられた、または優先される言語でした。[29]

1980年代後半から1990年代初頭までに、Adaコンパイラーのパフォーマンスは向上しましたが、ほとんどのリアルタイムプログラマーが慣れていたものとは異なるタスクモデルなど、Adaの機能を十分に活用するには依然として障壁がありました。[24]

Adaのセーフティクリティカルなサポート機能により、現在では軍事用途だけでなく、ソフトウェアのバグが深刻な結果をもたらす可能性のある商用プロジェクト、たとえば航空電子工学航空交通管制、 Ariane4や5などの商用ロケットにも使用されています。衛星およびその他の宇宙システム、鉄道輸送および銀行。[18] たとえば、ボーイング777フライバイワイヤシステムソフトウェアである飛行機情報管理システムは、エイダで作成されました。[30] [31] Honeywell AirTransportSystems によって開発されましたDDC-Iのコンサルタントと協力して、民間または軍のAdaプロジェクトの中で間違いなく最も有名になりました。[30] [31]カナダの自動航空交通システムは、100万行のAda(SLOCカウント)で記述されていました。高度な分散処理、分散Adaデータベース、およびオブジェクト指向設計を特徴としていました。Adaは、他の航空交通システムでも使用されています。たとえば、英国の次世代暫定未来地域管制ツールサポート(iFACTS)の航空交通管制システムは、SPARKAdaを使用して設計および実装されてます。[32] TGVのフランスの TVM車内信号システムで も使用されています高速鉄道システム、およびパリ、ロンドン、香港、ニューヨーク市のメトロ郊外列車。[18] [33]

標準化

この言語は1983年にANSI規格( ANSI / MIL-STD 1815A)になり、フランス語に翻訳した後、英語を変更せずに1987年にISO規格になりました(ISO-8652:1987)。このバージョンの言語は、ANSIで採用された日から一般にAda 83として知られていますが、ISOで採用された日からAda87と呼ばれることもあります。

ISO / ANSIの共同標準(ISO-8652:1995)であるAda 95は、1995年2月に公開され、Ada95を最初のISO標準オブジェクト指向プログラミング言語にしました。標準の改訂と将来の受け入れを支援するために、米国空軍はGNAT コンパイラの開発に資金を提供しました現在、GNATコンパイラはGNUコンパイラコレクションの一部です。

Ada言語の技術コンテンツの改善と更新に向けた作業が続けられています。Ada 95の技術正誤表は2001年10月に発行され、主要な修正であるISO / IEC 8652:1995 / Amd 1:2007は2007年3月9日に発行されました。ストックホルムで開催されたAda-Europe 2012会議で、Ada Resource Association (ARA)とAda-Europeは、Ada言語の最新バージョンの設計が完了し、承認のためにリファレンスマニュアルを国際標準化機構(ISO)に提出​​したことを発表しました。ISO / IEC 8652:2012は2012年12月に公開されました。[13]

その他の関連規格には、ISO 8651 -3:1988情報処理システム-コンピュータグラフィックス-グラフィカルカーネルシステム(GKS)言語バインディング-パート3:Adaが含まれます。

言語構成

Adaは、ALGOLに似たプログラミング言語であり、 ifthenelsewhileforなどの予約語を含む制御構造を備えていますただし、Adaには、型定義レコードポインター列挙など、元のALGOL60には含まれていなかった多くのデータ構造化機能やその他の抽象化機能もありますこのような構成は、Pascalから部分的に継承されたか、 Pascalに触発されました

"こんにちは世界!" エイダで

言語の構文の一般的な例は、Hello worldプログラムです:(hello.adb)

 Ada.Text_IOを使用; 
Ada.Text_IOを使用します ; プロシージャHelloisbegin Put_Line ( " Hello 、 world !" ); こんにちは; _
  

    
 

このプログラムは、無料で入手できるオープンソースコンパイラGNATを使用して、次のコマンドを実行する ことでコンパイルできます。

gnatmake hello.adb

データ型

Adaの型システムは、事前定義されたプリミティブ型のセットに基づいていませんが、ユーザーが独自の型を宣言できるようにします。この宣言は、タイプの内部表現に基づくのではなく、達成すべき目標の記述に基づいています。これにより、コンパイラは型に適したメモリサイズを決定し、コンパイル時と実行時に型定義の違反(つまり、範囲違反、バッファオーバーラン、型の整合性など)をチェックできます。Adaは、範囲で定義された数値型、モジュロ型、集計型(レコードと配列)、および列挙型をサポートしています。アクセスタイプは、指定されたタイプのインスタンスへの参照を定義します。型指定されていないポインタは許可されていません。言語によって提供される特別なタイプは、タスクタイプと保護されたタイプです。

たとえば、日付は次のように表されます。

タイプ Day_type    範囲    1 です   ..31 ; 
タイプ Month_type  範囲    1..12  ; _    _ タイプYear_type範囲1800..2100 ; _ _ タイプHoursmod24ですタイプ平日月曜日火曜日水曜日木曜日金曜日土曜日日曜日);
       
    
         

type  Date  is 
   record 
     Day     Day_type ; 
       Month_type ; 
        Year_type ; 
   終了レコード;

サブタイプを宣言することにより、タイプを改良できます

サブ タイプWorking_Hours  時間 範囲 0..12  ; _  --1日最大12時間の作業サブタイプWorking_Dayは、月曜日..金曜日の平日の範囲です-働く日数            
          

Work_Load  Working_Hours定数 配列Working_Day  -暗黙の型宣言:= 金曜日=> 6 月曜日=> 4 その他=> 10 ); --初期化を伴う労働時間のルックアップテーブル   
                       

タイプには、 limited、abstract、privateなどの修飾子を含めることができます。プライベートタイプにはアクセスのみが可能で、リミテッドタイプは、それらを定義するパッケージのスコープ内でのみ変更またはコピーできます。[34] Ada 95は、型のオブジェクト指向拡張のための機能をさらに追加します。

制御構造

Adaは構造化プログラミング言語です。つまり、制御の流れは標準のステートメントに構造化されています。すべての標準構造とディープレベルの早期終了がサポートされているため、サポートされている「goto」コマンドを 使用する必要はほとんどありません。

--aがbと等しくない間、ループします。
一方  /=  b ループ
  Ada Text_IO Put_Line  "待機中" ); 
ループの終了 ;

 a  >  bの 場合
  Ada Text_IO Put_Line  "条件が満たされました" ); 
そうでなければ
  エイダText_IO Put_Line  "条件が満たされていません" ); 
終了 する場合;

for  i  in  1..10 ループAda _  _  Text_IO Put "反復:" ); エイダText_IO 置くi ); エイダ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'Range loop --ループオーバー列挙Put_Line Weekday ' Image aWeekday ; --Working_DayaWeekdayの場合、列挙型の文字列表現を出力します--列挙型のサブタイプをチェックしますPut_Line ( "to work for" Working_Hours'Image Work_Load aWeekday ); --ルックアップテーブルへのアクセスは次の場合に終了します; 終わり                
               
                      
         
                  
    
 ループ;

パッケージ、手順、機能

Adaプログラムの一部には、パッケージ、プロシージャ、および関数があります。

例:パッケージ仕様(example.ads)

パッケージ  
     タイプです 番号  範囲 1 です ..11 ; 
     プロシージャ Print_and_Increment  j in  out  Number ); 
例を終了し ます;

パッケージ本体(example.adb)

 Ada.Text_IOを使用; 
パッケージ 本体  

  i   数値 := 数値'最初;

  プロシージャ Print_and_Increment  j in  out  Number  

    function  Next  k in  Number  return  Number  is 
    begin 
      return  k  +  1 ; 
    次を終了 ;

  
    エイダを開始しますText_IO Put_Line   "合計は次のとおりです: " Number'Image  j ; j :=次へj ); Print_and_Incrementを終了します; 
       
   

--パッケージが作成されたときに実行されるパッケージの初期化は、 
i < Number 'の最後のループで開始
  します Print_and_Increment i ); ループの終了; 例を終了します;   
     
   
 

このプログラムは、たとえば、無料で入手できるオープンソースコンパイラGNATを使用して、次のコマンドを実行 することでコンパイルできます。

gnatmake -z example.adb

パッケージ、プロシージャ、および関数は、任意の深さにネストでき、それぞれが論理的な最も外側のブロックになることもできます。

各パッケージ、プロシージャ、または関数は、定数、型、変数、およびその他のプロシージャ、関数、パッケージの独自の宣言を持つことができ、任意の順序で宣言できます。

並行性

Adaは、タスクベースの並行性を言語でサポートしています。Adaの基本的な並行ユニットは、組み込みの制限付きタイプであるタスクです。タスクは2つの部分で指定されます。タスク宣言はタスクインターフェイスを定義し(型宣言と同様)、タスク本体はタスクの実装を指定します。実装に応じて、Adaタスクはオペレーティングシステムのスレッドまたはプロセスにマップされるか、Adaランタイムによって内部的にスケジュールされます。

タスクには、同期(同期メッセージパッシングの形式)のエントリを含めることができます。タスクエントリは、タスク仕様で宣言されています。各タスクエントリは、タスク本体内に1つ以上のacceptステートメントを持つことができます。タスクの制御フローがacceptステートメントに到達すると、対応するエントリが別のタスクによって呼び出されるまでタスクはブロックされます(同様に、呼び出されたタスクが対応するacceptステートメントに到達するまで呼び出しタスクはブロックされます)。タスクエントリは、プロシージャと同様のパラメータを持つことができ、タスクが同期的にデータを交換できるようにします。selectステートメントと組み合わせて、acceptステートメントにガードを定義することができます(Dijkstraのguardedコマンドと同様)。

Adaは、相互排除のための保護されたオブジェクトも提供します。保護されたオブジェクトはモニターのような構成ですが、シグナリングに条件変数の代わりにガードを使用します(条件付きクリティカル領域と同様)。保護されたオブジェクトは、データのカプセル化とモニターからの安全な相互排除、および条件付きのクリティカル領域からのエントリガードを組み合わせたものです。従来のモニターに対する主な利点は、シグナリングに条件変数が不要であり、誤ったロックセマンティクスによる潜在的なデッドロックを回避できることです。タスクと同様に、保護されたオブジェクトは組み込みの制限付きタイプであり、宣言部分と本体もあります。

保護されたオブジェクトは、カプセル化されたプライベートデータ(保護されたオブジェクト内からのみアクセスできます)と、相互に排他的であることが保証されているプロシージャ、関数、およびエントリで構成されます(副作用がないことが必要な関数を除く)。したがって、他の機能と同時に実行できます)。保護されたオブジェクトを呼び出すタスクは、別のタスクが同じ保護されたオブジェクト内で現在実行されている場合はブロックされ、この別のタスクが保護されたオブジェクトを離れると解放されます。ブロックされたタスクは、到着時刻順に保護されたオブジェクトのキューに入れられます。

保護されたオブジェクトのエントリは手順に似ていますが、さらにガードがあります。ガードがfalseと評価された場合、呼び出し元のタスクはブロックされ、そのエントリのキューに追加されます。保護されたオブジェクト内で現在実行されているタスクがないため、保護されたオブジェクトに別のタスクを許可できるようになりました。ガードの評価が変更される可能性があるのはこれが唯一の場合であるため、タスクが保護されたオブジェクトを離れるたびにガードが再評価されます。

エントリへの呼び出しは、同じシグニチャを持つ他のエントリに再キューイングできます。再キューイングされたタスクはブロックされ、ターゲットエントリのキューに追加されます。これは、保護されたオブジェクトが解放され、別のタスクの承認を許可することを意味します。

Adaのselectステートメントを使用して、非ブロッキングエントリの呼び出しと受け入れ、エントリの非決定論的選択(ガード付き)、タイムアウト、および中止を実装できます。

次の例は、Adaでの並行プログラミングのいくつかの概念を示しています。

 Ada.Text_IOを使用;  Ada.Text_IOを使用します ;

手順 トラフィック 

   タイプ Airplane_ID  範囲 1です10 ;              -10機の飛行機

   タスク タイプ 飛行機 ID Airplane_ID );         --飛行機を表すタスク。初期化パラメータ
   タイプとしてIDを使用します 。Airplane_Access  accessAirplane です。-飛行機への参照型     

   保護された タイプの 滑走路                      -共有滑走路(同時アクセスを許可するために保護されています)
      エントリ Assign_Aircraft  ID Airplane_ID );   --すべてのエントリは相互に排他的なエントリであることが保証されています
      Cleared_Runway   ID Airplane_ID ; 
      エントリ Wait_For_Clear ; 
   private 
      Clear  Boolean  :=  True ;                    -保護されたプライベートデータ-一般的には旗だけではありません
   ... endRunway  ; タイプRunway_Accessすべてアクセスです
        滑走路;

   --航空管制官タスクは離陸および着陸
   タスク タイプの要求を受け取ります コントローラー My_Runway Runway_Access  
      --同期メッセージパッシング
      エントリ Request_Takeoff  ID in  Airplane_ID ;  Takeoff out  Runway_Access );のタスクエントリです。
      エントリ Request_Approach ID in  Airplane_ID ; アプローチout  Runway_Access ); 
   エンド コントローラー;

   --インスタンスの割り当て
   Runway1      エイリアス化された Runway ;               --滑走路
   Controller1をインスタンス化します Controller  Runway1'Access ; -そしてそれを管理するコントローラー 

   ------上記のタイプの実装------
   保護された ボディ 滑走路 
      エントリ Assign_Aircraft  ID Airplane_ID )であり
  Clear    --エントリガード-条件が真になるまで呼び出しタスクはブロックさ
      ます
       。 = False ; Put_Line Airplane_ID'Image ID " on runway" ; 終了;  
           
      

      エントリ Cleared_Runway  ID Airplane_ID 
 クリアされていない場合 開始クリア:= True ; Put_Line Airplane_ID'Image ID "クリアされた滑走路" ); 終了;  
      
           
             
      

       Clearbeginnullの場合エントリWait_For_Clear 
 ; -ここでは何もする必要はありません-タスクは「クリア」が真の場合にのみ入力できます滑走路を終了します;  
      
               
      
    

   タスク 本体 コントローラー 
   ループ開始
      My_Runwayです。Wait_For_Clear ; --滑走路が利用可能になるまで待機します(呼び出しをブロックします)select --Request_Approach'count = 0 =>場合に2種類のリクエスト(どちらか最初に実行可能)を待機します-ガードステートメント-Request_Approachにキューイングしているタスクがない場合にのみ受け入れますaccept Request_Takeoff ID in Airplane_ID ; Takeoff out Runway_Access do--同期された部分の開始
            
                               
                  
                    
                                              
               My_Runway Assign_Aircraft  ID );   -滑走路を予約します(保護されたオブジェクトがビジーまたはエントリガードがfalseの場合、呼び出しをブロックする可能性があります)
               離陸 :=  My_Runway ;             --「out」パラメータ値を割り当てて、どの滑走路
             の終点を飛行機に伝えるか Request_Takeoff ;                --同期された部分の終了
         または
            Request_Approach ID in Airplane_ID ;アプローチout Runway_Access doMy_Runwayを受け入れ ますAssign_Aircraft ID ); アプローチ       
                
                :=  My_Runway ; 
            Request_Approachを終了します ; または-terminateを呼び出すことができるタスクが残っていない場合はterminateします。選択を終了します; ループの終了; 終了;
                                   
            
          
       
   

   タスク 本体 飛行機 
      Rwyです  Runway_Access ; 
   Controller1を開始します
      Request_Takeoff ID Rwy ); -この呼び出しは、コントローラータスクが受け入れブロックを受け入れて完了するまでブロックされます。Put_Line Airplane_ID'Image ID " takeing off ..." ); 遅延2.0 ; 滑走路Cleared_Runway ID ); --Rwyの「Clear」がfalseになり、保護されたオブジェクト内に他のタスクが存在しないため、呼び出しはブロックされません   
          
       
                      
      遅延 5.0 ;  -少し飛び回る...
      ループ
         選択-滑走路   コントローラー1を要求してみてください
            Request_Approach ID Rwy ); --これはブロッキング呼び出しです-コントローラーがacceptブロックに到達すると実行され、完了時に戻ります-呼び出しが返された場合、着陸の準備ができています-選択ブロックを離れて続行します...または3.0を遅らせます; --timeout -3秒以内に応答がない場合は、他のことを行います(次のブロックのすべてPut_Line Airplane_ID'Image ID    
             
         
               
                "保持パターンで" );   -メッセージを出力するだけ
         ですendselect  ; ループの終了; 遅延4.0 ; -着陸進入を行います... Put_Line Airplane_ID'Image ID " touched down!" ); 滑走路Cleared_Runway ID ); -ここで完了したことを滑走路に通知します。終了;
       
         
          
         
   

   New_Airplane  Airplane_Access ;


   Airplane_ID範囲ループでI開始します -いくつかの飛行機タスクを作成しますNew_Airplane := new Airplane I ); --作成遅延4.0の直後に実行を開始します; ループの終了; 終了トラフィック;     
           
       
    
 

プラグマ

プラグマは、コンパイルされた出力の特定の操作を可能にするためにコンパイラに情報を伝達するコンパイラ指令です。[35] 特定のプラグマは言語に組み込まれていますが[36]、他のプラグマは実装固有です。

コンパイラプラグマの一般的な使用例は、実行時型チェックや配列添え字境界チェックなどの特定の機能を無効にすること、または関数呼び出しの代わりにオブジェクトコードを挿入するようにコンパイラに指示することです(C / C ++はインライン関数で行います)。 )。

ジェネリックス

Adaは、1977年から1980年に最初に設計されて以来、ジェネリック医薬品を使用してきました。標準ライブラリはジェネリックスを使用して多くのサービスを提供します。Ada 2005は、C++の標準テンプレートライブラリに触発された包括的なジェネリックコンテナライブラリを標準ライブラリに追加します

ジェネリックユニットは、 1つ以上のジェネリック仮パラメーターを受け取るパッケージまたはサブプログラムです。

ジェネリックフォーマルパラメーターは、値、変数、定数、タイプ、サブプログラム、または別の指定されたジェネリックユニットのインスタンスです。ジェネリック形式の型の場合、構文は、離散型、浮動小数点型、固定小数点型、アクセス(ポインター)型などを区別します。一部の形式パラメーターは、デフォルト値を持つことができます。

ジェネリックユニットインスタンス化するために、プログラマーは各フォーマルの実際のパラメーターを渡します。ジェネリックインスタンスは、他のユニットと同じように動作します。実行時に、たとえばループ内で汎用ユニットをインスタンス化することができます。

も参照してください

  • APSE –Adaでのソフトウェア開発をサポートするプログラミング環境の仕様
  • Ravenscarプロファイル–セーフティクリティカルなハードリアルタイムコンピューティング用に設計されたAdaタスク機能のサブセット
  • SPARK(プログラミング言語) – Adaの高度に制限されたサブセットで構成され、必要なコンポーネントの動作と個々のランタイム要件を説明するメタ情報で注釈が付けられたプログラミング言語

参照

  1. ^ 「ISOによって発行されたAda2012の技術正誤表」エイダリソースアソシエーション。2016-01-29 2016年2月23日取得
  2. ^ 「統合されたAda2012言語リファレンスマニュアル」エイダ適合性評価機関。2016-03-03にオリジナルからアーカイブされました2016年2月23日取得
  3. ^ 無料ダウンロード: https ://www.adacore.com/download )
  4. ^ 「PTCObjectAda」PTC.com 2014年1月27日取得
  5. ^ 「MapuSoftAda-C/C++チェンジャー」2019年4月16日。
  6. ^ 「C中間証明書を使用したAdaMagic」
  7. ^ Ada Rationale、1986、pp。23、70、110–114、137、165、236
  8. ^ 「チャペルの仕様(謝辞)」(PDF)CrayInc.2015-10-01 2016年1月14日取得
  9. ^ 「ドラゴ」2020-09-14にオリジナルからアーカイブされました2018年8月6日取得
  10. ^ 「グリフィン」
  11. ^ 「SPARforte」
  12. ^ ガンスル、ジャック(2013-05-29)。「AdaResourceAssociation–Adaプログラミング言語のニュースとリソース」Adaic.org 2013年6月14日取得
  13. ^ a b "ISO / IEC 8652:2012情報技術–プログラミング言語–Ada "国際標準化機構2012年12月23日取得
  14. ^ 「Adaプログラミング言語」ミシガン大学2016年5月22日にオリジナルからアーカイブされまし2016年5月27日取得
  15. ^ フエギ、J; フランシス、J(2003)。「ラブレース&バベッジと1843年の「ノート」の作成" 。IEEEAnnalsof the History of Computing .25(4)16–26。doi10.1109 / MAHC.2003.1253887。S2CID40077111  
  16. ^ 「並行性-第6章-Ada95品質およびスタイルガイド」adaic.org 2021年11月5日取得
  17. ^ タフト、S。タッカー; オルセン、フィレンツェ(1999-06-30)。「Adaは、バグの少ないコードを作成するのに役立ちます」政府のコンピュータニュース。pp。2–3 2010年9月14日取得
  18. ^ a b c フェルドマン、マイケル。「誰がエイダを使っているの?」SIGAda教育ワーキンググループ。
  19. ^ ADAには安全な動的メモリ管理はありません:SafeRustでのLinuxカーネルモジュールの作成-GeoffreyThomas&Alex Gaynor、The Linux Foundation、2019-10-02
  20. ^ 「ジョングッドイナフ|SEIスタッフプロフィール」Sei.cmu.edu 2014年1月27日取得
  21. ^ CAR、Hoare(1981)。「皇帝の古着」(PDF)ACMの通信コンピューティングマシナリー協会24(2):75–83。土井10.1145/358549.358561S2CID97895_  
  22. ^ ワット、DA; ウィッチマン、BA; Findlay、W.(1987)。エイダ:言語と方法論プレンティスホール。
  23. ^ a b c d Sward、Ricky E.(2010年11月)。「エイダの上昇、下降、そして持続性」。SIGAda '10:SIGAdaに関するACMSIGAda年次国際会議の議事録pp。71–74。土井10.1145/1879063.1879081
  24. ^ a b c ローゼン、JP。(2009年8月)。「エイダパラドックス」。エイダレターズACMSIGAda。24(2):28–35。土井10.1145/1620593.1620597S2CID608405_ 
  25. ^ SofTech Inc.(1983-04-11)。「Adaコンパイラ検証要約レポート:NYU Ada / ED、バージョン19.7V-001」マサチューセッツ州ウォルサム。2012年3月12日にオリジナルからアーカイブされました。2010年12月16日取得
  26. ^ デュワー、ロバートBK; フィッシャー、ジェラルドA.ジュニア; Schonberg、エドモンド; Froelich、Robert; ブライアント、スティーブン; ゴス、クリントンF .; バーク、マイケル(1980年11月)。「NYUエイダ翻訳者および通訳者」。ACM SIGPLAN通知–Adaプログラミング言語に関するACM-SIGPLANシンポジウムの議事録15(11):194–201。土井10.1145/948632.948659ISBN 0-89791-030-3S2CID10586359 _
  27. ^ 「Ada検証済みコンパイラリスト」。エイダ情報クリアリングハウス。1992年7月1日。pp。1–36。
  28. ^ エイダ情報クリアリングハウス(1983-04-11)。「議会エイダマンデート」2016-03-04にオリジナルからアーカイブされました2015年6月7日取得
  29. ^ Babiak、Nicholas J.(1989)。Ada、新しいDoD武器システムのコンピューター言語–万能薬または災難(PDF)空軍大学(米国空軍)pp。39–40。
  30. ^ a b Rehmer、Karl(2009)。「HADSチーム」。ステルマンでは、アンドリュー。グリーン、ジェニファー(編)。美しいチーム:ベテランチームリーダーからの刺激的で注意深い物語カリフォルニア州セバストポル:オライリー。pp。299–312。
  31. ^ a b Wolfe、Alexander(2004年10月)。「エイダにはまだ生命が残っている」ACMキュー2(7):28–31。土井10.1145/1035594.1035608
  32. ^ AdaCore。「英国の次世代ATCシステムに選ばれたGNATプロ」2010年12月24日にオリジナルからアーカイブされまし2011年3月1日取得
  33. ^ AdaCore。「エイダを使用している人を見てください」2010年12月24日にオリジナルからアーカイブされまし2011年3月1日取得
  34. ^ 「Ada構文カード」(PDF)2011年7月6日にオリジナル(PDF)からアーカイブされました2011年2月28日取得
  35. ^ 「Ada83LRM、セクション2.8:プラグマ」Archive.adaic.com 2014年1月27日取得
  36. ^ 「Ada83LRM、付録/付録B:事前定義された言語プラグマ」Archive.adaic.com。2012-02-06にオリジナルからアーカイブされました2014年1月27日取得

国際規格

理論的根拠

これらの文書は、印刷物を含むさまざまな形式で公開されています。

書籍

  • ブーチ、グレイディ(1987)。Adaによるソフトウェアエンジニアリングカリフォルニア:ベンジャミン/カミングス出版社。ISBN 0-8053-0604-8
  • Skansholm、1月(1996)。Ada95最初からアディソン-ウェスリー。ISBN 0-201-40376-5
  • ギルピン、ジェフ(1985)。Ada:ガイド付きツアーとチュートリアルプレンティスホール。ISBN 978-0-13-004045-9
  • バーンズ、ジョン(2006)。Ada2005でのプログラミングアディソン-ウェスリー。ISBN 0-321-34078-7
  • バーンズ、ジョン(1991)。Adaplus言語リファレンスマニュアルでのプログラミングアディソン-ウェスリー。ISBN 0-201-56539-0
  • バーンズ、ジョン(1998)。Ada95でのプログラミングアディソン-ウェスリー。ISBN 0-201-34293-6
  • バーンズ、ジョン(1997)。高整合性エイダ:SPARKアプローチアディソン-ウェスリー。ISBN 0-201-17517-7
  • バーンズ、ジョン(2003)。高整合性ソフトウェア:安全性とセキュリティへのSPARKアプローチアディソン-ウェスリー。ISBN 0-321-13616-0
  • ベイドラー、ジョン(1997)。データ構造とアルゴリズム:Ada95を使用したオブジェクト指向アプローチSpringer-Verlag。ISBN 0-387-94834-1
  • ゴンザレス、ディーンW.(1991)。Adaプログラマーハンドブックベンジャミン-カミングス出版社。ISBN 0-8053-2529-8
  • ベンアリ、M。(1998)。ソフトウェアエンジニアのためのエイダジョン・ワイリー&サンズ。ISBN 0-471-97912-0
  • コーエン、ノーマン(1996)。第二言語としてのエイダマグロウヒルサイエンス/エンジニアリング/数学。ISBN 0-07-011607-5
  • バーンズ、アラン; ウェリングス、アンディ(2001)。リアルタイムシステムとプログラミング言語。Ada 95、Real-TimeJavaおよびReal-TimePOSIXアディソン-ウェスリー。ISBN 0-201-72988-1
  • バーンズ、アラン; ウェリングス、アンディ(1995)。Adaでの並行性ケンブリッジ大学出版局。ISBN 0-521-62911-X
  • アトキンソン、コリン(1991)。オブジェクト指向の再利用、並行性、および配布:Adaベースのアプローチアディソン-ウェスリー。ISBN 0-201-56527-7
  • ブーチ、グレイディ; ブライアン、ダグ(1994)。Adaによるソフトウェアエンジニアリングアディソン-ウェスリー。ISBN 0-8053-0608-0
  • ジョーンズ、Do-While(1989)。Ada in Action:実用的なプログラミング例を使用。ジョン・ワイリー&サンズ。ISBN 0-471-60708-8
  • スタブス、ダニエル; Webre、Neil W.(1993)。抽象データ型とAdaを使用したデータ構造ブルックスコール。ISBN 0-534-14448-9
  • パスカル、レドル(1998年12月)。保護されたオブジェクトを使用したAdaの分散プログラミングDissertation.com。ISBN 1-58112-034-6
  • カルウィン、フィンタン(1997)。エイダ、発達的アプローチプレンティスホール。ISBN 0-13-264680-3
  • 英語、ジョン; カルウィン、フィンタン(1997年1月)。Ada95オブジェクト指向プログラミングの技術プレンティスホール。ISBN 0-13-230350-7
  • Musser、David R .; ステパノフ、アレクサンダー(1989年10月24日)。Ada Generic Library:線形リスト処理パッケージSpringer-Verlag。ISBN 0-387-97133-5
  • フェルドマン、マイケルB.(1997)。Ada95を使用したソフトウェア構築とデータ構造アディソン-ウェスリー。ISBN 0-201-88795-9
  • ジョンストン、サイモン(1997)。CおよびC++プログラマー向けのAda95アディソン-ウェスリー。ISBN 0-201-40363-3
  • フェルドマン、マイケルB .; コフマン、エリオットB.(1992–1993)。エイダ:問題解決とプログラム設計アディソン-ウェスリー。ISBN 0-201-52279-9795ページ。
  • フェルドマン、マイケルB .; コフマン、エリオットB.(1999)。エイダ95アディソン-ウェスリー。ISBN 0-201-36123-X
  • デール、ネルB .; ウィームズ、チップ; マコーミック、ジョン(1996年8月)。Ada95によるプログラミングと問題解決ジョーンズ&バートレット出版社。ISBN 0-7637-0293-5
  • デール、ネルB .; マコーミック、ジョン(2007)。Ada Plusデータ構造:オブジェクト指向アプローチ、第2版ジョーンズ&バートレット出版社。ISBN 978-0-7637-3794-8
  • クレル、ブルースC.(1992)。Adaを使用した開発:ライフサイクルメソッドバンタムデルパブグループ。ISBN 0-553-09102-6
  • ビショップ、ジュディ(1990年5月10日)。分散エイダ:開発と経験ケンブリッジ大学出版局。ISBN 0-521-39251-9
  • サンデン、ボー(1994)。Adaの例を使用したソフトウェアシステムの構築プレンティスホール。ISBN 0-13-030834-X
  • ヒラム、ブルース(1994)。Adaを使用した抽象データ型の概要プレンティスホール。ISBN 0-13-045949-6
  • ラッド、デビッド(1994)。Adaによるソフトウェアの設計と開発の概要ブルックスコール。ISBN 0-314-02829-3
  • Pyle、Ian C.(1991)。安全システムの開発:Adaを使用したガイドプレンティスホール。ISBN 0-13-204298-3
  • ベイカー、ルイ(1989)。エイダとの人工知能マグロウヒル。ISBN 0-07-003350-1
  • バーンズ、アラン; ウェリングス、アンディ(1995)。HRT-HOOD:ハードリアルタイムAdaシステムの構造化設計手法北ホラント。ISBN 0-444-82164-3
  • サヴィッチ、ウォルター; ピーターソン、チャールズ(1992)。エイダ:プログラミングの芸術と科学の紹介ベンジャミン-カミングス出版社。ISBN 0-8053-7070-6
  • ワイス、マークアレン(1993)。Adaのデータ構造とアルゴリズム分析ベンジャミン-カミングス出版社。ISBN 0-8053-9055-3
  • Ledgard、Henry(1983)。エイダ:はじめに(第2版)。Springer-Verlag。ISBN 0-387-90814-5
  • Bjørner、Dines; Oest、Ole N.、eds。(1980)。エイダの正式な説明に向けてロンドン:Springer-Verlag。ISBN 3-540-10283-3

アーカイブ

外部リンク