Ada 202x (48日目) - 3月11日の電子会議の結果 =========================================== .. post:: Mar 18, 2020 :tags: ada, ada_2022 .. |ZWSP| unicode:: U+200B .. ZERO WIDTH SPACE :trim: `3月11日に行われた電子会議の議事録 `_\ が公開されました。 次の会議は6月ではありませんでしたっけ?あれ? それに私どんな風にこれ書いてましたでしょうか、すっかり忘れてますね。 Globalアスペクトの変更 ---------------------- Globalアスペクトに変更が加えられています。 private ofの削除 ++++++++++++++++ パッケージの隠されたグローバル変数にアクセスしていることを表す ``private of`` 記法が削除されます。 パッケージ名だけを書いてパッケージにある全てのグローバル変数を意味するのは有効です。 隠されたグローバル変数にアクセスしていてかつ公開部にあるグローバル変数には一部しかアクセスしていない状況で細かい指定ができなくなりますが、 ``private of`` という文法もどうかと思うのも確かですので、まあいいのではないでしょうか。 必要なら将来別の記法が追加されるでしょう。 :doc:`19日目 `\ を修正しました。 synchronizedが集合扱いに ++++++++++++++++++++++++ 同期を行っていることを表す ``synchronized`` に個別の変数名を指定できなくなります。 ``all`` 同様に ``synchronized`` だけで集合扱いになります。 :doc:`19日目 `\ を修正しました。 Unspecified +++++++++++ ``Global => Unspecified`` で未指定を明記できるようになります。 そもそも ``Global`` アスペクトを書かないのと同じです。 SPARKとの互換性のためだそうです。 多態 +++++ 多態していることを表す記法が追加されます。 .. container:: strike ``do Primitive (Object)`` でtagged型のオブジェクト ``Object`` のプリミティブである ``Primitive`` を多態呼び出ししていることを表せます。 .. code-block:: ada type T is abstract tagged null record; procedure Primitive (Object : in out T) is abstract; procedure Proc1 (Object : in out T'Class) with Global => do Primitive (Object); procedure Proc1 (Object : in out T'Class) is begin Primitive (Object); end Proc1 これ本当に必要でしょうか? この場合 ``Primitive`` に ``Global'Class`` を指定すればそれが多態先も含めて守られるはずですし。 記法が変更されました。 ``Global`` と ``do`` の代わりに ``Dispatching`` アスペクトになります。 genericの引数の使用 +++++++++++++++++++ generic packageの引数も中の各エンティティから見ればグローバル変数のようなものです。 その使用を表す記法が追加されます。 .. container:: strike .. code-block:: ada generic X : in out Integer; package Generic_Pkg1 is procedure Proc with Global => use X; end Generic_Pkg1; 全てを使うことを示すために ``all`` や何も使わないことを示すために ``null`` と書くこともできます。 記法が変更されました。 ``Global`` と ``use`` の代わりに ``Use_Formal`` アスペクトになります。 pragma Restrictions (No_Unspecified_Globals) ++++++++++++++++++++++++++++++++++++++++++++ pragma ``Restrictions`` で全てのサブプログラムに ``Global`` を明記することを強制できるようになります。 pragma Restrictions (No_Hidden_Indirect_Globals) ++++++++++++++++++++++++++++++++++++++++++++++++ pragma ``Restrictions`` でaccess型等を使って間接にグローバル変数を書き換えることを禁止できるようになります。 ……と書くのは簡単ですが実際にチェックするのは難しそうですよね。 どこまでチェックするかは実装依存のようです。 Ada.Containers.Indefinite_Holders |ZWSP| /Bounded_Indefinite_Holders -------------------------------------------------------------------- ``Swap`` が追加されます。 ``Move`` を3回呼ぶのは ``Bounded_Indefinite_Holders`` の場合に非効率だからだそうです。 確かにBounded版コンテナは必要なメモリを固定で抱えてますので常に全体をコピーする必要があります。 ということは将来他の全てのBounded版コンテナにも ``Swap`` が追加されるかもしれませんね。 :doc:`35日目 `\ に追記しました。 shared passiveパッケージにあるサブプログラム -------------------------------------------- Remote呼び出し扱いではないことが明記されます。 pragma ``Shared_Passive`` を付けたパッケージはパーティションを越えて変数を共有できます。 GNATでは変数にアクセスするとストリームを読み書きするコードが生成されます。 それとは別にメモリマップドファイルで実装する方法や、Windowsでは.dllに共有フラグを付ける方法(これって16ビット時代の話では?)もあります。 .. container:: inserted `今でもできるそうです。 `_ 実装方法によってはマーシャリングを行う必要がありませんので ``Remote_Call_Interface`` 関係から概念が分けられました。 Ada.Streams.Storage ------------------- ``'Put_Image`` 属性の出力先は ``Ada.Strings.Text_Buffers`` になり ``Ada.Streams.Storage`` は使われなくなりましたが、あると便利なので残されることになりました。 System.Atomic_Operations.Integer_Arithmetic |ZWSP| /Modular_Arithmetic ---------------------------------------------------------------------- mod型用の ``System.Atomic_Operations.Modular_Arithmetic`` が追加されます。 それに伴い ``System.Atomic_Operations.Arithmetic`` は ``Integer_Arithmetic`` となります。 :doc:`32日目 `\ と\ :doc:`35日目 `\ を修正しました。 列挙型とfreezing ---------------- 列挙型の要素を自分自身の ``Default_Value`` アスペクトの指定に使った場合はfreezingされないようになります。 .. code-block:: ada type E is (A, B, C) with Default_Value => A; static式 -------- 固定小数点型の ``'Small`` 属性がstaticになります。 declare式がstaticになります。 えっこれまでの文面ではdeclare式がstaticではなかったの……?と驚いてます。 ともあれひと安心。 Simple_Barriers |ZWSP| /Pure_Barriersの緩和 ------------------------------------------- ``pragma Restrictions (Simple_Barriers);`` が有効な場合でもバリアの式からrecord型の要素にアクセスできるようになります。 ``protected`` 自身のアスペクトでprivate部の変数を使いたくても可視性のためにできない場合があります。 そこでrecord型でラップできるようにするための変更だそうです。 標準ライブラリの事前条件の式 ---------------------------- これまでの文面ではif式等も使われていましたが全て ``(... or else raise ...) and then ...`` の形に直されるようです。 if式を使うのは従来if文で行っていたエラーチェックをそのまま移動してくるのに適していて、論理演算子はpragma ``Assert`` 等との統一に適している、と思います。 個人的にも論理演算子の方が好きです。 genericの仮引数にまつわる変更 ----------------------------- Ada 202xでは ``generic`` の仮引数に事前条件と事後条件を書けるようになりました。 任意の式が書けてしまうと色々まずいことも起こせてしまいますのでルールが追加されます。 1. 仮引数リストから ``generic`` 本体のエンティティを前方参照することはできません。 .. code-block:: ada generic with procedure P1 with Pre => Cond; -- error package G1 is Cond : Boolean; end G1; 2. 仮引数が ``renames`` された場合にも事前条件/事後条件は有効です。 .. code-block:: ada declare procedure Null_Proc is null; generic with procedure P2 with Pre => False; package G2 is procedure Exported renames P2; -- with Pre => False end G2; package I2 is new G2 (Null_Proc); begin G2.Exported; -- Assertion_Error end; 3. 仮引数が ``renames`` された場合インスタンスと同じレベルで宣言されたものと見做されます。 .. code-block:: ada declare procedure Null_Proc is null; generic with procedure P3; package G3 is procedure Exported renames P3; procedure Other_Renaming renames Null_Proc; end G3; X : access procedrue; begin declare package I3 is new G3 (Null_Proc); begin X := Null_Proc'Access; X := G3.Exported'Access; -- error X := G3.Other_Renaming'Access; end; end; この例の ``Other_Renaming`` は仮引数ではなく ``Null_Proc`` を直接 ``renames`` していますので ``Null_Proc`` と同じレベルと見做されOKです。 その他特記事項 -------------- Ada 202xでは ``generic`` の引数に ``Atomic`` 等が指定できるようになりますが、これが深刻な非互換になるそうです。 仮引数 ``type T is private`` に ``Atomic`` の付いた実引数を渡せなくなるとかなんとか。 (よくわかりません。) 変更を取り消すとか仮引数とのマッチングを別AIにするとかするらしいです。 続報を待ちましょう。 関連AI ------ - `AI12-0079-3`_ **Global-in and global-out annotations** - `AI12-0350-1`_ **Swap for Indefinite_Holders** - `AI12-0359-1`_ **Calls to subprograms declared in shared passive units** - `AI12-0361-1`_ **Ada.Streams.Storage packages are still useful** - `AI12-0364-1`_ **Add a modular atomic arithmetic package** - `AI12-0367-1`_ **Glitches in aspect specifications** - `AI12-0368-1`_ **Declare expressions can be static** - `AI12-0369-1`_ **Relaxing barrier restrictions** - `AI12-0370-1`_ **Pattern to use for specifying a precondition** - `AI12-0371-1`_ **Fix-ups for aspects in generic formal parts** Wording Changes --------------- 文面のみの修正です。 - `AI12-0347-1`_ **Presentation issues** .. _`AI12-0079-3`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0079-3.txt .. _`AI12-0347-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0347-1.txt .. _`AI12-0350-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0350-1.txt .. _`AI12-0359-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0359-1.txt .. _`AI12-0361-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0361-1.txt .. _`AI12-0364-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0364-1.txt .. _`AI12-0367-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0367-1.txt .. _`AI12-0368-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0368-1.txt .. _`AI12-0369-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0369-1.txt .. _`AI12-0370-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0370-1.txt .. _`AI12-0371-1`: http://www.ada-auth.org/cgi-bin/cvsweb.cgi/ai12s/ai12-0371-1.txt