Zig 基本構文
Zig は新しいプログラミング言語で、シンプルで効率的な設計であり、C 言語と直接互換性があります。
以下は Zig の基本構文の紹介です。すぐに使い始めるのに役立ちます。
Zig コードファイルの拡張子は.zig。
最初の Zig プログラム
まず Zig の "Hello, World!" プログラムを見てみましょう。
まず zig プロジェクトを初期化しましょう:
mkdir hello-world cd hello-world zig init
次に、そのプロジェクトの下に hello.zig ファイルを作成します。コードは以下の通りです:
例(hello.zig ファイル)
pub fn main() !void {
const stdout = std.io.getStdOut().writer();
try stdout.print("Hello, World!\n", .{});
}
代码解析:
1、標準ライブラリをインポート:
const std = @import("std");
このコード行は Zig の標準ライブラリをインポートします。C 言語の
...に似ています。#include <stdio.h>。
2、main 関数を定義:
pub fn main() !void
pubキーワードはこの関数が公開されていることを示し、fnキーワードは関数を定義するために使われ、mainは関数のエントリーポイントです。戻り値の型!voidこの関数は値を返さないが、エラーを返す可能性があることを示します(!プレフィックスはエラーユニオン型を表します)。
3、標準出力を取得:
const stdout = std.io.getStdOut().writer();
標準ライブラリを通じて標準出力の writer を取得し、その後そのメソッドを呼び出して内容を書き込みます。
4、打印 "Hello, World!":
try stdout.print("Hello, World!\n", .{});
printメソッドはフォーマットされた文字列を標準出力に書き込みます。.{}空の引数リストです。tryキーワードは、エラーが発生した際にエラーを呼び出し元へ伝播させます。
このプログラムは、関数定義、標準ライブラリの使用、エラー処理など、Zig 言語のいくつかの基本的な特性を示しています。
単一のファイルだけを実行する場合は、直接次を使用できます:
zig run hello.zig
実行可能ファイルにコンパイルしたい場合は、次を使用します:
zig build-exe hello.zig
コンパイル後にターミナルで実行:
./hello
これは出力されます:
Hello, World!
标识符
Zig 言語では、識別子は変数、関数、型などに名前を付けるために使用される名前です。
以下は、Zig の識別子に関する規則と特性です:
-
英字と数字:識別子は、文字(A-Z および a-z)、数字(0-9)、アンダースコア(_)を含めることができます。
-
开头字符:識別子は文字またはアンダースコアで始まる必要があり、数字で始めることはできません。
-
大小写敏感:Zig は大文字と小文字を区別する言語です。つまり、
Variableとvariableは2つの異なる識別子です。 -
キーワードと予約語:特定の単語は Zig では予約されており、識別子として使用できません。例えば
fn(函数)、struct(構造体)、if(条件文)など。 -
命名约定:Zig 公式は以下の規約を推奨しています:
- camelCase(ローワーキャメルケース):変数名と関数名に使われます。例えば
myVariable、calculateSum。 - PascalCase(アッパーキャメルケース):型名と名前空間に使われます。例えば
Point、ArrayList。 - SCREAMING_SNAKE_CASE:コンパイル時に既知の定数(comptime 定数)に使用されます。例えば
MAX_SIZE。
- camelCase(ローワーキャメルケース):変数名と関数名に使われます。例えば
-
可选类型:Zig 言語には特別な型があります
?T、型が...であることを示しますTのオプション値です。これは、空の可能性がある値を扱う際に非常に便利です。 -
编译时常量:識別子の前に使用
comptimeキーワードは、その識別子がコンパイル時定数であることを示すことができます。 -
错误类型:使用
errorキーワードはエラー型を定義できます。例えば:pub fn openFile(path: []const u8) !void { // ... } -
类型后缀:型名の後に使用
_t接尾辞は C 言語の慣習であり、Zig でも同様に行うことができますが、必須ではありません。
保留关键词
以下は、Zig 言語の予約キーワードの一部です:
| Keywords | Description |
|---|---|
align | 変数または型のアライメントバイト数を指定します |
allowzero | ポインタが null 値を指すことを許可 |
and | 論理 AND 演算 |
asm | 内联汇编块 |
break | 最も近いループまたはスコープから抜け出します |
callconv | 调用约定 |
const | 定义常量 |
continue | ループの次の反復に進む |
defer | スコープが終了するまでステートメントの実行を遅延します |
else | 条件文の否定分岐 |
enum | 枚举类型 |
errdefer | エラー発生時に遅延実行されるステートメント |
error | エラー型定義 |
export | シンボルをエクスポートし、C言語などから呼び出せるようにします |
fn | 函数定义 |
for | 遍历循环 |
if | 条件语句 |
inline | インライン関数またはインラインループ |
linksection | リンカのセクションを指定 |
noalias | ポインタは他のポインタによってエイリアスされてはならない |
noinline | 関数のインライン化を防ぐ |
null | オプション型の null 値 |
or | 逻辑或操作 |
packed | 構造体のパディングをなくし、ビット単位で密に配置します |
pub | 公開(public)アクセスレベル |
return | 関数から戻る |
struct | 構造体型の定義 |
switch | 多分岐選択文 |
test | 测试代码块 |
threadlocal | スレッドローカル変数 |
try | 式の実行を試み、エラー時は上位に伝播 |
union | 共用体型の定義 |
usingnamespace | 名前空間のすべての公開メンバーを現在のスコープに導入します |
var | 可変変数を定義 |
void | 型なし。関数に戻り値がない場合によく使われます |
while | 循环语句 |
基本语法
1. 変数と定数
Zig では、変数はvarキーワードで定義され、定数はconstキーワードで定義します。
const x: i32 = 10; // 定义一个整数常量 x,值为 10 var y: f64 = 3.14; // 定义一个浮点数变量 y,值为 3.14
2. 函数
函数使用fnキーワードで定義し、戻り値の型を指定します。
const std = @import("std");
fn add(a: i32, b: i32) i32 {
return a + b;
}
pub fn main() !void {
const result = add(3, 4);
const stdout = std.io.getStdOut().writer();
try stdout.print("Result: {}\n", .{result});
}
3. 条件文
使用ifとelse条件ロジックを実装します。
const std = @import("std");
pub fn main() !void {
const stdout = std.io.getStdOut().writer();
const number = 10;
if (number > 0) {
try stdout.print("Number is positive\n", .{});
} else {
try stdout.print("Number is not positive\n", .{});
}
}
4. 循环
Zig 支持whileとfor循环。
const std = @import("std");
pub fn main() !void {
const stdout = std.io.getStdOut().writer();
// while 循环,: (i += 1) 是每次迭代后执行的更新表达式
var i: i32 = 0;
while (i < 5) : (i += 1) {
try stdout.print("i: {}\n", .{i});
}
// for 循环,遍历数组
const array = [5]i32{ 1, 2, 3, 4, 5 };
for (array) |item| {
try stdout.print("item: {}\n", .{item});
}
}
5. 構造体
Zig 使用struct構造体を定義する。
const std = @import("std");
const Point = struct {
x: i32,
y: i32,
};
pub fn main() !void {
const stdout = std.io.getStdOut().writer();
const p = Point{ .x = 10, .y = 20 };
try stdout.print("Point: ({}, {})\n", .{ p.x, p.y });
}
6. エラーハンドリング
Zig はエラー列挙型とtry / catchキーワードを使用してエラー処理を行います。
const std = @import("std");
const FileError = error{
FileNotFound,
};
fn readFile(path: []const u8) !void {
// 模拟一个可能失败的操作
if (std.mem.eql(u8, path, "invalid")) {
return FileError.FileNotFound;
}
// 其他操作...
}
pub fn main() !void {
const stdout = std.io.getStdOut().writer();
readFile("invalid") catch |err| {
switch (err) {
FileError.FileNotFound => {
try stdout.print("Error: File not found\n", .{});
},
else => return err,
}
return;
};
try stdout.print("File read successfully\n", .{});
}
代码解析:
catch |err|:エラーをキャッチして変数にバインドしますerr。switch (err):エラー型をマッチングし、異なるエラー状況をそれぞれ処理します。else => return err:予期しないエラーを直接上位に伝播させ、静かに無視することはありません。- 如果
readFile実行が成功した場合(catch がトリガーされなかった場合)、後続の print 文の実行を継続します。