Zigは、アンドリュー・ケリーによって設計された、命令型の汎用
静的型付けコンパイル言語です。この言語は、堅牢性、最適性、および保守性を重視して設計されており、
C言語の代替となることを目指しています。Rustなどの他の言語からインスピレーションを得ていますが、独自の設計哲学を持っています。
主な特徴
コンパイル時機能: ジェネリクスやリフレクションなどの強力な
コンパイル時機能を提供し、柔軟なコード生成を可能にします。
手動メモリ管理: メモリ管理を開発者が直接制御できるため、パフォーマンスが重要な場面で優位性があります。
低レベルプログラミング: パックされた構造体、多倍長整数、複数のポインタ型など、低レベルプログラミングに必要な機能が充実しています。
クロスコンパイル: 異なるアーキテクチャやプラットフォームへのクロスコンパイルをサポートしており、様々な環境で動作するプログラムの開発が容易です。
C言語との親和性:
C言語との相互運用性を重視しており、
C言語のコードをZigのプログラムから利用したり、Zigのコードを
C言語のプログラムから利用したりすることが容易です。また、Zig
コンパイラは、
Clangと同様にCおよび
C++のコンパイルをサポートしています。
リファレンス実装の
コンパイラは、Zigと
C++で記述されており、
LLVMをバックエンドとして使用しています。これにより、
LLVMがサポートする多くのターゲットに対応しています。
コンパイラはフリーかつオープンソースで、MIT
ライセンスの下で配布されています。
コード例
以下は、Zig言語を使用した簡単なコード例です。
Hello world
zig
const std = @import("std");
pub fn main() void {
std.debug.print("Hello, world!
", .{});
}
このコードは、標準出力に「Hello, world!」と出力します。
ジェネリック連結リスト
zig
const std = @import("std");
fn LinkedList(comptime T: type) type {
return struct {
const Node = struct {
data: T,
next: ?Node,
};
var head: ?Node = null;
fn prepend(self: This, data: T) void {
var node = std.mem.alloc(std.heap.page_allocator, Node) catch |err| {
std.debug.print("error allocating memory: {}
", .{err});
return;
};
node.data = data;
node.next = self.head;
self.head = node;
}
fn format(self: This, comptime fmt: []const u8, options: std.fmt.FormatOptions, writer: anytype) !void {
try writer.print("[", .{});
var current = self.head;
while (current) |node| {
try std.fmt.format(node.data, fmt, options, writer);
if (node.next) |next| {
try writer.print(", ", .{});
}
current = node.next;
}
try writer.print("]", .{});
}
};
}
pub fn main() void {
var list = LinkedList(u32){};
list.prepend(1);
list.prepend(2);
list.prepend(3);
std.debug.print("{}
", .{list});
}
このコードは、ジェネリックな連結リストを定義し、整数の連結リストを作成して出力します。`LinkedList`関数は、ジェネリック型`T`を取り、リストのノード構造体と`prepend`メソッド、`format`メソッドを含む構造体を返します。`prepend`メソッドはリストの先頭にノードを追加し、`format`メソッドはリストの内容をフォーマットして出力します。`main`関数では、`LinkedList`関数を使用して整数のリストを作成し、3つのノードを追加して出力しています。
他の言語との関係
Zigは、
C言語の代替となることを目指しており、
C言語の課題を解決しようとする試みです。また、Rustなどの言語からインスピレーションを得ていますが、メモリ管理の柔軟性や
コンパイル時の機能など、独自の設計哲学を持っています。
Nimプログラミング言語は、C
コンパイラとして`zig cc`を使用することをサポートしています。
関連情報
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 (英語)