Ziglangに関する私の見解


Originally posted on
Zigは汎用プログラミング言語である.これは簡単ですし、任意の隠しコントロールの流れや割り当てをしていません.
言語は明確で、まっすぐに、読みやすい.

Zig directly competes with C and will be a better alternative for C in the future.


私がZiglangが好きであるもの:

簡易言語


簡単な言葉を作るのは言うより易しい.プログラマはプログラミング言語に豊富な機能を必要とするが、プログラミング言語がより多くの特徴をサポートするとき、それは低迷し、肥大化する.
例えば、Zigの簡単なHello Worldプログラムはこのようになります.
// hello.zig
const std = @import("std");

pub fn main() !void {
 const stdout = std.io.getStdOut().writer();
 try stdout.print("Hello!, {s}\n", .{"world"});
}
最初の行では、std 図書館(好奇心)@ 以前import チェックhere ). 我々は、インポートstd ライブラリとそれを割り当てるstd 使用const キーワード.
次に、main 関数.他の言語と同様に、メインはプログラム実行を始めるZIGコンパイラを指定します.関数定義はpub fn キーワード.推測したようにpub fn パブリック関数を意味します.

Note: The pub specifier exports the function.


関数名main . 関数名とargs(この場合は何も持っていません)の後、return 種類ここの返り値は!void . The ! 関数が返すことを指定しますerror . 我々は、拡張することができます!void 好きなもの<error-type> or <void> .
次に、我々はwriter インポートからの関数std 図書館.

Note: It is too long!!! But it clearly says what the programmer is trying to do and what the compiler will do.


最後に、私たちはprint からの方法からstdout 実際の文字列を出力するにはprint文は、C/Rustのような他の低レベル言語でどうするかに似ています.

Note: .{}. in the second argument to the print function. It is an anonymous struct literal. Zig compiler infers the type of anonymous struct literal.


それです.このZIGコードを使うことができますzig run hello.zig .
あなたが見ることができるように、関数はシンプルで理解しやすいです.言語はマクロを持たず、結果を魔法に印刷しません.
魔法はここに!

ヌルポインタ


Oh yeah! Everyone agrees Null Pointer is a billion-dollar mistake.


ジグにはないnull , しかし、彼らは提供するoptional . オプション型は安全性と読みやすさを提供します.
const optional_world_answer: ?i32 = 42;
The ? type 1 i型を指定するoptional . それは受け入れることができるnull またはi32 整数.null はZiglangで許されるタイプです.
我々は、安全にアクセスすることができますoptional 使用if-let 構文.
if (optional_world_answer) |world_answer| {
 // here `world_answer` is i32 and not null.
}

Optional makes your language verbose, the benefits of them in safety, readability stands out.


エラー処理


Zigはエラーも含んでいます.エラーを値として扱います.ZIGコンパイラはエラーが処理され、それらがないときに不平を保証します.
例えば、
fn get_i64() !i64 {
 return error.notImplemented;
}

pub fn main() void {
 // we are basically discarding the result
 _ = get_i64();
}
上記のコードはエラーを処理していないコンパイラエラーをスローし、エラーを破棄します.エラーは常に値です.我々はそれを使用して修正することができますcatch or try .
// error handling with `catch`
let number = get_i64() catch |err| {
 // do something with error
};

// error handling with `try`
let number = try get_i64();

// well when you are sure that it won't error
let number = try get_i64() catch unreachable
Zigはリフレッシュエラー処理を提供します.

コンプタイム


ジグは、Aを提供しますcomptime 特定の値と型がコンパイル時に使用可能であることを指定するキーワード.使えますcomptime つの異なる場所で.
  • パラメータ
  • 変数
  • パラメータのcomptime


    ZigはCOUNTimeをパラメータでダック型に使用し、ジェネリックを実装します.
    fn generic_fn(comptime T: type, a: T, b: T) {...}
    
    我々は呼び出すことができますgeneric_fn 次のようにします.
    generic_fn(i32, 10, 11);
    
    関数呼び出しサイトは、型をcomptimeパラメーターとして期待します.

    変数のcomptime


    変数のcomptimeはzigのもう一つの良い特徴です.コンパイラがコンパイル時にすべてのロードとストア操作を実行することを保証します.

    表現のcomptime


    同様に、式をマークすることができますcomptime コンパイル時に評価します.
    目立つ特徴は次のとおりです.
  • CとCのような他の言語とのより簡単な統合.
  • stdライブラリのコードは読み込み可能です.
  • 言語の簡単な文法.
  • Zigで改善する必要のあるものは以下の通りです.
  • エラー処理はさわやかですが、エラーでコンテキストを渡す方法はありません.
  • 読みやすさの重要性は、低レベルのコードを書くことができます.
  • 言語は非常に初期の時代にあり、それがどのように進化するかを見ることが興味深いでしょう.
  • 全体的に、ジグは素晴らしい未来を持っています.それはCの代わりになります、そして、私はそれが成功することを望みます.

    さらに探る

  • Why Zig?
  • Zig documentation
  • Ziglings
  • My AOC experiments in Zig