ドキュメントの最初の 2 章で言語を定義する方法とアプローチが特に興味深いと思いました。そこで、実際に手を動かして「Hello, world!」から始めることにしました。
ちなみに、私は Windows 7 x64 でそうしました。
fn main() {
println!("Hello, world!");
}
発行してcargo build
結果を見ると、targets\debug
結果は.exe
3MB であることがわかりました。少し検索した後 (cargo コマンドライン フラグのドキュメントは見つけにくいです...)、--release
オプションを見つけてリリース ビルドを作成しました。驚いたことに、.exe のサイズは 3MB ではなく 2.99MB と、わずかな量しか小さくなっていませんでした。
システムプログラミング言語はコンパクトなものを生み出すだろうと私は期待していました。
Rust が何にコンパイルされているのか、3 行のプログラムからこのような巨大なイメージが生成される仕組みについて、詳しく説明していただけますか? 仮想マシンにコンパイルされていますか? 見逃した strip コマンド (リリース ビルド内のデバッグ情報) はありますか? 他に、何が起こっているかを理解できるものはありますか?
ベストアンサー1
デフォルトでは、Rust コンパイラは、最小のバイナリ サイズではなく、実行速度、コンパイル速度、デバッグの容易さ (たとえば、シンボルを含めることによる) を最適化します。
Rustバイナリのサイズを縮小する方法の概要については、私のmin-sized-rust
GitHub リポジトリ。
バイナリ サイズを削減するための現在の高レベルの手順は次のとおりです。
- Rust 1.32.0以降を使用してください(
jemalloc
デフォルトでは含まれていません) - 以下を追加
Cargo.toml
:
[profile.release]
opt-level = 'z' # Optimize for size
lto = true # Enable link-time optimization
codegen-units = 1 # Reduce number of codegen units to increase optimizations
panic = 'abort' # Abort on panic
strip = true # Strip symbols from binary*
*
strip = true
Rust 1.59以上が必要です。古いバージョンのRustでは、strip
結果のバイナリを手動で変更します。
- リリースモードでビルドするには
cargo build --release
Rustでできることは他にもたくさんありますnightly
が、その情報はmin-sized-rust
不安定な機能の使用により時間の経過とともに変化するためです。
#![no_std]
Rustの を削除するのにも使えますlibstd
。min-sized-rust
詳細については。