🐡

Kernel/VM探検隊online part6でZig言語の話をしました

2023/01/14に公開約2,300字

2023/01/15にオンライン開催されたKernel/VM探検隊online part6で10分の枠で話をしました。

発表資料


発表スライド

YouTubeのアーカイブ

(発表時のスライドでs3であるべきところをi3と誤記していました。現在のスライドは修正済み)
勘違い。i3は正しい。むしろi32と書くべきところをs32と書いてあったので修正した。

関数の未使用引数について

fn func(x: i32, y: i32, z: i32) i32 {
    _ = z;      // これがないとコンパイルエラー
    return x + y;
}

以下のように書くこともできます。
試行錯誤的でなく、恒久的にこの第三引数を使用しないならば、このほうがいいですね。

fn func(x: i32, y: i32, _: i32) i32 {
    return x + y;
}

twitterで指摘をいただき調べました。

変数shadowingの禁止について

Rustはむしろ同じスコープでも新たな変数に同じ変数名を使うことを許可しています。つまり、変数shadowing禁止とは真逆です。

https://twitter.com/tetsu_koba/status/1614517735798734850

「RustはSSAをベースに」はちょっと言い方おかしいかな。「RustはSSAの考え方を色濃く反映していて」でしょうか。
SSAはコンパイラの中身を勉強すると出てくる専門用語です。
https://en.wikipedia.org/wiki/Static_single-assignment_form
https://ja.wikipedia.org/wiki/静的単一代入

unsafeまみれになる部分を切り出してZigで書こう

https://twitter.com/tetsu_koba/status/1614518797242716161

Go言語でcgo(C言語で書いてリンクする)の部分をクロスコンパイルするのに、zig ccを使うと便利という話を聞いています。
こんなふうにするのはどうでしょうか。

  1. unsefeまみれになる最下層の部分をC言語に切り出す。(おそらくすでにそうしている)
  2. そのC言語で書かれた部分のライブラリを作るためのコンパイラをzig cc に置き換える。
  3. C言語のライブラリをビルドするためにmakeやcmakeを使っているところをbuild.zigに置き換える。
  4. C言語のソースコードをZigで書き換える。(zig translate-c という自動変換ツールが助けになる)

こうやって、徐々に既存のC言語で書かれた部分をZigに移行させることができます。

Zigでは「型」も一級市民(first class citizen)

https://twitter.com/tetsu_koba/status/1614522944507777024
genericsがすごく素直に書けます。

算術演算のオーバーフローについて

加算の場合、普通に + の演算子を使うとオーバーフローがチェックされ、オーバーフローした場合には異常終了してスタックトレースが出力されます。
オーバーフローで異常終了するのでなく、検出して処理したい場合には@addWidthOverflowという組み込み関数が用意されています。他の算術演算も同様のものがあります。

公式のパッケージマネージャはもうすぐかも

masterにマージされました。次のリリースで(実験的に)利用可能になるかもしれません。
https://github.com/ziglang/zig/pull/14265

Zigでinterface

Zigでinterfaceっぽいものを実現する方法については別に記事を書く予定ですが、とりあえずこちらを。
https://zig.news/kristoff/easy-interfaces-with-zig-0100-2hc5

関連

https://zenn.dev/tetsu_koba/articles/2da58bd66586aa
https://zenn.dev/tetsu_koba/articles/0e91b69ff72ae0
https://zenn.dev/tetsu_koba/articles/a996108d5a9fcd
https://zenn.dev/tetsu_koba/articles/16641f22645f8b

Discussion

ログインするとコメントできます