はじめに
急に寒くなってきた今日この頃、皆様いかがお過ごしでしょうか。私はこの記事の執筆に追われております。本記事は、プログラミング言語のZigをやってみようという記事になっております。色々と課題も多いこの言語ですがそういうところが愛着湧いて好きになるみたいなのありますよね?ね。では見ていきましょう。
Zigってなに
Zigは2015年に登場したかなり新しい言語です。最近というかもうずっと流行っているGoが2009年と言うとどれくらい新しいかわかりやすいでしょうか。
言語ページに行くと、このような文章が出てきます。
Zigは、堅牢、最適、および再利用可能なソフトウェアをメンテナンスするための汎用プログラミング言語およびツールチェインです。
堅牢なのは嬉しいですね。一体何が堅牢なのかもう少し特徴を見ていきましょう。
特徴
隠れた制御フローが無い
var a = b + c.d;
foo();
bar();
上記のコードにはどういった可能性が秘められているでしょうか。
1行目は変数に変数とプロパティの足し算をしたもの(言語によっては文字列連結かも)を代入しています。ある特定の言語を触っている人ならc.dって関数呼び出す可能性あるよねという想像が働きます。この時点で考慮点は果てしなく増えます。さて、先程自然にコード上の+
を足し算と言いましたが本当にそうでしょうか。演算子のオーバーロードできますよね?ここまでくるともう1行目は何をしていてもおかしく無いのです。
2行目3行目は関数を呼び出しています。これはそのままですね。foo()
が呼ばれてその後bar()
が呼ばれて終わりです。わざとらしく書きましたがそうです、これも信用できないのです。foo()
は例外を明示的にthrowしてbar()
を呼ばない可能性もあるでしょう。
急にコードについてグダグダ話しましたが、Zigではこれらを考える必要がありません。コードとして目に見えることが全てです。変数aにはbとc.dの足し算結果が代入されるし、関数foo()、bar()のみが呼び出されます。
その他
隠れたアロケーションが存在しない。つまり、直感的でなかったり見えないところでのメモリ確保等を勝手に行うことがありません。そういった機能が存在しません。これにより機能や関数呼び出し毎に、メモリ割り当ての副作用無いよねと言う確認を入れる手間が省けます。実際気付かずに言語側がメモリを使用していて(newをループ内で大量にしていた等)アプリが落ちた経験のある人もいるかも知れません。Zigではアプリ側で明確にヒープメモリを管理します。
他にもシンプルさを売りにしており、プログラミング言語のデバッグでは無くアプリケーションのデバッグに専念しようという考えがあったりします。最低限のシンプルな機能を言語としては提供しようと言うことだと思います。
実践
最後に実際Zigを書いて動かしてみましょう。
まずZigをインストールします。インストールはダウンロードページからバンドルをダウンロードしてPATHを追加してもいいですし、ソースからビルドしてもいいですし、brewでダウンロードしてもいいです。一番楽なのでbrewのインストールコマンドだけ貼っておきます。
brew install zig
その後、
zig version
と入力してバージョンが出ればOKです。
次はお馴染みのhello worldを出力しましょう。以下のようなファイルを作成します。ちなみに今回はver0.10.0で動作確認しております。
const std = @import("std");
pub fn main() void {
std.debug.print("Hello, {s}!\n", .{"World"});
}
Zigはいくつか実行方法がありますが今回は2つ紹介します。1つ目はまとめてbuildと実行を行うものです。作ったhello.zigのあるディレクトリで以下のコマンドを実行します。
zig run hello.zig
するとHello, World!
と表示されます。
2つ目はbuildと実行を分けて行うものです。
zig build-exe hello.zig
./hello
これで実行ファイルを作成してから、それを実行することができました。
コードはc系を触ったことがある人だと大体何をしているかわかるかなと思います。ざっくり説明すると1行目でstdという変数にstdという標準ライブラリをインポートした情報を入れます。3行目はmain関数の宣言です。zigでもmainがまず呼ばれて、最後まで行けばプログラムが終了します。4行目は標準出力部分です。標準ライブラリのprint関数を呼び出しています。{s}
に{"World"}
が入ってくる感じですね。cとかの%d等と同じ感じです。
最後に
時間が無くて本当にhelloworldを出すところまでしか書けなかったのが残念です。Zigは執筆時点でまだバージョンが1になっておらず安定していません。前バージョンで動いていたコードがアップデートしたら一切動かなくなったということもあります。v1.0まで頑張って欲しいですし、今なら言語を本当の意味で作っていく段階に携われるのでチャンスです。興味を持った方はぜひ触ってみてgithubにもアクセスしてみてはいかがでしょうか。