Kernel/VM探検隊online part6でZig言語の話をしました
2023/01/15にオンライン開催されたKernel/VM探検隊online part6で10分の枠で話をしました。
発表資料
(発表時のスライドで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禁止とは真逆です。
「RustはSSAをベースに」はちょっと言い方おかしいかな。「RustはSSAの考え方を色濃く反映していて」でしょうか。
SSAはコンパイラの中身を勉強すると出てくる専門用語です。
unsafeまみれになる部分を切り出してZigで書こう
Go言語でcgo(C言語で書いてリンクする)の部分をクロスコンパイルするのに、zig ccを使うと便利という話を聞いています。
こんなふうにするのはどうでしょうか。
- unsefeまみれになる最下層の部分をC言語に切り出す。(おそらくすでにそうしている)
- そのC言語で書かれた部分のライブラリを作るためのコンパイラをzig cc に置き換える。
- C言語のライブラリをビルドするためにmakeやcmakeを使っているところをbuild.zigに置き換える。
- C言語のソースコードをZigで書き換える。(zig translate-c という自動変換ツールが助けになる)
こうやって、徐々に既存のC言語で書かれた部分をZigに移行させることができます。
Zigでは「型」も一級市民(first class citizen)
genericsがすごく素直に書けます。
算術演算のオーバーフローについて
加算の場合、普通に +
の演算子を使うとオーバーフローがチェックされ、オーバーフローした場合には異常終了してスタックトレースが出力されます。
オーバーフローで異常終了するのでなく、検出して処理したい場合には@addWidthOverflow
という組み込み関数が用意されています。他の算術演算も同様のものがあります。
公式のパッケージマネージャはもうすぐかも
masterにマージされました。次のリリースで(実験的に)利用可能になるかもしれません。
Zigでinterface
Zigでinterfaceっぽいものを実現する方法については別に記事を書く予定ですが、とりあえずこちらを。書きました**
** 2023/01/30LogmeTechに掲載されました(2023/02/06)
関連
Discussion