Upgrade to Pro — share decks privately, control downloads, hide ads and more …

本編では話さない Zig の話

ANDPAD inc
October 15, 2024

本編では話さない Zig の話

髙田 雄大 ydah @ydah_
2024 年 10 月 15 日
Kaigi on Rails 2024 タイムテーブル解説会

ANDPAD inc

October 15, 2024
Tweet

More Decks by ANDPAD inc

Other Decks in Programming

Transcript

  1. © 2024 ANDPAD All Rights Reserved. 1 本編では話さない Zig のはなし

    2024/10/15 Kaigi on Rails 2024 タイムテーブル解説会 @ydah 株式会社アンドパッド 開発本部 SWE
  2. Confidential © 2024 ANDPAD All Rights Reserved. 2021年12月入社。現在はリアーキテクティングチームに所属し、大規 模な Rails

    アプリケーションの再設計や横断的な技術課題の解決に取り 組んでいる。大阪の地域 Ruby コミュニティである Kyobashi.rb の創設 メンバー。また、大阪Ruby会議04ではチーフオーガナイザーを務め た。近年は、 Ruby の構文解析器ジェネレータ「 Lrama 」のコミッター として、 Ruby の構文解析器の改善に取り組んでいる。 Yudai Takada 開発本部 SWE Profile ʛ 経 歴 2 About me
  3. © 2024 ANDPAD All Rights Reserved. 現場の効率化から経営改善まで一元管理できる クラウド型建設プロジェクト管理サービス 社 内 社 外

    営業 / 監督 / 設計 事務 / 管理職 職人 / 業者 メーカー / 流通 案件管理 資料 工程表 写真 報告 チャット 黒板 図面 受発注 •ɹ•ɹ• 3 ANDPADとは
  4. © 2024 ANDPAD All Rights Reserved. Modern C/Better Cと聞いて。折角なのでこの折に使ってみたかったんで す..

    前職は主にC / C++で組み込み、通信制御系のシステムを開発してました。 むしろRubyやRailsを仕事で使う様になってからまだ3年経ってないです。 なんで Zig ? Q A Modern Cだからと言っても、あなたはWebエンジニアなのでは? Q A 8 よくある質問
  5. © 2024 ANDPAD All Rights Reserved. 10 Zig ってなに? ⚡

    A Simple Language!! • No hidden control flow. (隠れた制御フローはねえ) • No hidden memory allocations. ( 隠れたメモリ割り当てもねえ) • No preprocessor, no macros. (プリプロセッサもマクロも使ってねえ) https://ziglang.org/
  6. © 2024 ANDPAD All Rights Reserved. 11 Zig ってなに? ⚡

    つまりは 見える通り に動く https://ziglang.org/learn/overview/ va r a = b + c.d; foo(); ba r ();
  7. © 2024 ANDPAD All Rights Reserved. 12 Zig ってなに? ⚡

    フィールドアクセスの様に見える 関数呼び出しはない https://ziglang.org/learn/overview/ va r a = b + c.d; foo(); ba r (); 常にフィールドアクセス
  8. © 2024 ANDPAD All Rights Reserved. 13 Zig ってなに? ⚡

    演算子オーバーロードもない https://ziglang.org/learn/overview/ va r a = b + c.d; foo(); ba r (); + は常に + 演算子
  9. © 2024 ANDPAD All Rights Reserved. 14 Zig ってなに? ⚡

    例外もない https://ziglang.org/learn/overview/ va r a = b + c.d; foo(); ba r (); foo()で例外が発生して、 bar()が呼ばれないことはない
  10. © 2024 ANDPAD All Rights Reserved. 15 Zig ってなに? ⚡

    小さい、シンプル Zig's entire syntax is specified with a 580-line PEG grammar file. (Zigの全ての文法は、580行のPEG文法ファイルで指定されて います。) https://ziglang.org/ https://github.com/python/cpython/blob/main/Grammar/python.gram Pythonで1500-lineぐらいの大きさ (コメント含む)
  11. © 2024 ANDPAD All Rights Reserved. 18 defer ⚡ もう

    free 忘れる なんて 言わないよ 絶対 https://zig.guide/language-basics/defer/ pub fn main() void { va r v: i32 = 0; defe r std.debug.p r int("{d}\n", .{v}); defe r v = 10 + 20; std.debug.p r int("{d}\n", .{v}); } golangの便利なやつ ブロック終了時に実行される 複数定義されている場合は下から
  12. © 2024 ANDPAD All Rights Reserved. 19 defer ⚡ Go

    の defer との違い① https://zig.guide/language-basics/defer/ pub fn main() !void { if (t r ue) { std.debug.p r int("Hello\n", .{}); defe r std.debug.p r int("Wo r ld\n", .{}); } defe r std.debug.p r int("Wo r ld\n", .{}); std.debug.p r int("Hello\n", .{}); } ブロックを抜ける時に実行 ※Goの場合は関数ブロックのみ
  13. © 2024 ANDPAD All Rights Reserved. 20 defer ⚡ Go

    の defer との違い② https://zig.guide/language-basics/defer/ func main() { va r x bool = t r ue if(t r ue) { defe r fmt.P r int(x) } defe r x = false } いかなる文も利用可能 ※Go の場合はSyntax Error
  14. © 2024 ANDPAD All Rights Reserved. 21 defer ⚡ errdefer

    もあるよ https://ziglang.org/documentation/master/#errdefer fn c r eateFoo(pa r am: i32) !Foo { const foo = t r y t r yToAllocateFoo(); e r r defe r deallocateFoo(foo); if (pa r am > 1337) r etu r n e r r o r .InvalidPa r am; r etu r n foo; } スコープがエラーを返すと実行 ※Goにはない機能
  15. © 2024 ANDPAD All Rights Reserved. 22 どう嬉しいか? • ブロックを抜けた後に必ず実行される処理を指定できる

    • ファイルのクローズ、排他制御のアンロック、メモリの開放等 • より柔軟に書けるような機能や仕組みが用意されている ブロックを抜けた際に必ず実行できるの嬉しい〜〜 defer ⚡
  16. © 2024 ANDPAD All Rights Reserved. 24 多様な Allocators ⚡

    std.heap.page_allocator https://zig.guide/master/standard-library/allocators/ pub fn main() !void { const alc = std.heap.page_allocato r ; const mem = t r y alc.alloc(u8, 100); defe r alc.f r ee(mem); } 最も基本的なアロケーター OSにページ単位でメモリ要求 最小単位はページ
  17. © 2024 ANDPAD All Rights Reserved. 25 多様な Allocators ⚡

    std.heap.FixedBufferAllocator https://zig.guide/master/standard-library/allocators/ pub fn main() !void { va r buf: [1000]u8 = undef i ned; va r f = std.heap.FixedBuffe r Allocato r ɹɹɹɹɹɹɹ .init(&buf); const alc = f.allocato r (); const memo r y = t r y alc.alloc(u8, 100); defe r alc.f r ee(memo r y); } 固定長のメモリ割当 ヒープ割当を行わないアロケータ メモリが限られた環境で便利
  18. © 2024 ANDPAD All Rights Reserved. 26 多様な Allocators ⚡

    std.heap.GeneralPurposeAllocator https://zig.guide/master/standard-library/allocators/ pub fn main() !void { va r gpa = std.heap.Gene r alPu r poseAllocato r (.{}){}; defe r std.debug.asse r t(gpa.deinit() = = .ok); const alc = gpa.allocato r (); const pt r = t r y alc.c r eate(u32); } 二重解放や開放後使用を防止 リークを検出できる
  19. © 2024 ANDPAD All Rights Reserved. 27 多様な Allocators ⚡

    std.heap.c_allocator https://zig.guide/master/standard-library/allocators/ pub fn main() !void { const calc = std.heap.c_allocato r ; const mem = t r y calc.alloc(u32, 100); defe r calc.f r ee(mem); } libcのリンクが必要 mallocの薄いラッパー アラインメント/パディング済
  20. © 2024 ANDPAD All Rights Reserved. 28 どう嬉しいか? • 特定のメモリ使用パターンに応じて、効率的にメモリ管理ができる

    • 必要とされるパフォーマンスと安全性に応じたメモリ管理が可能 • また、組み合わせて使うことも可能 メモリ管理つらい問題を解決するための仕組みありがたい〜〜 多様な Allocators ⚡
  21. © 2024 ANDPAD All Rights Reserved. 30 Comptime⚡ ソースコードのコンパイル時に コードブロックを実行できる機能

    Zigのビルドプロセス中にコードを実行し、その結果をコンパイルされた バイナリに反映させる機能。実行時に行うはずの計算や処理をコンパイル 時に行うことができる。comptimeで修飾された式はコンパイル時に既知 でないといけない。 https://zig.guide/language-basics/comptime/
  22. © 2024 ANDPAD All Rights Reserved. 31 Comptime⚡ コンパイル時の計算 https://zig.guide/language-basics/comptime/

    fn facto r ial(n: u32) u32 { if (n = = 0) r etu r n 1; r etu r n n * facto r ial(n - 1); } pub fn main() void { const num = comptime facto r ial(5); } コンパイル時に計算される 実行時に num にはすでに、 120 が代入されている
  23. © 2024 ANDPAD All Rights Reserved. 32 Comptime⚡ ジェネリック関数/型テンプレート https://zig.guide/language-basics/comptime/

    pub fn add(comptime T : type, a: T, b: T) T { r etu r n a + b; } pub fn main() void { const r es_int = add(i32, 1, 10); const r es_float = add(f32, 0.5, 5.8); } 型Tをパラメータとして受け取る aとbは型Tに応じて型が決まる
  24. © 2024 ANDPAD All Rights Reserved. 33 Comptime⚡ 条件分岐 https://zig.guide/language-basics/comptime/

    https://ziglang.org/documentation/master/#compileError fn onlyDebug() void { if (comptime builtin.mode ! = .Debug) { @compileE r r o r ("Debug mode only"); } } コンパイル時の条件分岐 @compileErrorでエラーを発生 させられる
  25. © 2024 ANDPAD All Rights Reserved. 34 Comptime⚡ どう嬉しいか? •

    ランタイムのパフォーマンスを向上ができる • 特定の条件や値に応じてコンパイル時に最適化されたコードを生成可能 • コンパイル時に決定される処理を示すことができる 「コンパイル時に処理される」ことを明文化できるの嬉しい〜〜
  26. © 2024 ANDPAD All Rights Reserved. 35 結論 シンプルだけどModernでBetterなCだった •

    モダンな機能を持ちながらも、複雑すぎずバランスがよい • C言語の厳しさを感じるメモリ管理に対する改善の意図が見て取れる • 暗黙的な処理がないため、素直にコードを書けるのはよい これからも使おうと思えるぐらいに良い言語でした