Zig (プログラミング言語)

Zigは、アンドリュー・ケリーによって設計された命令型の汎用の静的型付けのコンパイル型システムプログラミング言語である。 この言語は「堅牢性、最適性及び保守性」向けに設計されており、コンパイル時のジェネリクス、リフレクション、クロスコンパイル及び手動メモリ管理（英語版）をサポートしている。 この言語の主な目標は、C言語に依存せずにこれを改善し、Rustなどから着想を得ることである。 Zigにはパックされた構造体、多倍長整数、複数のポインタ型などの低レベルプログラミングのための多くの機能がある。 リファレンス実装のコンパイラはZig及びC++で記述されており、LLVMをバックエンドとして使用し、LLVMがサポートするターゲットの多くをサポートしている。 コンパイラはフリーかつオープンソースで、MITライセンスの条件に基づいて配布されている。 Zigのコンパイラはzig cc及びzig c++をそれぞれ使用することによって、Clangと同様にC言語及びC++をコンパイルすることができる。 Nimプログラミング言語はC言語のコンパイラとしてzig ccを使用することをサポートしている。 // zig version 0.9.1 const std = @import("std"); pub fn main() !void { const stdout = std.io.getStdOut().writer(); try stdout.print("Hello, {s}!\n", .{"world"}); } // ジェネリックなLinkedList型 const std = @import("std"); const stdout = std.io.getStdOut().writer(); fn LinkedList(comptime T: type) type { return struct { const Self = @This(); pub const Node = struct { next: ?*Node = null, data: T, }; first: ?*Node = null, pub fn prepend(list: *Self, new_node: *Node) void { new_node.next = list.first; list.first = new_node; } pub fn format( list: Self, comptime fmt: []const u8, options: std.fmt.FormatOptions, out_stream: anytype, ) !void { try out_stream.writeAll("( "); var it = list.first; while (it) |node| : (it = node.next) { try std.fmt.formatType(node.data, fmt, options, out_stream, 1); try out_stream.writeAll(" "); } try out_stream.writeAll(" )"); } }; } pub fn main() !void { const ListU32 = LinkedList(u32); var list = ListU32{}; var node1 = ListU32.Node{ .data = 1 }; var node2 = ListU32.Node{ .data = 2 }; var node3 = ListU32.Node{ .data = 3 }; list.prepend(&node1); list.prepend(&node2); list.prepend(&node3); try stdout.print("{}\n", .{list}); try stdout.print("{b}\n", .{list}); } 実行結果 ( 3 2 1 ) ( 11 10 1 ) このコードは、Zig言語を使用して単方向連結リスト（LinkedList）を定義し、それを使用して整数の単方向連結リストを作成し、標準出力に出力するプログラムである。 最初の2行では、stdパッケージからioモジュールをインポートし、標準出力ストリームを取得する。 次に、LinkedList関数が定義されている。この関数は、ジェネリックなLinkedList型を作成する。型Tを取り、LinkedList型を返す。このLinkedList型は、Nodeという構造体を含み、それぞれがデータを保持する。また、LinkedList型自体もprependとformatというメソッドを持つ。prependメソッドは、リストの先頭にノードを追加する。formatメソッドは、リストの内容を指定された書式でフォーマットして出力する。 main関数では、LinkedList関数を使用してListU32という型を作成し、整数のLinkedListを作成する。その後、3つのノードを作成し、prependメソッドを使用してリストに追加する。最後に、標準出力にリストを出力する。 ^ フィールド間のパディングがゼロの構造体のこと。 ^ 出典URL: https://ziglang.org/download/#release-0.13.0, 題名: Release 0.13.0 ^ Motroc, Gabriela (2017年10月31日). ““Zig has all the elegant simplicity of C, minus all the ways to shoot yourself in the foot””. JAXenter. 2021年1月1日閲覧。 ^ Elizabeth, Jane (2017年10月19日). “Tired of C? New programming language Zig aims to be more pragmatic and readable”. JAXenter. 2021年1月1日閲覧。 ^ Yegulalp, Serdar (2016年8月29日). “New challenger joins Rust to topple C language”. InfoWorld. 2021年1月1日閲覧。 ^ IT之家 (2020年7月12日). “想替代 C 的 Zig 语言成立了基金会” (中国語). 新浪数码. 2021年1月1日閲覧。 ^ “The Zig Programming Language”. ziglang.org. 2021年1月1日閲覧。 ^ “Mozilla’s Observatory, the Zig programming language, and uSens’ VR/AR SDK—SD Times news digest: Aug. 29, 2016”. SD Times (2016年8月29日). 2021年1月1日閲覧。 ^ “Zig competes with C instead of depending on it”. ziglang.org. 2021年1月1日閲覧。 ^ Kelley, Andrew (2018年1月24日). “Unsafe Zig is Safer than Unsafe Rust”. andrewkelley.me. 2021年1月1日閲覧。 ^ Anderson, Tim (2020年4月24日). “Keen to go _ExtInt? LLVM Clang compiler adds support for custom width integers”. The Register. 2021年1月1日閲覧。 ^ “Documentation - The Zig Programming Language”. ziglang.org. 2021年1月1日閲覧。 ^ Lewkowicz, Jakub (2020年4月14日). “SD Times news digest: C++20 concepts in Visual Studio 2010 version 16.3, Bootstrap to drop IE support, and Zig 0.60 released”. SD Times. 2021年1月1日閲覧。 ^ Bill, Ginger (2019年5月13日). “A Reply to The Road to Zig 1.0”. gingerBill. 2021年1月1日閲覧。 ^ a b “ziglang/zig”. GitHub. 2021年1月1日閲覧。 ^ “Tier System”. ziglang.org. 2021年1月1日閲覧。 ^ “zig cc”. ziglang.org (2020年4月13日). 2021年1月1日閲覧。 ^ “Add support for `zig cc` as C compiler. #13757”. GitHub. 2021年1月1日閲覧。 関連ポータルのリンク ウィキポータル コンピュータ ウィキポータル FLOSS C言語 C++ Nim Rust D言語 公式ウェブサイト（英語） zig - GitHub（英語） Zig: A programming language designed for robustness, optimality, and clarity – Andrew Kelley - YouTube（英語） The Road to Zig 1.0 - Andrew Kelley - YouTube（英語）