Ada 202x (48日目) - 3月11日の電子会議の結果

3月11日に行われた電子会議の議事録が公開されました。 次の会議は6月ではありませんでしたっけ?あれ? それに私どんな風にこれ書いてましたでしょうか、すっかり忘れてますね。

Globalアスペクトの変更

Globalアスペクトに変更が加えられています。

private ofの削除

パッケージの隠されたグローバル変数にアクセスしていることを表す private of 記法が削除されます。 パッケージ名だけを書いてパッケージにある全てのグローバル変数を意味するのは有効です。

隠されたグローバル変数にアクセスしていてかつ公開部にあるグローバル変数には一部しかアクセスしていない状況で細かい指定ができなくなりますが、 private of という文法もどうかと思うのも確かですので、まあいいのではないでしょうか。 必要なら将来別の記法が追加されるでしょう。

19日目を修正しました。

synchronizedが集合扱いに

同期を行っていることを表す synchronized に個別の変数名を指定できなくなります。 all 同様に synchronized だけで集合扱いになります。

19日目を修正しました。

Unspecified

Global => Unspecified で未指定を明記できるようになります。 そもそも Global アスペクトを書かないのと同じです。

SPARKとの互換性のためだそうです。

多態

多態していることを表す記法が追加されます。

do Primitive (Object) でtagged型のオブジェクト Object のプリミティブである Primitive を多態呼び出ししていることを表せます。

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

これ本当に必要でしょうか? この場合 PrimitiveGlobal'Class を指定すればそれが多態先も含めて守られるはずですし。

記法が変更されました。 Globaldo の代わりに Dispatching アスペクトになります。

genericの引数の使用

generic packageの引数も中の各エンティティから見ればグローバル変数のようなものです。 その使用を表す記法が追加されます。

generic
   X : in out Integer;
package Generic_Pkg1 is

   procedure Proc
      with Global => use X;

end Generic_Pkg1;

全てを使うことを示すために all や何も使わないことを示すために null と書くこともできます。

記法が変更されました。 Globaluse の代わりに Use_Formal アスペクトになります。

pragma Restrictions (No_Unspecified_Globals)

pragma Restrictions で全てのサブプログラムに Global を明記することを強制できるようになります。

pragma Restrictions (No_Hidden_Indirect_Globals)

pragma Restrictions でaccess型等を使って間接にグローバル変数を書き換えることを禁止できるようになります。

……と書くのは簡単ですが実際にチェックするのは難しそうですよね。 どこまでチェックするかは実装依存のようです。

Ada.Containers.Indefinite_Holders​/Bounded_Indefinite_Holders

Swap が追加されます。

Move を3回呼ぶのは Bounded_Indefinite_Holders の場合に非効率だからだそうです。 確かにBounded版コンテナは必要なメモリを固定で抱えてますので常に全体をコピーする必要があります。

ということは将来他の全てのBounded版コンテナにも Swap が追加されるかもしれませんね。

35日目に追記しました。

shared passiveパッケージにあるサブプログラム

Remote呼び出し扱いではないことが明記されます。

pragma Shared_Passive を付けたパッケージはパーティションを越えて変数を共有できます。

GNATでは変数にアクセスするとストリームを読み書きするコードが生成されます。 それとは別にメモリマップドファイルで実装する方法や、Windowsでは.dllに共有フラグを付ける方法(これって16ビット時代の話では?)もあります。

実装方法によってはマーシャリングを行う必要がありませんので Remote_Call_Interface 関係から概念が分けられました。

Ada.Streams.Storage

'Put_Image 属性の出力先は Ada.Strings.Text_Buffers になり Ada.Streams.Storage は使われなくなりましたが、あると便利なので残されることになりました。

System.Atomic_Operations.Integer_Arithmetic​/Modular_Arithmetic

mod型用の System.Atomic_Operations.Modular_Arithmetic が追加されます。 それに伴い System.Atomic_Operations.ArithmeticInteger_Arithmetic となります。

32日目35日目を修正しました。

列挙型とfreezing

列挙型の要素を自分自身の Default_Value アスペクトの指定に使った場合はfreezingされないようになります。

type E is (A, B, C) with Default_Value => A;

static式

固定小数点型の 'Small 属性がstaticになります。

declare式がstaticになります。

えっこれまでの文面ではdeclare式がstaticではなかったの……?と驚いてます。 ともあれひと安心。

Simple_Barriers​/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 本体のエンティティを前方参照することはできません。

generic
   with procedure P1 with Pre => Cond; -- error
package G1 is
   Cond : Boolean;
end G1;
  1. 仮引数が renames された場合にも事前条件/事後条件は有効です。

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;
  1. 仮引数が renames された場合インスタンスと同じレベルで宣言されたものと見做されます。

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 privateAtomic の付いた実引数を渡せなくなるとかなんとか。 (よくわかりません。)

変更を取り消すとか仮引数とのマッチングを別AIにするとかするらしいです。 続報を待ちましょう。

関連AI

Wording Changes

文面のみの修正です。