Zig

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page Zig and the translation is 92% complete.
Other languages:

Zig は、堅牢で、最適化された、再利用可能なソフトウェアを保守するための、汎用プログラミング言語およびツールチェーンです。Zig は C より良い言語として C を置き換えることを目的としており、C の関数を FFI 無しで利用したりエクスポートすることができ[1]、C および C++ で書かれたコードを libclang を使用してコンパイルすることもできます。[2]上流は、libclang 無しでこれらの関数を利用できるように、独自の C コンパイラにも取り組んでいます[3]

インストール

前提条件

警告
Zig 0.10.1 をコンパイルするためには 9.6 GiB の RAM が必要です。[4]

Zig は少なくともカーネル 3.16+ をサポートしています。[5]ソースからビルドする場合は、LLVM/Clang のコンパイルに使ったものと同じコンパイラを使ってビルドする必要があり、そうしないと問題が発生するでしょう (下のトラブルシューティングの関連する節を参照してください)。

USE フラグ

USE flags for dev-lang/zig A robust, optimal, and maintainable programming language

+llvm Build with LLVM backend and extensions enabled.
doc Add extra documentation (API, Javadoc, etc). It is recommended to enable per package instead of globally
test Enable dependencies and/or preparations necessary to run tests (usually controlled by FEATURES=test but can be toggled independently)
verify-sig Verify upstream signatures on distfiles

USE flags for dev-lang/zig-bin A robust, optimal, and maintainable programming language

doc Add extra documentation (API, Javadoc, etc). It is recommended to enable per package instead of globally
verify-sig Verify upstream signatures on distfiles

Emerge

メモ
バイナリパッケージを使用したい場合は、"dev-lang/zig" を "dev-lang/zig-bin" で置き換えてください (現在のアーキテクチャで利用可能な場合)。

パッケージは現在どのアーキテクチャ上でも安定化されておらず、一部のアーキテクチャ上で testing としてキーワード指定されています。そのため、後者のアーキテクチャで使用するには、testing (~arch、arch はシステムのアーキテクチャで置き換えてください) キーワードを許可する必要があります:

root #echo "dev-lang/zig ~arch" >> /etc/portage/package.accept_keywords

そして、パッケージを emerge してください:

root #emerge --ask dev-lang/zig

設定

ZIG_MCPU と ZIG_TARGET

