Zig (プログラミング言語)
プログラミング言語
From Wikipedia, the free encyclopedia
Zigは、アンドリュー・ケリーによって設計された命令型の汎用の静的型付けのコンパイル型システムプログラミング言語である[2][3]。 この言語は「堅牢性、最適性及び保守性」向けに設計されており[4][5]、コンパイル時のジェネリクス、リフレクション、クロスコンパイル及び手動メモリ管理をサポートしている[6]。 この言語の主な目標は、C言語に依存せずにこれを改善し[7][8]、Rustなどから着想を得ることである[9]。
Zigにはパックされた構造体[注釈 1]、多倍長整数[10]、複数のポインタ型などの低レベルプログラミングのための多くの機能がある[11]。
リファレンス実装のコンパイラはZig及びC++で記述されており、LLVM[12]をバックエンドとして使用し[13][14]、LLVMがサポートするターゲットの多くをサポートしている[15]。
コンパイラはフリーかつオープンソースで、MITライセンスの条件に基づいて配布されている[14]。
Zigのコンパイラはzig cc及びzig c++をそれぞれ使用することによって、Clangと同様にC言語及びC++をコンパイルすることができる[16]。
Nimプログラミング言語はC言語のコンパイラとしてzig ccを使用することをサポートしている[17]。
コード例
Hello world
// 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メソッドを使用してリストに追加する。最後に、標準出力にリストを出力する。