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

新しいプログラミング言語の提案依頼書が発行され、4つの請負業者がレッド(ベンジャミン・ブロスゴル率いるインターメトリックス)、グリーン(ジャン・イチビア率いるハネウェル)、ブルー(ジョン・グッドイナフ率いるソフトテック) [ 23 ]、イエロー(ジェイ・スピッツェン率いるSRIインターナショナル)という名前で提案を開発するために雇われた。1978年4月、公開審査の後、レッドとグリーンの提案が次の段階に進んだ。1979年5月、ハネウェルのジャン・イチビアが設計したグリーンの提案が選ばれ、オーガスタ・エイダ・キング、ラブレース伯爵夫人(通常エイダ・ラブレースとして知られる)にちなんでエイダと名付けられた。この提案は、イチビアとそのグループが1970年代に開発した言語LISの影響を受けている。予備的な Ada リファレンス マニュアルは、1979 年 6 月に ACM SIGPLAN Notices に掲載されました。軍事規格リファレンス マニュアルは、1980 年 12 月 10 日 (エイダ・ラブレスの誕生日) に承認され、エイダ・ラブレスの生年を記念して MIL-STD-1815 という番号が付けられました。1981 年、トニー・ホーアはチューリング賞のスピーチを利用して、Ada は複雑すぎて信頼性に欠けると批判しましたが[ 24 ]、その後、Ada の教科書に書いた序文ではその発言を撤回したようです[ 25 ] 。

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