Zig 言語触ってみた
JavaScript のランタイムとして Node.js があり、その次世代版として同じ作者が Deno を立ち上げたが、最近 Bun という新しいランタイムが登場している。
この Bun が内部で使っている言語が Zig という比較的新しいプログラミング言語だ。
Rust に近い言語だそうで、ということは C/C++ 言語に近い感じで、Java とか JavaScript とかでアプリケーションを作っているような人達からするとより低レイヤーなことができる言語といえる。「ポインタ?メモリアロケーション?ナニソレ」な状態だとマジで意味分からん言語だと思うが、せっかくなので触ってみる。
- Neos21/practice-zig: Practice Zig Lang
- マジで起動しただけ状態…w
# 今回は MacOS Homebrew で軽く触ってみる
$ brew install zig
# 本稿執筆時点の最新版
$ zig version
0.9.1
# プロジェクトの雛形を作る
$ mkdir practice-zig && cd $_
$ zig init-exe
info: Created build.zig
info: Created src/main.zig
info: Next, try `zig build --help` or `zig build run`
# その場で動かす
$ zig run ./src/main.zig
# ビルドして実行する
$ zig build
$ ./zig-out/bin/practice-zig
# 以下なら一発でビルドと実行ができる
$ zig build run
ということで build.zig
というファイルと src/main.zig
というファイルができた。メインファイルはこんな感じ。
const std = @import("std");
pub fn main() anyerror!void {
std.log.info("All your codebase are belong to us.", .{});
}
test "basic test" {
try std.testing.expectEqual(10, 3 + 7);
}
あーなんか Rust に近い雰囲気だ。
- Go 言語における
$ go fmt
・$ go test
- Rust 言語における
$ cargofmt
・$ cargo test
- Deno における
$ deno fmt
・$ deno test
などのように、最近の言語らしく、Linter やオートフォーマット、ユニットテスト実行機能などが最初から備わっている。
# オートフォーマット
$ zig fmt ./
# テスト
$ zig test ./src/main.zig
All 1 tests passed.
この辺は Node.js 使いからすると整備されてて羨ましい。個人的には空行のインデントスペースが消されてしまうのが嫌なのだが、もう世界的にそういう流れになってて抗えないので、諦めつつある…。w
以下雑感。
自分は Rust もちょっとしたコードを書いたきりでサッパリなのだが、巷では Rust よりも Zig の方が書きやすいとか言われている。ホントかなぁ?Fizz Buzz とかちょっと書いてみたけどスゲーワケワカランヌだったわ…。自分は C 言語系統のスキルが全然ない JavaScripter なので、多分ゴッソリと基礎が抜けてて Rust や Zig を書く時の思考回路ができてないんだと思う。
あと、こういう新しい言語が出てきた時に、その言語を勉強して何を書くか、っていうところが自分には見えていない。デバイスドライバとか Linux カーネルとか、マシンに近い領域を実装する予定もモチベーションもないし、「それやるの Java や Python なんかじゃダメなんですか?」「ウェブアプリなら JS・TS だけでよくないすか?」みたいな感覚になってしまう。Go 言語はその中だともう少しユーザ寄りというか、Java なんかだと大仰だからもっとシンプルに実装して開発速度を上げたいっていう方向性が分かりやすく共感しやすいのでまだ納得感があるんだよなぁ。
まぁ無理して新しい言語で何かしないといけないとか命令されてるワケじゃないので、別に Go も Rust も Zig も知らなくたって何も困りはしないんだけど、何かこう、せっかくエンジニアやってるのに、自分の全く知らない世界で物凄い進化が起きていたりしたらカッコ悪いなぁーとか思ってしまってちょっと触ってみるんだけど、もう既にワケワカメに凄い世界が広がっていて、おじさんまいっちゃったよ…っていう感じです。おしり。