山中の賊を破るは易く心中の賊を破るは難し
Advent Calendar 2022 4日目1の記事です。
私のAdvent Calendar 2022 一覧。
はじめに
Elixirを楽しんでいますか
昨日「Fortranをはじめる(Nervesにてはじめる前の準備運動を開始)」という記事を書きました。
@mnishiguchi さんからZigなるものを教えてもらいました。
とりあえずZig単体で、Hello, World
してみます。
近いうちにNervesと組み合わせて、アレした〜 コレした〜 を書いてみたいとおもっています。
This is huge news. Zig can now create Erlang/Elixir NIFs and cross compile them to all major OSes. But eg Rust can cross compile too, right? Right, it can do that for Rust code. But Zig can cross compile both Zig *and* C/C++ code. Let that sink in for a minute. #MyElixirStatus https://t.co/sxW4d4pqid
— Wojtek Mach (@wojtekmach) January 1, 2022
この記事では、Elixirには触れません。
Zigの公式ページ
Zig is a general-purpose programming language and toolchain for maintaining robust, optimal, and reusable software.
2015年に誕生したプログラミング言語とのことで、Youngです。
Qiita内では2022/01/03 18:41現在、ZIGのTagが付いた記事は私の記事を入れて6本です。
公式のトップには以下のプログラムが書いてあります。
const std = @import("std");
const json = std.json;
const payload =
\\{
\\ "vals": {
\\ "testing": 1,
\\ "production": 42
\\ },
\\ "uptime": 9999
\\}
;
const Config = struct {
vals: struct { testing: u8, production: u8 },
uptime: u64,
};
const config = x: {
var stream = json.TokenStream.init(payload);
const res = json.parse(Config, &stream, .{});
// Assert no error can occur since we are
// parsing this JSON at comptime!
break :x res catch unreachable;
};
pub fn main() !void {
if (config.vals.production > 50) {
@compileError("only up to 50 supported");
}
std.log.info("up={d}", .{config.uptime});
}
おそらくは、up=9999
が出力されるものとおもいます。
本当にそうなのか、インストールから取り組んでみます。
インストール
Getting Startedをご参照ください。
私は、macOSを使っています。
Homebrewにてインストールしました。
$ brew install zig
(任意)VS Codeのプラグイン
Toolsというドキュメントでススメられていました。
Run Hello World
$ mkdir hello-world
$ cd hello-world
$ zig init-exe
こんなふうにファイルが作られます。
.
├── build.zig
└── src
└── main.zig
とりあえず、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);
}
テスト
ほうほう、テストコードもあります。
テストからやってみます。
ファイル名を指定する必要があります。
$ zig test src/main.zig
当然パスします。
これまた当然、期待結果の10
を11
などに書き換えるとテストはコケます。
Run
$ zig build run
$\huge{All\ your\ codebase\ are\ belong\ to\ us.}$
Hello, world!
ではなく、All your codebase are belong to us.
とzig init-exe
コマンドで作られたファイルに書いてあるので、その通りに出力されています。
一瞬、コンピュータが乗っ取られたのかと思いましたが、そんなことはありません2。
安心してください。
そう書いてあるから、書いてある通りに出力されただけです。
All your codebase are belong to us.
ところでこのAll your codebase are belong to us.
という英文、
$\huge{なんだか変}$
です3。
Google翻訳やDeepLに聞いてみましたが、どうもピンときません。
結論から言うと、日本発の**ゼロウィング**というゲームのヨーロッパ版の英訳を起源とするもので、一種のネタのようなものでした。
以下、リンクを示しておきます。
さらに、**ゼロウィング**のゲームの内容は、
宇宙海賊「CATS」を倒すために、自機「ZIG-01」が8つの防衛基地に向けて発進するという内容となっている。1
とのことです。
Zigというプログラミング言語の由来は、ゼロウィングというゲームにありそうですが、正確なことはわかりません。
公式ページトップに載っているプログラムの実行結果
話をプログラミング言語Zigに戻します。
src/main.zig
を公式ページトップに載っているプログラムに書き換えます。
const std = @import("std");
const json = std.json;
const payload =
\\{
\\ "vals": {
\\ "testing": 1,
\\ "production": 42
\\ },
\\ "uptime": 9999
\\}
;
const Config = struct {
vals: struct { testing: u8, production: u8 },
uptime: u64,
};
const config = x: {
var stream = json.TokenStream.init(payload);
const res = json.parse(Config, &stream, .{});
// Assert no error can occur since we are
// parsing this JSON at comptime!
break :x res catch unreachable;
};
pub fn main() !void {
if (config.vals.production > 50) {
@compileError("only up to 50 supported");
}
std.log.info("up={d}", .{config.uptime});
}
$ zig build run
$\huge{info: up=9999}$
Wrapping up
Enjoy Zig
$\huge{All\ your\ codebase\ are\ belong\ to\ us.}$
Zigの公式ページの下のほうにも書いてあります。
"Zig" in Japanese
When Japanese folks hear "zig", they think of the below songs.
We hope you enjoy them.
近藤真彦 スニーカーぶる~す
シブがき隊 ZIG ZAG セブンティーン
-
@kaizen_nagoya さんの「「@e99h2121 アドベントカレンダーではありますまいか Advent Calendar 2020」の改訂版ではありますまいか Advent Calendar 2022 1日目 Most Breakthrough Generator」から着想を得て、模倣いたしました。 ↩ ↩2
-
「All your codebase are belong to us.」の話が好きで、私はZigの虜になりそうです。そういう意味では私のパソコンはすっかり乗っ取られてしまったのかもしれません。 ↩
-
ブームを起こしたことはすごいことです。私は「ゼロウィング」をプレイしたことはないし、何も関わってはいませんし、私だけの感じ方だとはおもいますが、これからももっともっと日本から英語で堂々と発信して行けばいいとおもっています。何か私も世界を驚かせるsomethingを残したいとおもっています。 ↩