ãã°ãããèšäºã§ãããçæ³çãªããã°ã©ãã³ã°èšèªã®äž»èŠ³çããžã§ã³ãã«å¯Ÿããæåã®ã³ã¡ã³ãã¯ãZigããã°ã©ãã³ã°èšèªãžã®åç §ã§ããããšãå€æããŸããã åœç¶ãC ++ãDãããã³Rustã®ãããã§ãããšäž»åŒµããèšèªã®çš®é¡ãèå³æ·±ããã®ã«ãªããŸããã ç§ã¯èŠã-èšèªã¯ãããã§ãããé¢çœããã ã£ãã çŽ æŽãããsiã®ãããªæ§æããšã©ãŒåŠçãžã®ç¬èªã®ã¢ãããŒããçµã¿èŸŒã¿ã®ã³ã«ãŒãã³ã ãã®èšäºã¯ãå®è¡äžã®ã³ãŒãäŸããã®åœŒãèªèº«ã®èããå°è±¡ãæ£ãã°ããããå ¬åŒææžã®ç°¡åãªæŠèŠã§ãã
ã¯ããã«
ã³ã³ãã€ã©ã®ã€ã³ã¹ããŒã«ã¯éåžžã«ç°¡åã§ããWindowsã®å Žåãé åžããã±ãŒãžãããã€ãã®ãã©ã«ããŒã«è§£åããã ãã§ãã åããã©ã«ããŒã«hello.zigããã¹ããã¡ã€ã«ãäœæããããã«ããã¥ã¡ã³ãã®ã³ãŒãã貌ãä»ããŠä¿åããŸãã çµã¿ç«ãŠã¯ã³ãã³ãã«ãã£ãŠè¡ãããŸã
zig build-exe hello.zig
次ã«ãhello.exeãåããã£ã¬ã¯ããªã«è¡šç€ºãããŸãã
ã¢ã»ã³ããªã«å ããŠããŠããããã¹ãã¢ãŒãã䜿çšã§ããŸãããã®ãããã³ãŒãã§ãã¹ããããã¯ã䜿çšããããã¹ãã®ã¢ã»ã³ããªãšèµ·åãå®è¡ãããŸãã
zig test hello.zig
æåã®å¥åŠãª
ã³ã³ãã€ã©ã¯ãWindowsã®æ¹è¡ïŒ\ r \ nïŒããµããŒãããŠããŸããã ãã¡ãããåã·ã¹ãã ïŒWinãNixãMacïŒã®æ¹è¡ãç¬èªã®ãã®ã§ãããšããäºå®ã¯ãèéãšéå»ã®éºç©ã§ãã ãã ããå®è¡ããããšã¯äœããªãã®ã§ãããšãã°ãã¡ã¢åž³++ã§ã³ã³ãã€ã©ã«å¿ èŠãªåœ¢åŒãéžæããã ãã§ãã
å¶ç¶å¶ç¶åºäŒã£ã2çªç®ã®å¥åŠãªç¹-ã¿ãã¯ã³ãŒãã§ã¯ãµããŒããããŠããŸããïŒ ã¹ããŒã¹ã®ã¿ã ããããããã¯èµ·ãããŸã:)
ããããããã¯ããã¥ã¡ã³ãã«æ£çŽã«æžãããŠããŸã-çå®ã¯ãã§ã«æåŸã«ãããŸãã
ã³ã¡ã³ã
ãã1ã€ã®å¥åŠãªç¹ã¯ãZigãè€æ°è¡ã³ã¡ã³ãããµããŒãããŠããªãããšã§ãã ç§ã¯ãã¹ãŠãå€ä»£ã®ã¿ãŒããã¹ã«ã«ã§æ£ããè¡ãããããšãèŠããŠããŸã-ãã¹ããããè€æ°è¡ã³ã¡ã³ãããµããŒããããŠããŸããã ã©ãããããã以æ¥ããã®ãããªåçŽãªããšããã¹ã¿ãŒããèšèªéçºè ã¯ããŸãã:)
ããããããã¥ã¡ã³ã¿ãªãŒã®ã³ã¡ã³ãããããŸãã ///ã§å§ãŸããŸãã ç¹å®ã®å Žæ-察å¿ãããªããžã§ã¯ãïŒå€æ°ãé¢æ°ãã¯ã©ã¹ãªã©ïŒã®åã«ããå¿ èŠããããŸãã ããããå¥ã®å Žæã«ããå Žå-ã³ã³ãã€ã«ãšã©ãŒã æªããªãã
å€æ°å®£èš
ããŒã¯ãŒãïŒconstãŸãã¯varïŒãæåã«ã次ã«ååã次ã«ãªãã·ã§ã³ã§åã次ã«åæå€ãæžã蟌ãŸãããšãããã¡ãã·ã§ããã«ãªä»ïŒããã³ã€ããªãã®ãŒçã«æ£ããïŒã¹ã¿ã€ã«ã§è¡ãããŸãã ã€ãŸã èªååæšè«ãå©çšå¯èœã§ãã å€æ°ã¯åæåããå¿ èŠããããŸã-åæå€ãæå®ããªããšãã³ã³ãã€ã«ãšã©ãŒãçºçããŸãã ãã ããç¹å¥ãªæªå®çŸ©å€ãçšæãããŠãããåæåãããŠããªãå€æ°ãæ瀺çã«æå®ããããã«äœ¿çšã§ããŸãã
var i:i32 = undefined;
ã³ã³ãœãŒã«åºå
å®éšã®ããã«ãã³ã³ãœãŒã«ãžã®åºåãå¿ èŠã§ã-ãã¹ãŠã®äŸã§ãããã䜿çšãããæ¹æ³ã§ãã ãã©ã°ã€ã³ã®åéã§
const warn = std.debug.warn;
ãããŠãã³ãŒãã§ã¯æ¬¡ã®ããã«æžãããŠããŸãïŒ
warn("{}\n{}\n", false, "hi");
ã³ã³ãã€ã©ã«ã¯ããã€ãã®ãã°ãããããã®æ¹æ³ã§æŽæ°ãŸãã¯æµ®åå°æ°ç¹æ°ãåºåããããšãããšæ£çŽã«å ±åãããŸãã
ãšã©ãŒïŒã³ã³ãã€ã©ã®ãã°ïŒvar argsé¢æ°ã®æŽæ°ãªãã©ã«ãšæµ®åå°æ°ç¹ãªãã©ã«ããã£ã¹ãããå¿ èŠããããŸãã github.com/ziglang/zig/issues/557
ããŒã¿å
ããªããã£ãå
ååã¯æããã«RustïŒi8ãu8ã... i128ãu128ïŒããåããããã®ã§ããã€ããªCäºææ§ã®ããã®ç¹å¥ãªåã4çš®é¡ã®æµ®åå°æ°ç¹åïŒf16ãf32ãf64ãf128ïŒããããŸãã ã¿ã€ãboolããããŸãã é·ããŒãã®ãã€ããšç¹å¥ãªæ»ãããªãã¿ã€ãããããŸãããããã«ã€ããŠã¯åŸã§èª¬æããŸãã
ãŸãã1ã65535ã®ãããåäœã®ä»»æã®é·ãã®æŽæ°åãäœæã§ããŸããååã¯æåiãŸãã¯uã§å§ãŸãããããåäœã®é·ããæžã蟌ãŸããŸãã
// ! var j:i65535 = 0x0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF;
ãã ããã³ã³ãœãŒã«ã«ãã®å€ãååŸã§ããŸããã§ãã-ã³ã³ãã€ã«äžã«LLVMã§ãšã©ãŒãçºçããŸããã
äžè¬ã«ãããã¯ãããŸãã§ããïŒIMHOïŒã³ã³ãã€ã©ã¬ãã«ã§æ£ç¢ºã«é·ãæ°å€ãªãã©ã«ããµããŒãããããšã¯æ£ããã§ããããã®æ¹æ³ã§åãåœåããããšã¯ããŸããããããŸãããããã³ãã¬ãŒãåãä»ããŠæ£çŽã«è¡ãæ¹ãè¯ãã§ãïŒãèå³æ·±ããœãªã¥ãŒã·ã§ã³ã§ãã ãããŠããªãå¶éã¯65535ã§ããïŒ GMPã®ãããªã©ã€ãã©ãªã¯ããã®ãããªå¶éã課ããŠããªãããã§ããïŒ
æååãªãã©ã«
ãããã¯ãæåã®é åã§ãïŒæ«å°Ÿã®ãŒãã¯ãªãïŒã çµäºãŒããæã€ãªãã©ã«ã®å Žåãæ¥é èŸãcãã䜿çšãããŸãã
const normal_bytes = "hello"; const null_terminated_bytes = c"hello";
ã»ãšãã©ã®èšèªãšåæ§ã«ãZigã¯æšæºã®ãšã¹ã±ãŒãã·ãŒã±ã³ã¹ããµããŒãããã³ãŒãïŒ\ uNNNNã\ UNNNNNNïŒNã¯16é²æ°ïŒïŒãä»ããŠUnicodeæåãæ¿å ¥ããŸãã
è€æ°è¡ãªãã©ã«ã¯ãåè¡ã®å é ã«2ã€ã®ããã¯ã¹ã©ãã·ã¥ã䜿çšããŠåœ¢æãããŸãã åŒçšç¬Šã¯å¿ èŠãããŸããã ã€ãŸããçã®è¡ãäœæããããšããè©Šã¿ãããã€ããããŸãããIMHOã¯å€±æããŸã-çã®è¡ã®å©ç¹ã¯ãä»»æã®ããã¹ããã³ãŒãã®ã©ãããã§ãæ¿å ¥ã§ããããšã§ã-çæ³çã«ã¯äœãå€æŽããŸããããããã§ã¯åè¡ã®å é ã«\\ãè¿œå ããå¿ èŠããããŸãã
const multiline = \\#include <stdio.h> \\ \\int main(int argc, char **argv) { \\ printf("hello world\n"); \\ return 0; \\} ;
æŽæ°ãªãã©ã«
ãã¹ãŠãsiã®ãããªèšèªã§ãã 8é²ãªãã©ã«ã«ã¯æ¥é èŸ0oã䜿çšãããCã®ããã«ãŒãã ãã§ã¯ãªãããšã«éåžžã«æºè¶³ããŠããŸãã ãã¬ãã£ãã¯ã¹ã0bã®ãã€ããªãªãã©ã«ããµããŒããããŠããŸãã æµ®åå°æ°ç¹ãªãã©ã«ã¯16é²æ°ã«ããããšãã§ããŸãïŒ GCCæ¡åŒµã§è¡ãããŸãïŒã
éå¶
ãã¡ãããæšæºçãªç®è¡æŒç®ãè«çæŒç®ããããåäœã®CæŒç®ããããŸãã ççž®æäœããµããŒããããŠããŸãïŒ+ =ãªã©ïŒã &&ããã³||ã®ä»£ããã« ããŒã¯ãŒãandããã³orã䜿çšãããŸãã èå³æ·±ãç¹ã¯ãã©ããã¢ã©ãŠã³ãã»ãã³ãã£ã¯ã¹ãä¿èšŒãããæäœãè¿œå ã§ãµããŒããããããšã§ãã 次ã®ããã«ãªããŸãã
a +% b a +%= b
ãã®å Žåãéåžžã®ç®è¡æŒç®ã¯ãªãŒããŒãããŒãä¿èšŒããããªãŒããŒãããŒäžã®çµæã¯æªå®çŸ©ãšèŠãªãããŸãïŒå®æ°ã«å¯ŸããŠã³ã³ãã€ã«ãšã©ãŒãçæãããŸãïŒã ç§èŠããã¯å°ãå¥åŠã§ãããã©ãããããã¯Cèšèªã®ã»ãã³ãã£ã¯ã¹ãšã®äºææ§ã®ããã€ãã®æ·±ãèæ ®ããäœãããŠããŸãã
é å
é åãªãã©ã«ã¯æ¬¡ã®ããã«ãªããŸãã
const msg = []u8{ 'h', 'e', 'l', 'l', 'o' }; const arr = []i32{ 1, 2, 3, 4 };
æååã¯ãCã®ããã«æåã®é åã§ãã è§ãã£ãã䜿çšããã¯ã©ã·ãã¯ãªã€ã³ããã¯ã¹ã é åã®å ç®ïŒé£çµïŒããã³ä¹ç®ã®æäœãæäŸãããŸãã ããã¯éåžžã«èå³æ·±ãããšã§ããé£çµã§ãã¹ãŠãæãããªå Žåã¯ãä¹ç®-誰ãããããå®è£ ãããŸã§åŸ ã¡ç¶ããä»ã¯åŸ ã¡ãŸã:)ã¢ã»ã³ãã©ãŒïŒïŒïŒã§ã¯ãéè€ããŒã¿ãçæã§ãããããªdupæäœããããŸãã ä»Zigã§ïŒ
const one = []i32{ 1, 2, 3, 4 }; const two = []i32{ 5, 6, 7, 8 }; const c = one ++ two; // { 1,2,3,4,5,6,7,8 } const pattern = "ab" ** 3; // "ababab"
ãã€ã³ã¿
æ§æã¯Cã«äŒŒãŠããŸãã
var x: i32 = 1234; // const x_ptr = &x; //
éæ¥åç §ïŒãã€ã³ã¿ãŒã«ããå€ã®ååŸïŒã«ã¯ãéåžžãšã¯ç°ãªãåŸçœ®æäœã䜿çšãããŸãã
x_ptr.* == 5678; x_ptr.* += 1;
ãã€ã³ã¿ãŒåã¯ãååã®åã«ã¢ã¹ã¿ãªã¹ã¯ãèšå®ããããšã«ããæ瀺çã«æå®ãããŸãã
const x_ptr : *i32 = &x;
ã¹ã©ã€ã¹ïŒã¹ã©ã€ã¹ïŒ
èšèªã«çµã¿èŸŒãŸããããŒã¿æ§é ãé åãŸãã¯ãã®äžéšãåç §ã§ããŸãã æåã®èŠçŽ ãžã®ãã€ã³ã¿ãšèŠçŽ ã®æ°ãå«ãŸããŠããŸãã 次ã®ããã«ãªããŸãã
var array = []i32{ 1, 2, 3, 4 }; const slice = array[0..array.len];
確ãã«Goããåãããããã§ãã ãŸããèšèªã«åã蟌ã䟡å€ããããã©ãããããããŸãããããã®ãããªãã®ã®OOPèšèªã§ã®å®è£ ã¯éåžžã«åæ©çãªãã®ã§ãã
æ§é
æ§é ã宣èšããèå³æ·±ãæ¹æ³ïŒå®æ°ã宣èšããããã®ã¿ã€ãã¯èªåçã«ãã¿ã€ããïŒã¿ã€ãïŒãšããŠè¡šç€ºããããããæ§é ã®ååãšããŠäœ¿çšãããŸãã ãããŠãæ§é èªäœïŒæ§é ïŒã¯ãååãªããã§ãã
const Point = struct { x: f32, y: f32, };
Cã©ã€ã¯ãªèšèªã§ã¯éåžžã®æ¹æ³ã§ååãæå®ããããšã¯ã§ããŸããããã³ã³ãã€ã©ã¯ç¹å®ã®ã«ãŒã«ã«åŸã£ãŠååã衚瀺ããŸããç¹ã«ãäžèšã§æ€èšããå Žåããåãå®æ°ã®ååãšäžèŽããŸãã
äžè¬ã«ããã®èšèªã¯ãã£ãŒã«ãã®é åºãšã¡ã¢ãªå ã§ã®ãããã®æŽåãä¿èšŒããŸããã ä¿èšŒãå¿ èŠãªå Žåã¯ããããã±ãŒãžåããããæ§é ã䜿çšããå¿ èŠããããŸãã
const Point2 = packed struct { x: f32, y: f32, };
åæå-Sishnyæå®åã®ã¹ã¿ã€ã«ïŒ
const p = Point { .x = 0.12, .y = 0.34, };
æ§é ã«ã¯ã¡ãœããããããŸãã ãã ããæ§é äœã«ã¡ãœãããé 眮ããããšã¯ãæ§é äœãåå空éãšããŠäœ¿çšããã ãã§ãã C ++ãšã¯ç°ãªãããã®ãã©ã¡ãŒã¿ãŒã¯æé»çã«æž¡ãããŸããã
ä¹ãæã
äžè¬çã«ãC / C ++ãšåãã§ãã èšèªã«çµã¿èŸŒãŸããæ§æãã¯ãïŒããã¥ã¡ã³ãã§ã¯çµã¿èŸŒã¿é¢æ°ãšåŒã°ããŸãïŒã«ãã£ãŠå®è£ ãããããã£ãŒã«ãã®æ°ãšãã®ååãªã©ãã¡ã¿æ å ±ã«ã¢ã¯ã»ã¹ãã䟿å©ãªçµã¿èŸŒã¿æ段ãããã€ããããŸãã
ãCãšã®ãã€ããªäºææ§ãã®ããã«ãããã€ãã®externåæãæäŸãããŠããŸãã
åæã®åºç€ãšãªãåã瀺ãããã«ããã©ãŒã ã®æ§ç¯
packed enum(u8)
ããã§ãu8ã¯ããŒã¹ã¿ã€ãã§ãã
åæåã«ã¯ãæ§é ã«é¡äŒŒããã¡ãœãããå«ããããšãã§ããŸãïŒã€ãŸããåæåãåå空éãšããŠäœ¿çšããŸãïŒã
çµå
ç§ãç解ããŠããããã«ãZigã®åéåã¯ä»£æ°åã®åã§ãã ã©ã®ãŠããªã³ãã£ãŒã«ãããã¢ã¯ãã£ããã§ãããã決å®ããé ãã¿ã°ãã£ãŒã«ããå«ãŸããŠããŸãã å¥ã®ãã£ãŒã«ãã®ãã¢ã¯ãã£ãåãã¯ãé¢é£ä»ãå šäœã®å®å šãªåå²ãåœãŠã«ãã£ãŠå®è¡ãããŸãã ããã¥ã¡ã³ãã®äŸ
const assert = @import("std").debug.assert; const mem = @import("std").mem; const Payload = union { Int: i64, Float: f64, Bool: bool, }; test "simple union" { var payload = Payload {.Int = 1234}; // payload.Float = 12.34; // ! assert(payload.Int == 1234); // payload = Payload {.Float = 12.34}; assert(payload.Float == 12.34); }
ãŠããªã³ã¯ãã¿ã°ã®åæãæ瀺çã«äœ¿çšããããšãã§ããŸãã
// Unions can be given an enum tag type: const ComplexTypeTag = enum { Ok, NotOk }; const ComplexType = union(ComplexTypeTag) { Ok: u8, NotOk: void, };
åæäœãæ§é äœãªã©ã®å ±çšäœããã¡ãœããã«ç¬èªã®åå空éãæäŸã§ããŸãã
ãªãã·ã§ã³ã¿ã€ã
Zigã«ã¯ãªãã·ã§ã³ã®ãµããŒããçµã¿èŸŒãŸããŠããŸãã ã¿ã€ãåã®åã«çå笊ãè¿œå ãããŸãã
const normal_int: i32 = 1234; // normal integer const optional_int: ?i32 = 5678; // optional integer
èå³æ·±ãããšã«ãZigã¯ç§ãçã£ãå¯èœæ§ã«ã€ããŠ1ã€ã®ããšãå®è£ ããŠããŸããããããæ£ãããã©ããã¯ããããŸããã§ããã ãã€ã³ã¿ãŒã¯ãå€ã®æå¹æ§ã®å åãä¿åããè¿œå ã®é衚瀺ãã£ãŒã«ãïŒãã¿ã°ãïŒãè¿œå ããããšãªãããªãã·ã§ã³ãšäºææ§ããããŸãã nullã¯ç¡å¹ãªå€ãšããŠäœ¿çšãããŸãã ãããã£ãŠãZigã§ãã€ã³ã¿ã«ãã£ãŠè¡šãããåç §åã¯ãããªãã·ã§ã³ãã®ããã«è¿œå ã®ã¡ã¢ãªããå¿ èŠãšããŸããã åæã«ããã«å€ãéåžžã®ãã€ã³ã¿ãŒã«å²ãåœãŠãããšã¯çŠæ¢ãããŠããŸãã
ãšã©ãŒã®çš®é¡
ãããã¯ãªãã·ã§ã³ã®ã¿ã€ãã«äŒŒãŠããŸãããããŒã«ã¿ã°ïŒãæ¬åœã«ç¡å¹ãïŒã®ä»£ããã«ããšã©ãŒã³ãŒãã«å¯Ÿå¿ããåæèŠçŽ ã䜿çšãããŸãã æ§æã¯ãªãã·ã§ã³ã«äŒŒãŠããŸããçå笊ã®ä»£ããã«æå笊ãè¿œå ãããŸãã ãããã£ãŠããããã®åã¯ãããšãã°ãé¢æ°ããæ»ãããã«äœ¿çšã§ããŸããé¢æ°ã®æ£åžžãªæäœã®ãªããžã§ã¯ãçµæãè¿ããããã察å¿ããã³ãŒãã®ãšã©ãŒãè¿ãããŸãã ãšã©ãŒã¿ã€ãã¯ãZigèšèªã®ãšã©ãŒåŠçã·ã¹ãã ã®éèŠãªéšåã§ããã詳现ã¯ããšã©ãŒåŠçãã»ã¯ã·ã§ã³ã«ãããŸãã
ã¿ã€ãvoid
Zigã§ã¯voidåã®å€æ°ãšãããã䜿çšããæäœãå¯èœã§ã
var x: void = {}; var y: void = {}; x = y;
ãã®ãããªæäœã®ã³ãŒãã¯çæãããŸããã ãã®ã¿ã€ãã¯ãäž»ã«ã¡ã¿ããã°ã©ãã³ã°ã«åœ¹ç«ã¡ãŸãã
Cäºææ§ã®ããã«c_voidåããããŸãã
å¶åŸ¡æŒç®åãšæ©èœ
ãããã«ã¯ããããã¯ãã¹ã€ãããwhileãforãifãelseãbreakãcontinueãå«ãŸããŸãã ã³ãŒããã°ã«ãŒãåããããã«ãæšæºã®äžæ¬åŒ§ã䜿çšãããŸãã C / C ++ã®ããã«ããããã¯ã ããå€æ°ã®ã¹ã³ãŒããå¶éããããã«äœ¿çšãããŸãã ãããã¯ã¯åŒãšèŠãªãããšãã§ããŸãã èšèªã«ã¯gotoã¯ãããŸããããbreakããã³continueã¹ããŒãã¡ã³ãã§äœ¿çšã§ããã©ãã«ããããŸãã ããã©ã«ãã§ã¯ããããã®æŒç®åã¯ã«ãŒãã§åäœããŸããããããã¯ã«ã©ãã«ãããå Žåã¯ãããã䜿çšã§ããŸãã
var y: i32 = 123; const x = blk: { y += 1; break :blk y; // blk y };
switchã¹ããŒãã¡ã³ãã¯ãããã©ãŒã«ã¹ã«ãŒãããªããšããç¹ã§æŒç®åãšç°ãªããŸããã€ãŸãã 1ã€ã®æ¡ä»¶ïŒã±ãŒã¹ïŒã®ã¿ãæºããããã¹ã€ãããçµäºããŸãã æ§æã¯ããã³ã³ãã¯ãã§ããç¢å°ã®ã=>ãã倧æåå°æåã®ä»£ããã«äœ¿çšãããŸãã ã¹ã€ãããåŒãšèŠãªãããšãã§ããŸãã
whileã¹ããŒãã¡ã³ããšifã¹ããŒãã¡ã³ãã¯ãäžè¬çã«ãã¹ãŠã®Cèšèªã«äŒŒãŠããŸãã forã¹ããŒãã¡ã³ãã¯foreachã«äŒŒãŠããŸãã ãããã¯ãã¹ãŠåŒãšèŠãªãããšãã§ããŸãã æ°æ©èœã®ãã¡ãwhileãšforãããã³ifã«ã¯ãã«ãŒãã®å埩ããªãã£ãå Žåã«å®è¡ããelseãããã¯ãå«ããããšãã§ããŸãã
ããã§ãã¹ã€ããã®äžè¬çãªæ©èœã«ã€ããŠèª¬æããŸããããã¯ãforeachã«ãŒãã®æŠå¿µããäœããã®åœ¢ã§åçšãããŠããŸã-å€æ°ã®ããã£ããã£ãã§ãã 次ã®ããã«ãªããŸãã
while (eventuallyNullSequence()) |value| { sum1 += value; } if (opt_arg) |value| { assert(value == 0); } for (items[0..1]) |value| { sum += value; }
ããã§ãwhileåŒæ°ã¯ããŒã¿ã®ç¹å®ã®ããœãŒã¹ãã§ãããé åãŸãã¯ã¹ã©ã€ã¹ã®å Žåã¯ãªãã·ã§ã³ã§ããã2ã€ã®åçŽç·ã®éã«ããå€æ°ã«ã¯ãæ¡åŒµãå€ãå«ãŸããŸãã é åãŸãã¯ã¹ã©ã€ã¹ã®çŸåšã®èŠçŽ ïŒãŸãã¯ãã®ãã€ã³ã¿ãŒïŒããªãã·ã§ã³ã®åã®å éšå€ïŒãŸãã¯ãã®ãã€ã³ã¿ãŒïŒã
é 延ã¹ããŒãã¡ã³ããšerrdeferã¹ããŒãã¡ã³ã
Goããåçšããé 延å®è¡ã¹ããŒãã¡ã³ãã åãããã«æ©èœããŸã-ãã®æŒç®åã®åŒæ°ã¯ãæŒç®åã䜿çšãããŠããã¹ã³ãŒããé¢ãããšãã«å®è¡ãããŸãã ããã«ãerrdeferæŒç®åãæäŸãããŸããããã¯ãã¢ã¯ãã£ããªãšã©ãŒã³ãŒããæã€ãšã©ãŒã¿ã€ããé¢æ°ããè¿ãããå Žåã«ããªã¬ãŒãããŸãã ããã¯ãZigã®å ã®ãšã©ãŒåŠçã·ã¹ãã ã®äžéšã§ãã
å°éäžèœãªãªãã¬ãŒã¿ãŒ
å¥çŽããã°ã©ãã³ã°ã®èŠçŽ ã çµå¶è ããããªãç¶æ³äžã«ãã£ãŠããããªãå Žæã«çœ®ãããç¹å¥ãªããŒã¯ãŒãã ããã«å°çãããšãDebugã¢ãŒããšReleaseSafeã¢ãŒãã§ãããã¯ãçæãããReleaseFastã§ã¯ãªããã£ãã€ã¶ãŒããããã®ãã©ã³ããå®å šã«ã¹ããŒããŸãã
åž°ããªã
æè¡çã«ã¯ãåŒã§ä»ã®åãšäºææ§ã®ããåã§ãã ããã¯ããã®ã¿ã€ãã®ãªããžã§ã¯ããæ»ããªããšããäºå®ã«ããå¯èœã§ãã æŒç®åã¯Zigã®åŒã§ãããããè©äŸ¡ãããªãåŒã«ã¯ç¹å¥ãªåãå¿ èŠã§ãã ããã¯ãåŒã®å³åŽãå¶åŸ¡ãåãæ¶ããªãããã«å€éšã®ã©ããã«ç§»ãããšãã«èµ·ãããŸãã ãã®ãããªã¹ããŒãã¡ã³ãã«å¯ŸããŠãå¶åŸ¡ã決ããŠæ»ããªããã¬ãŒã¯ãç¶ç¶ããªã¿ãŒã³ãå°éäžèœãç¡éã«ãŒãããã³æ©èœã æ¯èŒã®ããã«ãéåžžã®é¢æ°ïŒã³ã³ãããŒã«ãè¿ãïŒãžã®åŒã³åºãã¯ãæ»ãã³ã³ãããŒã«ã§ã¯ãããŸãããã³ã³ãããŒã«ã¯å€éšã«è»¢éãããŸãããé ããæ©ããåŒã³åºããã€ã³ãã«æ»ãããããã§ãã
ãããã£ãŠã次ã®åŒãå¯èœã«ãªããŸãã
fn foo(condition: bool, b: u32) void { const a = if (condition) b else return; @panic("do something with a"); }
å€æ°aã¯ãif / elseã¹ããŒãã¡ã³ãã«ãã£ãŠè¿ãããå€ãååŸããŸãã ãã®ãããããŒãïŒifãšelseã®äž¡æ¹ïŒã¯åãåã®åŒãè¿ãå¿ èŠããããŸãã iféšåã¯boolãè¿ããelseéšåã¯noreturnåã§ãããæè¡çã«ã¯ã©ã®åãšãäºææ§ããããããã³ãŒãã¯ãšã©ãŒãªãã§ã³ã³ãã€ã«ãããŸãã
æ©èœ
ãã®ã¿ã€ãã®èšèªã®æ§æã¯å€å žçã§ãïŒ
fn add(a: i8, b: i8) i8 { return a + b; }
äžè¬çã«ãé¢æ°ã¯ããªãæšæºã«èŠããŸãã ãããŸã§ã®ãšãããç§ã¯äžæµã®æ©èœã®å åã«æ°ã¥ããŠããŸããã§ããããèšèªãšã®ç§ã®ç¥ãåãã¯éåžžã«è¡šé¢çãªãã®ã§ãããééã£ãŠããå¯èœæ§ããããŸãã ããããããã¯ãŸã è¡ãããŠããŸãããã
ãã1ã€ã®èå³æ·±ãæ©èœã¯ãZigã§ã¯ãã¢ã³ããŒã¹ã³ã¢_ã䜿çšããŠã®ã¿ãæ»ãå€ãæ瀺çã«ç¡èŠã§ããããšã§ãã
_ = foo();
é¢æ°ã«é¢ããããŸããŸãªæ å ±ãååŸã§ããããã«ãããªãã¬ã¯ã·ã§ã³ããããŸã
const assert = @import("std").debug.assert; test "fn reflection" { assert(@typeOf(assert).ReturnType == void); // assert(@typeOf(assert).is_var_args == false); // }
ã³ã³ãã€ã«æã®ã³ãŒãå®è¡
Zigã¯ãã³ã³ãã€ã«æã«zigã§èšè¿°ãããã³ãŒãã®å®è¡ãšãã匷åãªæ©èœãæäŸããŸãã ã³ã³ãã€ã«æã«ã³ãŒããå®è¡ããã«ã¯ãcomptimeããŒã¯ãŒãã䜿çšããŠã³ãŒãããããã¯ã«ã©ããããã ãã§ãã ã³ã³ãã€ã«æãšå®è¡æã®äž¡æ¹ã§åãé¢æ°ãåŒã³åºãããšãã§ããããããŠãããŒãµã«ã³ãŒããäœæã§ããŸãã ãã¡ãããã³ãŒãã®ããŸããŸãªã³ã³ããã¹ãã«é¢é£ããããã€ãã®å¶éããããŸãã ããšãã°ãå€ãã®äŸã®ããã¥ã¡ã³ãã§ã¯ãcomptimeã䜿çšããŠã³ã³ãã€ã«æéã確èªããŠããŸãã
// array literal const message = []u8{ 'h', 'e', 'l', 'l', 'o' }; // get the size of an array comptime { assert(message.len == 5); }
ãããããã¡ããããã®æŒç®åã®åã¯ããã§å®å šã«é瀺ãããã«ã¯ã»ã©é ãã§ãã ãããã£ãŠãèšèªã®èª¬æã§ã¯ãæ§æãã¯ãã®å¹æçãªäœ¿çšã®å€å žçãªäŸã瀺ãããŠããŸã-printfã«äŒŒãé¢æ°ã®å®è£ ã§ããããã©ãŒãããæååã解æããã³ã³ãã€ã«æ®µéã§å¿ èŠãªãã¹ãŠã®åŒæ°ã®åãã§ãã¯ãå®è¡ããŸãã
ãŸããcomptimeãšããèªã¯ãã³ã³ãã€ã«æé¢æ°ã®ãã©ã¡ãŒã¿ãŒã瀺ãããã«äœ¿çšãããŸããããã¯ãC ++ãã³ãã¬ãŒãé¢æ°ã«äŒŒãŠããŸãã
fn max(comptime T: type, a: T, b: T) T { return if (a > b) a else b; }
ãšã©ãŒåŠç
Zigã¯ãä»ã®èšèªãšã¯ç°ãªãç¬èªã®ãšã©ãŒåŠçã·ã¹ãã ãçºæããŸããã ããã¯ãæ瀺çãªäŸå€ããšåŒã°ããŸãïŒãã®èšèªã§ã¯ãæ瀺æ§ã¯äžè¬çã«ã€ãã£ãªã ã®1ã€ã§ãïŒã Goã®ãªã¿ãŒã³ã³ãŒãã®ããã«ãèŠããŸãããåäœãç°ãªããŸãã
Zigãšã©ãŒåŠçã·ã¹ãã ã¯ãã«ã¹ã¿ã ãšã©ãŒã³ãŒãïŒãšã©ãŒïŒãå®è£ ããããã®ç¹å¥ãªåæã«åºã¥ããŠãããããšã©ãŒã¿ã€ããïŒä»£æ°ã¿ã€ãåèšãè¿ãããé¢æ°ã¿ã€ããšãšã©ãŒã³ãŒãã®çµã¿åããïŒã«åºã¥ããŠæ§ç¯ãããŸãã
ãšã©ãŒåæã¯ãéåžžã®åæãšåãæ¹æ³ã§å®£èšãããŸãã
const FileOpenError = error { AccessDenied, OutOfMemory, FileNotFound, }; const AllocationError = error { OutOfMemory, };
ãã ãããã¹ãŠã®ãšã©ãŒã³ãŒãã¯ãŒããã倧ããå€ãåãåããŸãã ãŸãã2ã€ã®åæã§åãååã®ã³ãŒãã宣èšãããšãåãå€ãåãåããŸãã ãã ãããšã©ãŒã®ç°ãªãåæéã®æé»çãªå€æã¯çŠæ¢ãããŠããŸãã
anyerrorããŒã¯ãŒãã¯ããã¹ãŠã®ãšã©ãŒã³ãŒããå«ãåæãæå³ããŸãã
ãªãã·ã§ã³åãšåæ§ã«ããã®èšèªã¯ç¹å¥ãªæ§æã䜿çšãããšã©ãŒåã®çæããµããŒãããŠããŸãã TypeïŒU64ã¯anyerrorã®çç¥åœ¢ã§ãïŒU64ã¯ããŠããªã³ïŒãªãã·ã§ã³ïŒãæå³ããããã«ã¯ã¿ã€ãu64ãšã¿ã€ãanyerrorãå«ãŸããŸãïŒç解ããŠããããã«ãã³ãŒã0ã¯ãšã©ãŒã®ãªãããšãšããŒã¿ãã£ãŒã«ãã®æå¹æ§ã瀺ãããã«äºçŽãããŠãããæ®ãã®ã³ãŒãã¯å®éã«ãšã©ãŒã³ãŒãïŒã
catchããŒã¯ãŒãã䜿çšãããšããšã©ãŒããã£ããããŠããã©ã«ãå€ã«å€æã§ããŸãã
const number = parseU64(str, 10) catch 13;
ãã®ãããïŒU64åãè¿ãparseU64é¢æ°ã§ãšã©ãŒãçºçããå Žåãcatchã¯ããããã€ã³ã¿ãŒã»ãããããããã©ã«ãå€ã®13ãè¿ããŸãã
tryããŒã¯ãŒãã䜿çšãããšããšã©ãŒãäžäœã¬ãã«ïŒã€ãŸããåŒã³åºãé¢æ°ã®ã¬ãã«ïŒã«ã転éãã§ããŸãã ã³ãŒãã衚瀺
fn doAThing(str: []u8) !void { const number = try parseU64(str, 10); // ... }
ãããšåçïŒ
fn doAThing(str: []u8) !void { const number = parseU64(str, 10) catch |err| return err; // ... }
ãšã©ãŒãè¿ãããå ŽåãparseU64ãåŒã³åºãããŸã-catchã¹ããŒãã¡ã³ãã«ãã£ãŠã€ã³ã¿ãŒã»ããããããšã©ãŒã³ãŒãã¯ããã£ããã£ãæ§æã䜿çšããŠæœåºãããerrå€æ°ã«é 眮ãããŸãã
åè¿°ã®ErrdeferæŒç®åã¯ããšã©ãŒåŠçãæããŸãã errdeferåŒæ°ã§ããã³ãŒãã¯ãé¢æ°ããšã©ãŒãè¿ãå Žåã«ã®ã¿å®è¡ãããŸãã
ããã«ããã€ãã®å¯èœæ§ã ||ã䜿çšãã ãšã©ãŒã»ãããããŒãžã§ããŸã
const A = error{ NotDir, PathNotFound, }; const B = error{ OutOfMemory, PathNotFound, }; const C = A || B;
Zigã¯ããšã©ãŒãã¬ãŒã¹ãªã©ã®æ©èœãæäŸããŸãã ããã¯ãã¹ã¿ãã¯ãã¬ãŒã¹ã«äŒŒãŠããŸãããçºçãããšã©ãŒãšãçºçå Žæããããã°ã©ã ã®ã¡ã€ã³é¢æ°ãžã®ãã©ã€ãã§ãŒã³ã«æ²¿ã£ãäŒæã«é¢ãã詳现æ å ±ãå«ãŸããŠããŸãã
ãããã£ãŠãZigã®ãšã©ãŒåŠçã·ã¹ãã ã¯éåžžã«ç¬åµçãªãœãªã¥ãŒã·ã§ã³ã§ãããC ++ã®äŸå€ãGoã®ãªã¿ãŒã³ã³ãŒããšã¯ç°ãªããŸãããã®ãããªãœãªã¥ãŒã·ã§ã³ã«ã¯äžå®ã®äŸ¡æ ŒããããšèšããŸã-è¿œå ã®4ãã€ãã¯ãåæ»ãå€ãšãšãã«è¿ãããå¿ èŠããããŸããæãããªå©ç¹ã¯ã絶察çãªå¯èŠæ§ãšéææ§ã§ããC ++ãšã¯ç°ãªããããã§ã¯é¢æ°ã¯åŒã³åºããã§ãŒã³ã®æ·±ãã®ã©ããããæªç¥ã®äŸå€ãã¹ããŒã§ããŸãããé¢æ°ãè¿ããã¹ãŠ-æ瀺çã«ã®ã¿æ瀺çã«è¿ããŸãã
ã³ã«ãŒãã³
Zigã«ã¯ã³ã«ãŒãã³ãçµã¿èŸŒãŸããŠããŸãããããã¯asyncããŒã¯ãŒãã䜿çšããŠäœæãããé¢æ°ã§ããããã®å©ããåããŠãã¢ãã±ãŒã¿ãŒãšãã¢ãã±ãŒã¿ãŒã®æ©èœã転éãããŸãïŒè¿œå ã®ã¹ã¿ãã¯ã«ã€ããŠïŒã
test "create a coroutine and cancel it" { const p = try async<std.debug.global_allocator> simpleAsyncFn(); comptime assert(@typeOf(p) == promise->void); cancel p; assert(x == 2); } async<*std.mem.Allocator> fn simpleAsyncFn() void { x += 1; }
asyncã¯ãpromise-> Tåã®ç¹å¥ãªãªããžã§ã¯ããè¿ããŸãïŒTã¯é¢æ°ã®æ»ãåã§ãïŒããã®ãªããžã§ã¯ãã䜿çšããŠãã³ã«ãŒãã³ãå¶åŸ¡ã§ããŸãã
æäžäœã¬ãã«ã«ã¯ãããŒã¯ãŒãsuspendãresumeãããã³cancelãå«ãŸããŸãããµã¹ãã³ãã䜿çšãããšãã³ã«ãŒãã³ã®å®è¡ãäžæåæ¢ãããåŒã³åºãå ããã°ã©ã ã«æž¡ãããŸããäžæãããã¯ã®æ§æãå¯èœã§ããã³ã«ãŒãã³ãå®éã«äžæããããŸã§ããããã¯å ã®ãã¹ãŠãå®è¡ãããŸãã
resumeã¯ãpromise-> Tåã®åŒæ°ãåããäžæãããå Žæããã³ã«ãŒãã³ã®å®è¡ãåéããŸãã
cancelã¯ã³ã«ãŒãã³ã¡ã¢ãªã解æŸããŸãã
ãã®å³ã¯ãã¡ã€ã³ããã°ã©ã ïŒãã¹ããšããŠïŒãšã³ã«ãŒãã³éã®å¶åŸ¡ã®ç§»åã瀺ããŠããŸãããã¹ãŠãéåžžã«ç°¡åã§ãïŒ
2çªç®ïŒããé«ãã¬ãã«ïŒã®æ©èœã¯ãawaitã®äœ¿çšã§ããããã¯ãççŽã«èšã£ãŠãç§ãç解ããŠããªãå¯äžã®ãã®ã§ãïŒãŸããããã¥ã¡ã³ãã¯ãŸã éåžžã«äžè¶³ããŠããŸãïŒã以äžã¯ãããã¥ã¡ã³ãããå°ãå€æŽãããäŸã®å®éã®ã³ã³ãããŒã«è»¢éå³ã§ããããããããã¯äœãã説æããã§ãããã
çµã¿èŸŒã¿é¢æ°
çµã¿èŸŒã¿é¢æ°-èšèªã«çµã¿èŸŒãŸããã¢ãžã¥ãŒã«ã®æ¥ç¶ãå¿ èŠãšããªãããªã倧ããªé¢æ°ã®ã»ãããå€ãã®æ©èœã¯æ©èœãã¯ããã«è¶ ããŠããããããããã®äžéšããçµã¿èŸŒã¿ã®æ§æãã¯ãããšåŒã¶æ¹ãæ£ããã§ãããããã«ãã€ã³ã¯ããªãã¬ã¯ã·ã§ã³ããŒã«ïŒsizeOfãtagNameãTagTypeãtypeInfoãtypeNameãtypeOfïŒãžã®ã¢ã¯ã»ã¹ãæäŸãããããã®ãã«ãã¢ãžã¥ãŒã«ïŒã€ã³ããŒãïŒãæ¥ç¶ãããŠããŸãããã®ä»ã¯ãåŸæ¥ã®çµã¿èŸŒã¿C / C ++ã«äŒŒãŠããŸã-äœã¬ãã«ã®åå€æãsqrtãpopCountãslhExactãªã©ã®ããŸããŸãªæäœãå®è£ ããŸããèšèªãçºå±ããã«ã€ããŠãçµã¿èŸŒã¿é¢æ°ã®ãªã¹ããå€ããå¯èœæ§ãéåžžã«é«ããªããŸãã
çµè«ãšããŠ
ãã®ãããªãããžã§ã¯ããçŸããŠçºå±ããã®ã¯ãšãŠã楜ããããšã§ããCèšèªã¯äŸ¿å©ã§ç°¡æœã§å€ãã®äººã«éŠŽæã¿ããããŸãããCèšèªã¯ãŸã æ代é ãã§ãããã¢ãŒããã¯ãã£äžã®çç±ããå€ãã®ææ°ã®ããã°ã©ãã³ã°æŠå¿µããµããŒãã§ããŸãããC ++ã¯éçºäžã§ããã客芳çã«åèšèšãããæ°ããããŒãžã§ã³ããšã«ãŸããŸãé£ãããªã£ãŠããŸããåãã¢ãŒããã¯ãã£äžã®çç±ã§ãäžäœäºææ§ãå¿ èŠãªãããäœãã§ããŸãããRustã¯èå³æ·±ãã§ããããšã³ããªã®ãããå€ãéåžžã«é«ããããåžžã«æ£åœåããããšã¯éããŸãããDã¯è¯ãè©Šã¿ã§ãããå°ããªæ¬ é¥ãããªããããŸããæåã¯èšèªãJavaã®åœ±é¿äžã§äœæãããå¯èœæ§ãé«ãããã®åŸã®æ©èœã¯ã©ããããããããã§ãªãããã«å°å ¥ãããããã§ããæããã«ãZigã¯ãã®ãããªè©Šã¿ã®1ã€ã§ããèšèªã¯é¢çœãã§ãããããŠããããäœããåºãŠããããèŠãã®ã¯é¢çœãã§ãã