Ada 202x (52日目) - 9月9日の電子会議の結果 ========================================== .. post:: Sep 15, 2020 :tags: ada, ada_2022 `9月9日に行われた電子会議の議事録 `_\ が公開されました。 parallel for文にアスペクト指定 ------------------------------ parallel for文にアスペクトを指定できるようになります。 .. code-block:: ada declare Data : array (1 .. 1280) of Float; Total : Float := 0.0; begin parallel (Chunk in 1 .. 2) with Gang -- implementation-defined for I in 0 .. 9 loop parallel with Vector => 128 -- implementation-defined for J in 1 .. 128 loop Total := Total + Data (I * 128 + J); end loop; end loop; 具体的なアスペクトは定義されておらず、実装依存のオプションを渡すことができます。 余談ですが、gcc 9からOpenACC 2.5がサポートされました。 Adaフロントエンドでもgcc 9で\ `関連pragma群 `_\ が一度は追加されましたもののgcc 11では廃止されてしまいました。 今後もしparallel for文の実装にOpenMPやOpenACCが選べるということになればオプションを渡すためにこの構文が使える……のかもしれません。 これに関係してユーザー定義アスペクトも議論されましたが採択されませんでした。 仮引数にアスペクト指定 ---------------------- もできるようになります。 access型とoutパラメータでの変換 ------------------------------- ここまで ``Default_Value`` を持つ基本型とoutパラメータ周りが細々修正されてきました。 今度はaccess型に対する似たような修正です。 outパラメータの実引数の中で共通の祖先を持たないaccess型の変換を行った場合、実装は元の値ではなく ``null`` を渡しても構わなくなります。 (サブプログラムに渡す時の話です。 書き戻しには影響ありませんのでサブプログラムの中で代入した値が捨てられるようなことはありません。) .. code-block:: ada declare type A1 is access all Integer; procedure Nop (X : out A1) is begin null; end Nop; V : aliased Integer; type A2 is access all Integer; D2 : A2 := V'Access; type A3 is new A1; D3 : A3 := V'Access; begin Nop (A1 (D2)); -- D2 = null or V'Access Nop (A1 (D3)); -- D3 = V'Access この例では ``D2`` の型は ``A1`` と無関係に定義されていますので ``null`` になるかもしれません。 ``D3`` の型は ``A1`` から派生していますので値はそのままになります。 現状GNATのみこの挙動です。 生存期間の異なるaccess型同士の変換では適切なAccessibility_Checkを行う必要があり、そのコストを嫌ったのか単にさぼっているのか。 他のコンパイラは他のコンパイラでそれぞれ細かい非互換を抱えていて、結果大した問題ではないと追認されたようです……。 ちなみにこのケースに限らずoutパラメータの場合は ``not null`` が付いていても一時的に ``null`` になることはあります。 実際に使用されたり実引数に書き戻される時にはチェックされます。 outパラメータにはサブプログラムの中できちんと代入しましょう。 いっそaccess型のoutパラメータは全部 ``null`` で初期化されることにすれば元の値を渡す必要がなくなって効率的になりますが、影響が大きすぎるためそこまで踏み込まれませんでした。 未知のアスペクト ---------------- 実装はpragma同様に未知のアスペクトを無視してもよいことになります。 それに伴ってpragma ``Restrictions`` に ``No_Unrecognized_Aspects`` と ``No_Unrecognized_Pragmas`` が追加されます。 pragma Restrictions (No_Unrecognized_Aspects) +++++++++++++++++++++++++++++++++++++++++++++ 未知のアスペクトを無視せずコンパイルエラーにします。 pragma Restrictions (No_Unrecognized_Pragmas) +++++++++++++++++++++++++++++++++++++++++++++ 未知のpragmaを無視せずコンパイルエラーにします。 サブプログラムを指す匿名のaccess型の返値 ---------------------------------------- 規格の文面を厳密に解釈しますとサブプログラムを指す匿名のaccess型の返値は呼び出した箇所と同じレベルになる……ようです。 すると実際には問題なくてもネストされた先で呼び出された結果をより浅いレベルで宣言された変数に代入できない……そうです。 サブプログラムを指す匿名のaccess型もオブジェクトを指す匿名のaccess型と同じルールに従うよう修正される……らしいです。 (理解が怪しいことがわかる文章。) Ada.Containers.Doubly_Linked_Lists.Append_One --------------------------------------------- .. container:: strike ``Append_One`` が ``Vectors`` だけではなく ``Doubly_Linked_Lists`` にも追加されます。 :doc:`35日目 `\ に追記しました。 変換の式中でのraise式 --------------------- raise式がAccessibility_Check等の各種チェックに引っかからないことが明記されます。 制約に違反した定数 ------------------ こういうやつのことです。 .. code-block:: ada Bad : constant Positive := -1; もちろん警告も出ますし実行時には ``Constraint_Error`` になるわけですが、Ada 202xではstatic関数が追加されてコンパイル時に色々できるようになりました。 そのため制約に違反した定数はstatic扱いされないことが明記されます。 名前付き定数とユーザー定義リテラル ---------------------------------- 型無しのnamed numberがユーザー定義リテラルを持つ型に使えるようになります。 .. code-block:: ada declare U1 : constant := 100 / 2; X1 : Ada.Numerics.Big_Numbers.Big_Integers.Big_Integer := U1; U2 : constant := 123.45 / 2.0; X2 : Ada.Numerics.Big_Numbers.Big_Reals.Big_Real := U2; 変換関数には10進数表記された文字列が渡されます。 また ``Real_Literal`` アスペクトに指定する変換関数はオーバーロードして2つの引数を取ることもできるようになります。 その場合は分数として第1引数に分子、第2引数に分母が10進数の整数表記で渡されるようになりますので誤差の心配もなくなりました。 (あれ? 実装は実数定数を浮動小数点形式で持つわけにはいかなくなったのでは?) Default_Initial_Conditionの継承 ------------------------------- ``Default_Initial_Condition`` アスペクトは継承されることになっていましたが、具体的にどういう処理がなされるかは明記されていませんでした。 ``Post'Class`` 同様と明記されました。 その他文面等の修正 ------------------ 例によって文面等の修正がまとめてひとつのAI(`AI12-0388-1`_)で行われています。 またアスペクト周りの文面もひとつのAI(`AI12-0396-1`_)で細々修正されています。 その他特記事項 -------------- Ada.Strings.Text_Buffers ++++++++++++++++++++++++ がネストされたインデント/アンインデントに対応するかもしれません。 結果を複数行で返す ``'Image`` 属性が書きやすくなります。 暗黙のインスタンス化 ++++++++++++++++++++ 自体が見送られることになりました。 関連AI ------ - `AI12-0355-2`_ **Aspect specifications for parallel constructs** - `AI12-0378-1`_ **View conversions and out parameters of access types revisited** - `AI12-0388-1`_ **Still More Presentation issues** - `AI12-0389-1`_ **Ignoring unrecognized aspects** - `AI12-0390-1`_ **Conversions of anonymous access function results** - `AI12-0391-1`_ **List containers need Append_One** - `AI12-0392-1`_ **Conditional expressions containing raise expressions** - `AI12-0393-1`_ **No invalid static constants** - `AI12-0394-1`_ **Named Numbers and User-Defined Numeric Literals** - `AI12-0395-1`_ **Allow aspect_specifications on formal parameters** - `AI12-0396-1`_ **Fixups for various aspects of aspects** - `AI12-0397-1`_ **Default_Initial_Condition applied to derived type** .. _`AI12-0355-2`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0355-2.txt .. _`AI12-0378-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0378-1.txt .. _`AI12-0388-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0388-1.txt .. _`AI12-0389-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0389-1.txt .. _`AI12-0390-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0390-1.txt .. _`AI12-0391-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0391-1.txt .. _`AI12-0392-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0392-1.txt .. _`AI12-0393-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0393-1.txt .. _`AI12-0394-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0394-1.txt .. _`AI12-0395-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0395-1.txt .. _`AI12-0396-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0396-1.txt .. _`AI12-0397-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0397-1.txt