Ada 2020 (35日目) - 標準ライブラリ

標準ライブラリの変更を俯瞰します。

今回は一覧したいため目次を付けておきます。

変更があったもの

全体的に NonblockingGlobal 、事前条件/事後条件、 Allows_Exit 等のアスペクトが追加されました。

またいくつかの型は 'Image 属性が返す文字列の書式も定められました。

Ada.Calendar.Time_Zones

Time_Offset の符号の意味が定められました。 日本のタイムゾーンをUTC+9と表記する時の符号と同じです。

Ada.Command_Line

各関数が返す文字列の 'First1 だと定められました。

Ada.Containers.*

標準コンテナは、同じコンテナオブジェクトでも異なるスレッドが異なる要素に同期なしにアクセスしても大丈夫と定められました。 また Parallel_Iterator / Parallel_Reversible_Iterator がサポートされました。

aggregate式がサポートされました。

Iterator_View アスペクトが指定されcontainer element iterator(of 形式)のループが少し効率的になりました。 そのために各コンテナに入れ子のパッケージ Stable が追加されています。

コンテナの要素型が終了処理を必要とする場合、実際に終了処理が行われるタイミングは実装依存と定められました。 終了処理を行わないまま保持しておいて使い回すような実装も認めらた、というより Vectors を配列で実装した既存の実装は大体そんなものだった(わざわざ毎回placement new/delete的なことをしてない)のが追認されたことになります。

Ada.Directories

Simple_NameContaining_Directory にルートディレクトリを渡した場合の挙動が定められました。 Simple_Name が与えられたルートディレクトリをそのまま返し、Containing_DirectoryUse_Error になります。

理由としてPOSIXコマンドの basename // になるからみたいに書かれてるのですけれども dirname / だって / になることにどなたも気付かれなかったのでしょうか……。 あ、動作自体はこれでいいと思います。

Ada.Synchronous_Task_Control

元々 Suspend_Until_True は同じオブジェクトを使って複数スレッドを同時に待たせることはできませんでした。 複数スレッドが同じオブジェクトを引数にして同時に呼び出した場合 Program_Error になると明確に定められました。

Ada.Task_Identification

Activation_Is_CompleteNull_Task_Id が渡された場合 Program_Error になると明確に定められました。

Interfaces

Shift_LeftShift_RightShift_Right_ArithmeticRotate_LeftRotate_Right で各型のビット数を超えてシフト/ローテートした時の挙動が定められました。 Shift_LeftShift_Right0 になります。 Shift_Right_Arithmetic は全ビットが符号ビットと同じになります。 Rotate_LeftRotate_Right はどれだけ大きなローテート幅が渡されても指定分ローテートします。

単純にCPUのシフト/ローテート命令を使っただけでは、型のビット数を超えたシフト/ローテートの挙動はCPUによってまちまちでした。

System.Storage_Pools

Pure になりました。 SubpoolsPreelaborate のままです。

System.Storage_Pools.Subpools

終了処理の順番が定められました。 割り当てられたオブジェクトの終了処理をメモリ解放よりも先に行います。

Root_Storage_Pool_With_SubpoolsPreelaborable_Initialization になりました。

新しく追加されたエンティティ

既存の翻訳単位の中に追加されたものです。

Ada.Containers.*

各コンテナに入れ子のパッケージ Stable が追加されました。 27日目を参照。

各コンテナに Has_ElementNextPrevious のオーバーロードが追加されました。 コンテナと Cursor のふたつの引数を取ります。

各コンテナに Empty が追加されました。 6日目を参照。

各コンテナに Equal_Element が追加されました。 要素型の "=" 演算子の別名です。

各コンテナに Tampering_With_Cursors_ProhibitedTampering_With_Elements_Prohibited が追加されました。 tampering checkを事前条件の中で書くためのものです。

Ada.Containers.Doubly_Linked_Lists

Same_Object が追加されました。 ふたつのコンテナオブジェクトが同じかどうかを判定します。 'Has_Same_Storage 属性で充分だったのではという気はします。

Ada.Containers.Indefinite_Holders

Swap が追加されました。 48日目を参照。

Ada.Containers.Vectors

Append_One が追加されました。 6日目を参照。

Ada.Wide_Wide_Text_IO

入れ子のパッケージ Wide_File_NamesWide_Wide_File_Names が追加されました。 1日目を参照。

Ada.Dispatching.EDF

相対時間でデッドラインを扱う多くのエンティティが追加されました。 31日目を参照。

Ada.Iterator_Iterfaces

Parallel_IteratorParallel_Reversible_Iterator が追加されました。 11日目を参照。

Ada.Numerics.Discrete_Random

Random 関数に範囲をより絞り込めるオーバーロードが追加されました。

Ada.Wide_Characters

Is_BasicTo_Basic が追加されました。 28日目を参照。

Is_NFKC が追加されました。 34日目を参照。

Ada.Wide_Wide_Characters

Ada.Wide_Characters と同じ変更が加えられています。

Interfaces.C

ターゲット環境のCコンパイラが long long をサポートしている場合にAdaコンパイラは long_longunsigned_long_long を提供しないといけません。

Interfaces.Fortran

入れ子のパッケージ Double_Precision_Complex_Types 、型 Double_ComplexDouble_Imaginary が追加されました。 Fortranの complex(kind(0d0)) に対応します。

関連AI