ヘッダー
支援♡ : Monero | Github | Ko-Fi | ファンティア | Patreon | 極座標 | Open Collective

【プログラミング】RustとZigの違い

トップページに戻る
凛、 2023年05月24日 — jp, blog, zig, rust, システム開発

Zigとは?

Zigは、隠れた制御フローや隠れたメモリ割り当て、プリプロセッサやマクロがないシステムプログラミング用言語です。
アセンブリ言語よりも読みやすく、C言語よりも細かい制御が可能なため、アセンブリ言語よりは高水準でありながらC言語よりは低水準な言語と言えます。
エラーを修正するまでエディタを終了することを防ぐので、C言語より安全だと言えます。
新世代のC言語になり得るポテンシャルが非常に高いと思います。
新しい言語ながら、特に日本人と中国人の開発者に人気があります。
また、日本発の派生言語であるZen言語もありますが、 プロプライエタリ・ソフトウェアであるため、特に推奨はできません。

Rustとは?

Rustは、メモリ安全性とスレッド安全性を保証するシステムプログラミング用の言語です。
Rustではメモリ安全性とスレッド安全性が重要なポイントとなっています。
Linux Kernel 6.1以降ではカーネルにRustコンパイラが含まれています。
低水準言語でありながら、Rustは非常に高水準な言語であるPythonで作られているようです。
比較すると、Zigが新世代のC言語に、Rustが新世代のC++言語になろうとしていると言えます。
Rustは、特にLGBTというテロリストが多くの欧米で大人気です。

Rustのメリット

Rustのデメリット

Zigのメリット

Zigのデメリット

Rustのバイナリ VS Zigのバイナリ

一緒にやりましょう!!

mkdir -p ~/tmp/{rust,zig}
cd ~/tmp/rust
cargo init
cargo build
cd ../zig
zig init-exe
zig build

まずはZigのバイナリを確認します

# ./zig-out/bin/zig
All your codebase are belong to us.
Run `zig build test` to run the tests.

# ls -thal ./zig-out/bin/zig
-rwxr-xr-x 1 suwako suwako 962K  5月 24 20:36 ./zig-out/bin/zig

# file ./zig-out/bin/zig
./zig-out/bin/zig: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, with debug_info, not stripped

# ldd ./zig-out/bin/zig
        動的実行ファイルではありません

静的バイナリ(バイナリだけを別のコンピュータにコピーすれば、実行できる)でありながら、サイズはわずか962キビバイトです。
しかし、まだデバッグ情報が含まれています。
それを削除すると、サイズはどうなるでしょう?

# strip ./zig-out/bin/zig && ls -thal ./zig-out/bin/zig
-rwxr-xr-x 1 suwako suwako 374K  5月 24 20:42 ./zig-out/bin/zig

驚くほど小さいですね!

次はRustのバイナリ

# ls -thal ./target/debug/rust
-rwxr-xr-x 2 suwako suwako 9.5M  5月 24 20:16 ./target/debug/rust

# file ./target/debug/rust
./target/debug/rust: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=4fd652bc3852eda0ef3d5281c51ef947e4ecb740, for GNU/Linux 4.4.0, with debug_info, not stripped

# ldd ./target/debug/rust
        linux-vdso.so.1 (0x00007ffefa4f9000)
        libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007fade07fd000)
        libc.so.6 => /usr/lib/libc.so.6 (0x00007fade0616000)
        /lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007fade08a4000)

なぜlibcとlibgccを含めるのでしょうか?
そして、「linux-vdso」とは何でしょうか?
先に「奇妙な依存ソフトウェア」と述べた時、これを指していました。
また、なぜ「Hello, World!」だけを出力するソフトウェアが9.5メビバイトも必要なのでしょう?
Zigのバイナリは静的であることを覚えていますか?
Rustは動的であるため、さらに奇妙に感じます。

デバッグ情報を削除すると…

# strip ./target/debug/rust && ls -thal ./target/debug/rust
-rwxr-xr-x 2 suwako suwako 319K  5月 24 20:50 ./target/debug/rust

結果はそこまで悪くありませんね。
しかし、バイナリは動的なので、他のコンピュータにコピーした場合、ライブラリが異なるフォルダに入っていたり、存在しない場合、実行できません(例えば、ArtixでコンパイルしたものがDevuanで実行できない可能性がある)。

以上


Valid XHTML 1.1 正当なCSSです! どのブラウザでも表示出来ます! hacker emblem SDGsに反対 スマホに反対 肉食生活なお OpenBSD

匿名自営業076の設立者
ページのGitGitリポジトリ