Slide 1

Slide 1 text

© 2024 ANDPAD All Rights Reserved. 1 本編では話さない Zig のはなし 2024/10/15 Kaigi on Rails 2024 タイムテーブル解説会 @ydah 株式会社アンドパッド 開発本部 SWE

Slide 2

Slide 2 text

Confidential © 2024 ANDPAD All Rights Reserved. 2021年12月入社。現在はリアーキテクティングチームに所属し、大規 模な Rails アプリケーションの再設計や横断的な技術課題の解決に取り 組んでいる。大阪の地域 Ruby コミュニティである Kyobashi.rb の創設 メンバー。また、大阪Ruby会議04ではチーフオーガナイザーを務め た。近年は、 Ruby の構文解析器ジェネレータ「 Lrama 」のコミッター として、 Ruby の構文解析器の改善に取り組んでいる。 Yudai Takada 開発本部 SWE Profile ʛ 経 歴 2 About me

Slide 3

Slide 3 text

© 2024 ANDPAD All Rights Reserved. 現場の効率化から経営改善まで一元管理できる クラウド型建設プロジェクト管理サービス 社 内 社 外 営業 / 監督 / 設計 事務 / 管理職 職人 / 業者 メーカー / 流通 案件管理 資料 工程表 写真 報告 チャット 黒板 図面 受発注 ●ɹ●ɹ● 3 ANDPADとは

Slide 4

Slide 4 text

© 2024 ANDPAD All Rights Reserved. 4 今日の話

Slide 5

Slide 5 text

© 2024 ANDPAD All Rights Reserved. 5

Slide 6

Slide 6 text

© 2024 ANDPAD All Rights Reserved. 6 Zig で RDBMS を作った話

Slide 7

Slide 7 text

© 2024 ANDPAD All Rights Reserved. 7 Zig で RDBMS を作った話

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

© 2024 ANDPAD All Rights Reserved. 9 Zig について

Slide 10

Slide 10 text

© 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/

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

© 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ぐらいの大きさ (コメント含む)

Slide 16

Slide 16 text

© 2024 ANDPAD All Rights Reserved. 16 「ない」話は ここまで

Slide 17

Slide 17 text

© 2024 ANDPAD All Rights Reserved. 17 defer ⚡

Slide 18

Slide 18 text

© 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の便利なやつ ブロック終了時に実行される 複数定義されている場合は下から

Slide 19

Slide 19 text

© 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の場合は関数ブロックのみ

Slide 20

Slide 20 text

© 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

Slide 21

Slide 21 text

© 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にはない機能

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

© 2024 ANDPAD All Rights Reserved. 23 多様な Allocators ⚡

Slide 24

Slide 24 text

© 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にページ単位でメモリ要求 最小単位はページ

Slide 25

Slide 25 text

© 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); } 固定長のメモリ割当 ヒープ割当を行わないアロケータ メモリが限られた環境で便利

Slide 26

Slide 26 text

© 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); } 二重解放や開放後使用を防止 リークを検出できる

Slide 27

Slide 27 text

© 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の薄いラッパー アラインメント/パディング済

Slide 28

Slide 28 text

© 2024 ANDPAD All Rights Reserved. 28 どう嬉しいか? ● 特定のメモリ使用パターンに応じて、効率的にメモリ管理ができる ● 必要とされるパフォーマンスと安全性に応じたメモリ管理が可能 ● また、組み合わせて使うことも可能 メモリ管理つらい問題を解決するための仕組みありがたい〜〜 多様な Allocators ⚡

Slide 29

Slide 29 text

© 2024 ANDPAD All Rights Reserved. 29 Comptime ⚡

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

© 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 が代入されている

Slide 32

Slide 32 text

© 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に応じて型が決まる

Slide 33

Slide 33 text

© 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でエラーを発生 させられる

Slide 34

Slide 34 text

© 2024 ANDPAD All Rights Reserved. 34 Comptime⚡ どう嬉しいか? ● ランタイムのパフォーマンスを向上ができる ● 特定の条件や値に応じてコンパイル時に最適化されたコードを生成可能 ● コンパイル時に決定される処理を示すことができる 「コンパイル時に処理される」ことを明文化できるの嬉しい〜〜

Slide 35

Slide 35 text

© 2024 ANDPAD All Rights Reserved. 35 結論 シンプルだけどModernでBetterなCだった ● モダンな機能を持ちながらも、複雑すぎずバランスがよい ● C言語の厳しさを感じるメモリ管理に対する改善の意図が見て取れる ● 暗黙的な処理がないため、素直にコードを書けるのはよい これからも使おうと思えるぐらいに良い言語でした

Slide 36

Slide 36 text

© 2024 ANDPAD All Rights Reserved. 36 end