gcc 11の変更点

gcc 11がリリースされました。 早速何が変わったのかを見てみましょう。 (既視感)

Changes, New Features, and Fixesを読む

変更点は Changes, New Features, and Fixes に書かれています。

いつもはC/C++とFortranしか書かれないこのページ、今回はD言語の変更点も沢山書かれていますよ!

しかし、やっぱりAdaの変更点は書かれていないです。

変更点の調べ方

gcc 10の時と同じです。

また、私が見つけた変更点も同じく https://github.com/ytomino/drake/wiki/GCC-Versions に都度メモしております。

特筆すべき変更点

Ada 2020対応

Ada 2020対応は順調に進んでいるようです。

ただし、まだ実装の途中であったり、最新のドラフトとは違う形で実装されていたりしますので本格的に使うのは避けたほうが良いでしょう。

目立つところでは 'Put_Image 属性に使われるバッファーの型が Ada.Strings.Text_Output.Sink'Class になっていたりします。

https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/ada/libgnat/a-stteou.ads;h=9eaf98a820cc34205e1b8565a1e17ce59e24677f

AI12-0020-1 の初期案では Ada.Streams.Counted_Streams.Conted_Stream を使う形で、その後 Root_Stream_Type'Class を使う形を経て AI12-0340-1Ada.Strings.Text_Buffers.Root_Buffer_Type'Class が提案され、インデント対応等の変遷があって今に至っています。

Text_Output.Sink という名前は提案の中には見当たりませんのでちょっと謎です。

'Image 属性をユーザー定義できるぞやった!と勇み足でこれを使ってしまいますと次のバージョンあたりで変更する羽目になると思われます。

Long_Long_Long_Integer

ええと、その……大昔に 「長い長い長い整数」 という駄文を書いたことがありまして……その時は想像もしていなかったのですが、とうとう本当に Long_Long_Long_Integer が実装されてしまいました。

https://gcc.gnu.org/onlinedocs/gcc-11.1.0/gnat_rm/Implementation-Defined-Characteristics.html

64ビット処理系では128ビット、32ビット処理系では64ビットとなる型です。

gccのCフロントエンドは拡張で64ビット環境でのみ __int128_t が使えます。 これでAdaでも128ビット整数が使えることになります。 (将来C言語に long long long が導入されて定義が食い違ったらどうなるんでしょう……)

これに伴い処理系で扱える最大の整数のビット数が Standard'Max_Integer_Size で取得できるようになっています。

https://gcc.gnu.org/onlinedocs/gcc-11.1.0/gnat_rm/Attribute-Max_005fInteger_005fSize.html

またユーザー定義型も64ビット環境では128ビットまで使えるようになっているようです。