Ada 202x (29日目) - No_Controlled_Parts ======================================= .. post:: Dec 29, 2019 :tags: ada, ada_2022 細かい変更点まで見ていきましたら一向に終わりそうにないです。 怖い。 とりあえず新機能を紹介してしまうのが目標。 経緯 ---- 終了処理を必要としない型の保証が欲しくなるときありますよね。 C++で言えばtrivially destructibleです。 今までどうしていたか -------------------- かつてAda 83では有名な「no subset, no superset」という標語が掲げられていたこともありまして、Embedded C++みたいなものを作らせないためにも機能制限が必要ならばAda自身の機能でもって制限できるようにpragma ``Restrictions`` が用意されています。 ちなみにこの標語Ada 2005でやめたそうですよ。 Pascal Leroy先生の発言の記録が残っていました。 ちょっと衝撃ですねえ。 - `AI95-00439-01`_ **Transitioning to Ada 2005** まあ実際Ada 95の時点で既に処理系ごとに拡張されまくってましたし。 GNATも大概ですがDEC Adaもすごそうです。 (DEC AdaはAda 95で止まってそう?) 標準の範囲ですと ``pragma Restrictions (No_Dependence => Ada.Finalization);`` でcontrolled型を禁止できます。 GNATであれば ``pragma Restrictions (No_Finalization);`` で ``task`` 等も含めて禁止できます。 ただ、このpragma ``Restrictions`` は困ったことにパーティション(雑なイメージとしては.exeや.dll)全体に影響します。 使い辛いです。 特定箇所だけ制限したい場合はライブラリとして切り出してpragmaを付けてコンパイルできるかテスト、みたいな手順が必要になります。 Ada 202xでの改善 ---------------- No_Controlled_Partsアスペクト +++++++++++++++++++++++++++++ ``No_Controlled_Parts`` アスペクトが追加されました。 型が終了処理を必要としていたらエラーにしてくれます。 .. code-block:: ada type T is record A : Some_Type; B : Another_Type; C : Abstract_Type; -- 沢山の宣言 Z : Unknown_Type; end record with No_Controlled_Parts; 型ごとに終了処理を必要としない保証ができるようになりました。 関連AI ------ - `AI12-0256-1`_ **Aspect No_Controlled_Parts** 所感 ---- これは便利です。 特に中で悪いことをする ``generic`` の引数としてcontrolled型等を渡されたくない場合に簡単に弾けるようになりました。 .. code-block:: ada generic type T is private; package Low_Level_Op is procedure memcpy (dst : not null access T; src : not null access constant T); -- This is danger! private type Dummy_For_Restriction is record Element : T; end record with No_Controlled_Parts; end Low_Level_Op; 強いて言えば値として取得してif文で使えればもっと便利でした。 今後更に強化されることを期待します。 .. _`AI95-00439-01`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ais/ai-00439.txt .. _`AI12-0256-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0256-1.txt