プログラミング言語 Zig で Hello World
2022-03-22 / Zig
Zig という言語があるのでひとまず Hello World
からやってみました。
Zig については以下を参考にしてください。
Getting Started ⚡ Zig Programming Language に従って進めていきます。
インストール
Mac だと Homebrew でインストールできます。 執筆時点では最新版は 0.9.1
が利用可能になっていました。
$ brew install zig
$ zig version
0.9.1
エディタの設定
公式サイト(Tools ⚡ Zig Programming Language)でツールが紹介されています。Language Server をインストールして VS Code の拡張機能を設定します。
- zigtools/zls: Zig LSP implementation + Zig Language Server
- ziglang/vscode-zig: Zig language support for VSCode
zls の設定
GitHub のページに記載の手順にしたがって導入します。
$ mkdir $HOME/zls && cd $HOME/zls \
&& curl -L https://github.com/zigtools/zls/releases/download/0.9.0/x86_64-macos.tar.xz \
| tar -xJ --strip-components=1 -C .
# zlsの実行権限がないので付与
$ chmod +x ./zls
zls config
を実行します。オプションの設定はとりあえず全部 y
にしました。
$ ./zls config
Welcome to the ZLS configuration wizard!
*
|\
/* \
| *\
_/_*___|_ x
| @ @ /
@ \ /
\__-/ /
? Should this configuration be system-wide? (y/n) > n
Found zig executable '/usr/local/bin/zig' in PATH.
? Which code editor do you use? (select one)
- VSCode
- Sublime
- Kate
- Neovim
- Vim8
- Emacs
- Doom
- Other
> VSCode
? Do you want to enable snippets? (y/n) > y
? Do you want to enable style warnings? (y/n) > y
? Do you want to enable semantic highlighting? (y/n) > y
? Do you want to enable .* and .? completions? (y/n) > y
Writing config to /Users/kawaken/Library/Application Support/zls.json ... successful.
To use ZLS in Visual Studio Code, install the 'ZLS for VSCode' extension from
'https://github.com/zigtools/zls-vscode/releases' or via the extensions menu.
Then, open VSCode's 'settings.json' file, and add:
"zigLanguageClient.path": "[command_or_path_to_zls]"
Thank you for choosing ZLS!
指示に従い ZLS for VSCode
をインストールをして zigLanguageClient.path
を設定しました。
VSCode の拡張機能
zig
で検索すると出てくる Zig - Visual Studio Marketplace をインストールします。
特に設定はないようです。
Hello World
を実装する
サイトに記載のコマンドを実行して、コードを書いていきます。
$ mkdir hello-world
$ cd hello-world
$ zig init-exe
info: Created build.zig
info: Created src/main.zig
info: Next, try `zig build --help` or `zig build run`
ファイル・ディレクトリは以下のようになりました。
$ tree
.
├── build.zig
└── src
└── main.zig
1 directory, 2 files
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);
}
std.log.info
を使用すると info:
というプリフィックスがつくようなので print
を使用してみます。以下のコードは公式のチュートリアルを参考にしました。
Chapter 0 - Getting Started | ziglearn.org
const std = @import("std");
pub fn main() anyerror!void {
std.debug.print("Hello, {s}!\n", .{"World"});
}
コンパイルと実行します。zig run
というコマンドで直接実行可能のようです(Go のようですね)。
$ zig run src/main.zig
Hello, World!
zig build
で実行形式ファイルを生成できるようです。zig-cache
と zig-out
の下にいろいろとファイルが生成されていました。
$ zig build
$ tree
.
├── build.zig
├── src
│ └── main.zig
├── zig-cache
│ ├── h
│ │ ├── 61730d100cc7930300792893c6942c73.txt
│ │ ├── 791bacaf5c7333e736fd58ba29d92650.txt
│ │ ├── a0ed1fdf9e8f39b6527783f08694369f.txt
│ │ ├── cd91e13c197f99609ec79bf7f3c67967.txt
│ │ └── timestamp
│ ├── o
│ │ ├── 5922002f2d938791dd84c32287f8b32b
│ │ │ ├── build
│ │ │ ├── build.o
│ │ │ ├── builtin.zig
│ │ │ ├── stage1.id -> 8aaadc9da442e8b3b3474b2b2b22ab1320
│ │ │ └── zld.id -> 48a0549aafc1de4d7df4fe6cc3cb30a0
│ │ └── 91614114422a54284ee323285d69daa5
│ │ ├── builtin.zig
│ │ ├── hello-world
│ │ ├── hello-world.o
│ │ ├── stage1.id -> b78a98d47c3ffa3224f209e63203f8ee20
│ │ └── zld.id -> 771b687dd3820d15bac8e8f597eb8150
│ └── z
│ ├── 2d1fdc4cd88730da39ff42daede6a1cb
│ └── 4df82f8b3b717e74de2def4856d06651
└── zig-out
└── bin
└── hello-world
9 directories, 20 files
hello-world
を実行します。
$ ./zig-out/bin/hello-world
Hello, World!
zig run
と同じように出力されました。build.zig
にビルドの設定が記述されているようですが、おいおい確認していこうと思います。