どのターゲットと CPU 向けに dev-lang/zig をビルドするかを調節するために、ZIG_MCPU および ZIG_TARGET 変数があります (これらは -target および -mcpu 引数として zig に渡されます:

ファイル /etc/portage/make.conf/zigExamples of ZIG_MCPU and ZIG_TARGET
# By default ZIG_MCPU and ZIG_TARGET equal to "native"
# In case of cross-compilation ZIG_MCPU equals to "baseline"
# and ZIG_TARGET is converted from CTARGET or CHOST
# In most cases user don't have to set custom values, except when "native" or convertion doesn't work
#
# ZIG_TARGET has this required sections: <arch>-<os>-<abi>
ZIG_TARGET="x86_64-linux-gnu" # For computer running AMD64 on Linux kernel with glibc
# And optional ones: min_ver...max_version of OS and ABI/libc version
ZIG_TARGET="x86_64-linux.6.1.12...6.1.12-gnu.2.36" # For Linux kernel 6.1.12 and glibc 2.36
#
# ZIG_MCPU has required section of architecture's name
ZIG_MCPU="znver2" # For processors from Zen 2 family
# And optional section for features on this architecture
# ("+" means it has and "-" means it hasn't this feature)
ZIG_MCPU="x86_64+x87-sse" # For processors on AMD64 architecture, with added support for X87 but without SSE2 instructions

デフォルトスロットを設定する

eselect コマンドを利用して /usr/bin/zig シンボリックリンクを操作することができます。

user $eselect zig help
Manage Zig versions
Usage: eselect zig <action> <options>
Standard actions:
  help                      Display help text
  usage                     Display usage information
  version                   Display version information
Extra actions:
  list                      List available Zig versions
  set <target>              Set active Zig version
    target                    Target name or number (from 'list' action)
  show                      Show current Zig version
  update                    Automatically update the zig symlink
    ifunset                   Do not override currently set version
user $eselect zig list
Available Zig versions:
  [1]   zig-0.10.1 *
  [2]   zig-9999
  [3]   zig-bin-0.10.1

環境変数

メモ
残念ながら、以下以外の引数 (ターゲットや、リリース/最適化モードなど) を環境変数で設定する方法は無いので、ユーザはそれらを引数で指定する必要があります。

以下の環境変数よりも、コマンドライン引数のほうが優先されます:

  • ZIG_GLOBAL_CACHE_DIR - コンパイルを跨いで共有されるキャッシュのディレクトリへのパス
  • ZIG_LOCAL_CACHE_DIR - 現在のコンパイルのキャッシュのディレクトリへのパス、デフォルトでは build.zig の隣り
  • ZIG_LIB_DIR - Zig 標準ライブラリへのパス

使い方

一般的な使い方

警告
Zig で書かれた多くのプログラムやライブラリが、comptime 言語機能を活用しています。詳しい情報は language reference で読めますが、一言で言うと、Zig はコンパイル時にソースファイル (build.zig、標準ライブラリ、プロジェクト自身のファイルなど) の中の任意のコードを実行することができます。注意してください。
user $zig --help

Most commands grouped together, like ast-check to translate-c, have the same command options.

In the second group, it is highly recommended to use -fstrip to reduce the executable size except for debugging purposes.

ビルドモード

Zig には 4 種類の「ビルドモード」 (最近のバージョンでは「最適化モード」とも) があります:

Feature Debug (default) ReleaseFast ReleaseSafe ReleaseSmall
Compilation speed Fast Slow Slow Slow
Safety checks at runtime Enabled Disabled Enabled Disabled
Optimizations Disabled Optimized for speed Optimized for speed Optimized for size
Reproducible Not guaranteed Yes Yes Yes
Equivalent in C

(interop. or compiling)[6]

-D_DEBUG -O0 -DNDEBUG -O2 -O2 -D_FORTIFY_SOURCE=2 -DNDEBUG -Os
メモ
実行時の安全性チェックは、@setRuntimeSafety を設定することによって、スコープ/ブロック単位で変更することができます。コンパイル時の安全性チェックは常に有効化されています。

LSP サポート

非公式の言語サーバGURU リポジトリ内の dev-zig/zls として利用可能です。 インストールのためには、このガイドに従って GURU リポジトリを有効化し、このパッケージに対して testing ブランチを受諾し、以下を実行してください:

root #emerge --ask dev-zig/zls::guru

テキストエディタサポート

上流によるツールの一覧を参照してください。現時点では、これらはどれもパッケージ化されていません。

フリースタンディング

トラブルシューティング

emerge 中の "undefined reference to ..."

もっとも可能性の高い原因は、LLVM と Clang パッケージが Zig と異なる C++ コンパイラでビルドされていることです。同じコンパイラが設定されていることを確認して、再度 emerge してください。

warning: Encountered error: UnexpectedEndOfFile, falling back to default ABI and dynamic linker.

Zig コンパイラはホストマシンをターゲットとしているとき、libc を選択するために /usr/bin/env の存在に依存します。/usr/bin/env が実際の ELF ファイルを含んでいるか、それとも他の実行可能形式へのシンボリックリンク/シバンなのかを確認し、見つかるまでこの操作を再帰的に繰り返します。その後、この ELF ファイルから libc についての情報を抽出しようとします。このメッセージが現れる場合、それは Zig が ELF ファイルを適切に検出するのに失敗し、代わりにデフォルトの libc と ABI (例えば Linux 上では musl) を選択しようとしているという意味です。回避策は、コマンドで以下の引数を使用することです:

user $zig build -Dtarget=<target>

または:

user $zig build-exe -target <target>

ここで target は、 native-native-gnu または native-native-musl などの希望するターゲットです。ターゲットフォーマットに関するさらなる情報については、ZIG_MCPU と ZIG_TARGET の節を参照してください。

削除

unmerge

root #emerge --ask --depclean --verbose dev-lang/zig

関連項目

  • Clang — a C/C++/Objective-C/C++, CUDA, and RenderScript language front-end for the LLVM project
  • Rust — a general-purpose, multi-paradigm, compiled, programming language.
  • Go — an open source, statically typed, compiled programming language

外部資料

  • コミュニティ空間の公式のリスト
  • コミュニティプロジェクトの公式のリストawesome-zig リスト
  • Ziglings — Rustlings に影響を受けた、小さな壊れたプログラムを修正することで Zig を学習するコース
  • zig ccclang違い

参照