A Simple Language!! • No hidden control flow. (隠れた制御フローはねえ) • No hidden memory allocations. ( 隠れたメモリ割り当てもねえ) • No preprocessor, no macros. (プリプロセッサもマクロも使ってねえ) https://ziglang.org/
の 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の場合は関数ブロックのみ
の 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
もあるよ 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にはない機能
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にページ単位でメモリ要求 最小単位はページ
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); } 固定長のメモリ割当 ヒープ割当を行わないアロケータ メモリが限られた環境で便利
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); } 二重解放や開放後使用を防止 リークを検出できる
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の薄いラッパー アラインメント/パディング済
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 が代入されている
https://ziglang.org/documentation/master/#compileError fn onlyDebug() void { if (comptime builtin.mode ! = .Debug) { @compileE r r o r ("Debug mode only"); } } コンパイル時の条件分岐 @compileErrorでエラーを発生 させられる