第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
コードに多くの新機能が追加されました。以下に例を示します。- 浮動小数点サポート
-
インラインアセンブリーの
const
immediate - 静的なものへの参照
- ミュータブルな参照とポインター
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
サービスをインストールして設定します。
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-ng
2.0.0 のベンチマーク結果:
-
展開は
zlib
よりも 57% 高速です。 -
圧縮は
zlib
よりも 400% 高速です。
RHEL 10.0 では、さらに大幅なパフォーマンスの向上と最適化が含まれた新しい zlib-ng
2.2.3 バージョンが提供されます。
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 のドキュメント を参照してください。