Zig 基本構文

Zig は新しいプログラミング言語で、シンプルで効率的な設計であり、C 言語と直接互換性があります。

以下は Zig の基本構文の紹介です。すぐに使い始めるのに役立ちます。

Zig コードファイルの拡張子は.zig。


最初の Zig プログラム

まず Zig の "Hello, World!" プログラムを見てみましょう。

まず zig プロジェクトを初期化しましょう:

mkdir hello-world
cd hello-world
zig init

次に、そのプロジェクトの下に hello.zig ファイルを作成します。コードは以下の通りです:

例(hello.zig ファイル)

const std = @import("std");

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 の識別子に関する規則と特性です:

  1. 英字と数字:識別子は、文字(A-Z および a-z)、数字(0-9)、アンダースコア(_)を含めることができます。

  2. 开头字符:識別子は文字またはアンダースコアで始まる必要があり、数字で始めることはできません。

  3. 大小写敏感:Zig は大文字と小文字を区別する言語です。つまり、Variableとvariableは2つの異なる識別子です。

  4. キーワードと予約語:特定の単語は Zig では予約されており、識別子として使用できません。例えばfn(函数)、struct(構造体)、if(条件文)など。

  5. 命名约定:Zig 公式は以下の規約を推奨しています:

    • camelCase(ローワーキャメルケース):変数名と関数名に使われます。例えばmyVariable、calculateSum。
    • PascalCase(アッパーキャメルケース):型名と名前空間に使われます。例えばPoint、ArrayList。
    • SCREAMING_SNAKE_CASE:コンパイル時に既知の定数(comptime 定数)に使用されます。例えばMAX_SIZE。
  6. 可选类型:Zig 言語には特別な型があります?T、型が...であることを示しますTのオプション値です。これは、空の可能性がある値を扱う際に非常に便利です。

  7. 编译时常量:識別子の前に使用comptimeキーワードは、その識別子がコンパイル時定数であることを示すことができます。

  8. 错误类型:使用errorキーワードはエラー型を定義できます。例えば:

    pub fn openFile(path: []const u8) !void {
        // ...
    }
  9. 类型后缀:型名の後に使用_t接尾辞は C 言語の慣習であり、Zig でも同様に行うことができますが、必須ではありません。

保留关键词

以下は、Zig 言語の予約キーワードの一部です:

KeywordsDescription
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 文の実行を継続します。
其他扩展