From Wikipedia (Ja) - Reading time: 4 min
この項目「Zig (プログラミング言語)」は翻訳されたばかりのものです。不自然あるいは曖昧な表現などが含まれる可能性があり、このままでは読みづらいかもしれません。(原文:英語版 "Zig (programming language)" 2020年12月27日 (日) 23:57 (UTC)) 修正、加筆に協力し、現在の表現をより自然な表現にして下さる方を求めています。ノートページや履歴も参照してください。(2021年1月) |
|
Zigのロゴ | |
| パラダイム | |
|---|---|
| 登場時期 | |
| 開発者 |
アンドリュー・ケリー |
| 最新リリース | 0.14.0 / 2025年3月5日[1] |
| 型付け | |
| 影響を受けた言語 |
C言語、C++、Go、Rust、JavaScript |
| プラットフォーム | クロスプラットフォーム |
| ライセンス |
MIT License |
| ウェブサイト | |
| 拡張子 |
zig |
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]。
// 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メソッドを使用してリストに追加する。最後に、標準出力にリストを出力する。