第6章 コンパイラーおよび開発ツール
RHEL 9 と RHEL 10 の間で加えられたコンパイラーと開発ツールに関する最も顕著な変更点を説明します。
- RHEL 10.0 で利用可能な初期バージョン
RHEL 10.0 では、以下のシステムツールチェインコンポーネントを利用できます。
- GCC 14.2
- glibc 2.39
- Annobin 12.92
- binutils 2.41
RHEL 10.0 では、以下のパフォーマンスツールおよびデバッガーが利用できます。
- GDB 14.2
- Valgrind 3.24.0
- SystemTap 5.2
- Dyninst 12.3.0
- elfutils 0.192
- libabigail 2.6
RHEL 10.0 では、以下のパフォーマンス監視ツールが利用できます。
- PCP 6.3.7
- Grafana 10.2.6
RHEL 10.0 では、以下のコンパイラーツールセットを利用できます。
- LLVM Toolset 19.1.7
- Rust Toolset 1.84.1
- Go Toolset 1.23.2
- RHEL 10 では
cmakeのバージョン 3.30.5 が提供される -
RHEL 10 には
cmakeバージョン 3.30.5 が含まれています。主な変更は、アップストリームのリリースノート を参照してください。 - RHEL 10 では Rust Toolset のバージョン 1.84.0 が提供される
RHEL 10 には Rust Toolset バージョン 1.84.0 が含まれています。以前提供されていたバージョン 1.79.0 以降の主な機能拡張は次のとおりです。
-
新しい
LazyCellおよびLazyLockタイプは、最初の使用時まで初期化を遅延します。これらは、各インスタンスに初期化関数が含まれた以前のOnceCellおよびOnceLockタイプを拡張します。 - 標準ライブラリーの新しいソート実装により、実行時のパフォーマンスとコンパイル時間が向上します。また、コンパレーターが完全な順序を生成していない場合を検出し、ソートされていないデータを返す代わりにパニックを発生させるようにしています。
-
不透明な戻り値の型の正確なキャプチャーが追加されました。新しい
use<..>構文は、impl Trait戻り値の型で使用されるジェネリックパラメーターと有効期間を指定します。 constコードに多くの新機能が追加されました。以下に例を示します。- 浮動小数点サポート
-
インラインアセンブリーの
constimmediate - 静的なものへの参照
- ミュータブルな参照とポインター
unsafeコードに対する多くの新機能が追加されました。次に例を示します。- 厳密な履歴管理 API
-
&rawポインター構文 - 静的なものを安全に処理する
-
安全でない
externブロック内で安全な項目を宣言する
-
Cargo 依存関係リゾルバーはバージョンを認識するようになりました。依存関係クレートがサポートされる最小 Rust バージョンを指定している場合、Cargo は依存関係グラフを解決するときに、最新の
semver互換のクレートバージョンを使用する代わりに、この情報を使用します。
互換性に関する注意事項:
-
WebAssembly System Interface (WASI) ターゲットが
rust-std-static-wasm32-wasiからrust-std-static-wasm32-wasip1に変更されました。コマンドラインで--target wasm32-wasip1パラメーターを使用して WASI ターゲットを選択することもできます。詳細は、アップストリームブログ投稿 Changes to Rust’s WASI targets を参照してください。 -
分割されたパニックフックとパニックハンドラー引数
core::panic::PanicInfoとstd::panic::PanicInfoは異なる型になりました。 -
キャッチされないパニックによる中止では、ABI 境界を越えたアンワインドを可能にするために、
extern "C"ではなくextern "C-unwind"命令を使用する必要があります。
Rust Toolset は Rolling Application Stream であり、Red Hat は最新バージョンのみをサポートします。詳細は、Red Hat Enterprise Linux Application Streams ライフサイクル ドキュメントを参照してください。
-
新しい
- 19.1.7 の LLVM Toolset が提供される
LLVM Toolset はバージョン 19.1.7 で提供されます。
LLVM コンパイラーの主な変更点:
- LLVM は、デバッグ情報をより効率的に表現する デバッグレコード を使用するようになりました。
Clang コンパイラーの主な変更点:
- C++14 サイズ付きデアロケーションがデフォルトで有効になりました。
- C++17 のサポートが完了しました。
- 特にモジュール、コンセプト、Class Template Argument Deduction (CTAD) に関する C++20 へのサポートが改善されました。
- C23、C2c、C23、C2y のサポートが改善されました。
詳細は、LLVM リリースノート および Clang リリースノート を参照してください。
- Go Toolset がバージョン 1.23 で提供される
RHEL 10.0 では、Go Toolset のバージョン 1.23 が提供されます。主な機能拡張は、次のとおりです。
for-rangeループは、次のタイプのイテレーター関数を受け入れます。-
func(func() bool) -
func(func(K) bool) -
func(func(K, V) bool)
for-rangeループの反復値は、イテレーター引数関数の呼び出しによって作成されます。参照リンクは、アップストリームのリリースノート を参照してください。-
- Go Toolchain により、使用状況や破損統計情報を収集できます。これは、Go チームが Go Toolchain がどのように使用され、どのように機能するかを理解するのに役立ちます。デフォルトでは、Go Telemetry はテレメトリーデータをアップロードせず、ローカルにのみ保存します。詳細は、アップストリームの Go Telemetry ドキュメント を参照してください。
-
go vetサブコマンドには、参照ファイルで使用する Go のバージョンに対して新しすぎるシンボルへの参照にフラグを立てるstdversionアナライザーが含まれています。 -
cmdおよびcgo機能は、C リンカーにフラグを渡すための-ldflagsオプションをサポートしています。goコマンドは、非常に大きなCGO_LDFLAGS環境変数を使用する場合に、argument list too longエラーを回避するために、このフラグを自動的に使用します。 -
traceユーティリティーは、部分的に壊れたトレースを許容し、トレースデータを回復しようとします。これはクラッシュが発生した場合にクラッシュに至るまでのトレースを取得できるため、特に便利です。 -
未処理のパニックまたはその他の致命的なエラーの後にランタイムによって出力されるトレースバックには、
goroutineのスタックトレースを最初のgoroutineと区別するためのインデントが含まれます。 - プロファイルガイドによる最適化を使用したコンパイラービルド時間のオーバーヘッドが 1 桁のパーセンテージに削減されました。
-
新しい
-bindnowリンカーフラグにより、動的にリンクされた ELF バイナリーをビルドするときに即時の関数バインディングが有効になります。 -
//go:linknameリンカーディレクティブは、定義で//go:linknameでマークされていない標準ライブラリーおよびランタイムの内部シンボルを参照しなくなりました。 -
プログラムが
TimerまたはTickerを参照しなくなった場合、Stopメソッドが呼び出されていなくても、これらはガベージコレクションによってすぐにクリーンアップされます。TimerまたはTickerに関連付けられたタイマーチャネルは、現在バッファーなし (容量 0) になっています。これにより、ResetメソッドまたはStopメソッドが呼び出されるたびに、呼び出し後に古い値が送受信されなくなります。 -
新しい
uniqueパッケージは、interningまたはhash-consingなどの値を正規化する機能を提供します。 -
新しい
iterパッケージは、ユーザー定義のイテレーターを使用するための基本的な定義を提供します。 -
slicesおよびmapsパッケージには、イテレーターで使用するいくつかの新しい関数が導入されています。 -
新しい
structsパッケージは、メモリーレイアウトなど、含まれる struct 型のプロパティーを変更する struct フィールドの型を提供します。 次のパッケージにマイナーな変更が加えられました。
-
archive/tar -
crypto/tls -
crypto/x509 -
database/sql -
debug/elf -
encoding/binary -
go/ast -
go/types -
math/rand/v2 -
net -
net/http -
net/http/httptest -
net/netips -
path/filepath -
reflect -
runtime/debug -
runtime/pprof -
runtime/trace -
slices -
sync -
sync/atomic -
syscall -
testing/fstest -
text/template -
time -
unicode/utf16
-
詳細は、アップストリームのリリースノート を参照してください。
Go Toolset は Rolling Application Stream であり、Red Hat は最新バージョンのみをサポートします。詳細は、Red Hat Enterprise Linux Application Streams ライフサイクル ドキュメントを参照してください。LLVM Toolset は Rolling Application Stream であり、最新バージョンのみがサポートされます。詳細は、Red Hat Enterprise Linux Application Streams ライフサイクル ドキュメントを参照してください。
- GCC 14 のデフォルトは x86-64-v3
- RHEL 10 の GCC 14 では、デフォルトのマイクロアーキテクチャーレベルが x86-64-v3 になりました。このレベルでは、AVX および AVX2 命令セットや Fused Multiply-Add (FMA) 命令セットなどの特定の機能がデフォルトで有効になります。詳細は、関連する こちらの記事 を参照してください。
- GCC 14 で警告が C コードのコンパイルに影響するエラーに変更される
-
GCC 14 以降、暗黙の
int型、暗黙の関数宣言、ポインターを整数として使用することなど、いくつかの C 警告がエラーに昇格されました。開発者がこれらの警告を無視していた場合、この更新によりアプリケーションのビルドが中断される可能性があります。開発者は、コンパイルを成功させるためにこれらの問題に対処する必要があります。詳細は、Porting to GCC 14 を参照してください。 - GCC が IBM Power Systems ではデフォルトで
IEEE128浮動小数点形式を使用する RHEL10 では、GCC は IBM Power Systems 上のすべての long double 浮動小数点数に対して、従来のソフトウェア専用の
IBM-DOUBLE-DOUBLEコードではなく、デフォルトでIEEE128浮動小数点形式を使用します。その結果、long double 浮動小数点数を使用して計算を実行する C または C++ コードのパフォーマンスが向上することを確認できます。この 128 ビット long double 浮動小数点 ABI は、RHEL 8 以前のバージョンで使用されていた浮動小数点 ABI と互換性がないことに注意してください。
IEEE128操作を実行するためのハードウェア命令のサポートは、IBM POWER9 以降で利用できます。nscdがsystemd-resolvedとsssdに置き換えられるnscdキャッシュデーモンは RHEL 10 から削除されました。GNU C ライブラリー (glibc) は、利用可能な代替手段を使用して引き続き動作します。-
DNS キャッシュが必要な場合は、
systemd-resolvedサービスをインストールして有効にします。 -
他の名前サービスにキャッシュが必要な場合は、
sssdサービスをインストールして設定します。
-
DNS キャッシュが必要な場合は、
- Grafana、PCP、
grafana-pcpがデータの保存にValkeyを使用するようになる -
RHEL 10 では
ValkeyキーバリューストアがRedisを置き換えます。その結果、Grafana、PCP、grafana-pcpプラグインは、RedisではなくValkeyを使用してデータを保存するようになりました。grafana-pcpプラグインのPCP Redisデータソースの名前がPCP Valkeyに変更されました。 - TBB の新しいバージョンは互換性がない
- RHEL 10 には、Threading Building Blocks (TBB) ライブラリーバージョン 2021.11.0 が含まれていますが、これは RHEL の以前のリリースに含まれるバージョンとは互換性がありません。TBB を使用するアプリケーションを RHEL 10 で実行するには、再構築する必要があります。
zlib-ngのパフォーマンスが大幅に向上するzlib-ngライブラリーはパフォーマンスを大幅に向上させるため、RHEL 10 では従来のzlib実装をzlib-ngに置き換えました。zlib-ng2.2.3 のベンチマーク結果:-
展開は
zlibよりも 378% 高速です。 -
圧縮は
zlibよりも 423% 高速です。
-
展開は
- Red Hat build of OpenJDK 21 が RHEL 10 のデフォルトの Java 実装になる
-
デフォルトの RHEL 10 Java 実装は OpenJDK 21 です。OpenJDK 21 Java Runtime Environment と OpenJDK 21 Java Software Development Kit を提供する
java-21-openjdkパッケージを使用します。詳細は、OpenJDK のドキュメント を参照してください。 - RHEL 10.1 で
llvmから 32 ビットの ARM および MIPS バックエンドが削除されました -
RHEL 10.1 の
llvmパッケージで、32 ビットの ARM および MIPS バックエンドが削除されました。この変更により、ツールチェーンのビルド時間とメンテナンスの手間が削減されます。これらのバックエンドが必要な場合は、代替のビルドターゲットまたは以前のパッケージバージョンを使用する必要があります。