Zenコンパイラには様々なコマンドが実装されています。ここでは、Zenコンパイラが備えているコマンドについて説明します。
Zenコンパイラのビルドコマンドおよびビルドオプションを表示するには、次のコマンドを実行します。
zen
すると次のような出力が見られます。
.--.-.--.
,' / \ `.
,' ; : `. The Zen Language Compiler
; .--|--------. : VersionID 0.8.20200609LTS (LTS) (stage1)
|,' | | `.| Copyright 2018-2020 Kristopher Tate and connectFree Corporation.
( | | ) All Rights Reserved. Protected by International Patent Treaties.
:'-. | | ,-'; Please visit us online at https://www.zen-lang.org/
\ `-\-------' / ☰ 人の生きた証は永遠に残るよう ☰
`. \ / ,'
`. \ / ,'
`--'--'
使用法: zen [コマンド] [オプション]
【コマンド一覧】
build build.zenよりプロジェクトを生成する
build-exe <source> ソースまたはオブジェクトファイルから実行ファイルを作成する
build-lib <source> ソースまたはオブジェクトファイルからライブラリを作成する
build-obj <source> ソースまたはアセンブリからオブジェクトを作成する
cc [options] <file...> C言語のコンパイラを利用する
fmt [options] [file...] 入力ファイルを解析し、標準のZEN形式で整理する
id BASE64でエンコードされたコンパイラIDをプリントする
init-exe 現在の作業ディレクトリ(CWD)で`zen build`系アプリケーションを初期化する
init-lib 現在の作業ディレクトリ(CWD)で`zen build`系ライブラリを初期化する
libc [paths-file] ZEN系libcパスファイルの表示または検証
run <source> [-- [args]] 実行ファイルを作成してすぐに実行する
translate-c <source> C言語のコードをZEN言語に変換する
targets 利用可能なコンパイルターゲットの一覧
test <source> テストビルドを作成して実行する
version バージョン番号を出力して終了する
meditation zenに意味を見いだす
legal zenに関する法的情報
【コンパイルオプション】
--builtin コンパイラの「builtin」ソースコードをプリントする
...
ここでは、Zenの各コマンドについて解説します。
Zenプロジェクトのテンプレートを生成するコマンドです。作成したテンプレートプロジェクトは、zen build
コマンドでビルドすることが可能です。
カレントディレクトリにアプリケーションプロジェクトを作成するためのコマンドです。プロジェクト名 (バイナリ名) は、デフォルトではカレントディレクトリ名となります。
$ mkdir init-exe && cd $_
$ zen init-exe
Created build.zen
Created src/main.zen
Next, try `zen build --help` or `zen build run`
これでテンプレートプロジェクトが自動生成されます。ディレクトリ構造は次のようになっています。
├── build.zen
└── src
└── main.zen
1 directory, 2 files
このプロジェクトは、次のコマンドでビルドおよび実行することができます。
zen build run
ビルドされたバイナリは、zen-cache/bin
下にinit-exe
というファイル名で生成されています。
カレントディレクトリにライブラリプロジェクトを作成するためのコマンドです。プロジェクト名 (ライブラリ名) は、デフォルトではカレントディレクトリ名となります。
$ mkdir init-lib && cd $_
$ zen init-lib
Created build.zen
Created src/main.zen
Next, try `zen build --help` or `zen build test`
これでテンプレートプロジェクトが自動生成されます。ディレクトリ構造は次のようになっています。
.
├── build.zen
└── src
└── main.zen
1 directory, 2 files
このプロジェクトは、次のコマンドでビルドすることができます。
ノート: ライブラリプロジェクトは実行バイナリを生成しないことに注意して下さい。
zen build
ビルドされたライブラリは、zen-cache/lib
下にlibinit-lib.a
というファイル名で生成されています。
また、次のコマンドでプロジェクト内のテストを実行することができます。
zen build test
ソースコードをビルドするためのコマンドです。
build
コマンドはZenのビルドスクリプトbuild.zen
でプロジェクトをビルドするためのコマンドです。zen build
コマンドはプロジェクトのディレクトリ内であれば、どこからでも利用することができます。Zenコンパイラは、カレントディレクトリもしくは親ディレクトリを辿ってbuild.zen
がないかどうか探します。
例えば、次のコマンドを実行した時、zen build
は全て成功します。
$ mkdir build && cd $_
$ zen init-exe
$ ls
build.zen src
# カレントディレクトリに`build.zen`がある
$ zen build
$ cd src
# 親ディレクトリに`build.zen`がある
$ zen build
$ mkdir child && cd $_
# 親の親ディレクトリに`build.zen`がある
$ zen build
--build-file
オプションでビルドスクリプトを指定することも可能です。
$ mkdir build && cd $_
$ zen init-exe
# 親ディレクトリに移動
$ cd ..
$ mkdir tmp && cd $_
# そのまま`zen build`を実行すると`build.zen`が見つからず、失敗する
$ zen build
No 'build.zen' file found, in the current directory or any parent directories.
Initialize a 'build.zen' template file with `zen init-lib` or `zen init-exe`,
or see `zen --help` for more options.
# `--build-file`でビルドスクリプトを指定すればビルドできる
$ zen build --build-file ../build/build.zen
ビルドスクリプトには、新しいステップを追加することができます。zen init-exe
で作成するプロジェクトテンプレートのビルドスクリプトにはinstall
/ uninstall
/ run
のステップが追加されています。そのため、zen build run
とするとビルドを実行した上で、プログラムを実行します。
ビルドスクリプトについては、10.3 ビルドスクリプトで詳しく説明します。
--verbose
オプションを指定することで zen build
の内部で実行されるコマンドの詳細を表示することができます。
$ mkdir hello && cd $_
$ zen init-exe
$ zen build --verbose
<zen install dir>/bin/zen build-exe <your work dir>/hello/src/main.zen --cache-dir <your work dir>/hello/zen-cache --name hello --cache on
cp <your work dir>/hello/zen-cache/o/MJDKKTJIboIbb5uT5g31U5znGmJeRSBoF1pWJ4gNcxyArNw0zz_pOo4l-y4t8ZI7/hello <your work dir>/hello/zen-cache/bin/hello # installed
実行ファイルをソースファイルもしくはオブジェクトファイルからビルドします。以下のいずれかの形式で利用します。
zen build-exe <Zenソースファイル>
zen build-exe --object <オブジェクトファイル> --name <実行バイナリ名>
zen build-exe --c-source <Cソースファイル>
実行例を示します。
# 新しいディレクトリを作成して移動する
$ mkdir build-exe && cd $_
次の内容でmain.zen
を作成します。
const std = @import("std");
pub fn main() anyerror!void {
std.debug.warn("Hello World!\n", .{});
}
main.zen
をビルドします。
$ zen build-exe main.zen
# 実行ファイル`main`とオブジェクトファイル`main.o`が生成される
$ ls
main main.o main.zen
# `main`を実行する
$ ./main
Hello World!
Zenのソースファイルからビルドしましたが、オブジェクトファイルから実行ファイルを生成することもできます。
# `--object`オプションで`main.o`を指定する
# `--name`オプションで実行バイナリ名`main_from_obj`を指定する
$ zen build-exe --object main.o --name main_from_obj
$ ./main_from_obj
Hello World!
C言語のソースファイルをビルドすることもできます。次の内容でc_main.c
ファイルを作成します。
#include <stdio.h>
int main(void) {
printf("Hello from C World!\n");
return 0;
}
次のコマンドでビルドを実行します。--library
オプションについては、10.2 ビルドオプションで説明しますが、ここではC言語の標準ライブラリを利用するために必要です。
# `--c-source`オプションで`c_main.c`を指定する
# libcをリンクするために`--library`オプションを利用する
$ zen build-exe --c-source c_main.c --library c
$ ./c_main
Hello from C World!
build-exe
でZenソースファイルを指定する場合、指定するファイルにはpub
で公開されたmain
関数が必要なことに注意して下さい。
ライブラリファイルをソースファイルもしくはオブジェクトファイルからビルドします。以下のいずれかの形式で利用します。
zen build-lib <Zenソースファイル>
zen build-lib --object <オブジェクトファイル> --name <ライブラリ名>
zen build-lib --c-source <Cソースファイル>
実行例を示します。
mkdir build-lib && cd $_
次の内容でadd.zen
を作成します。
pub fn add(a: u32, b: u32) u32 {
return a + b;
}
add.zen
をライブラリとしてビルドします。
$ zen build-lib add.zen
# `add.h`と`libadd.a`が生成される
$ ls
add.h add.o add.zen libadd.a
ライブラリとしてビルドする場合、ZenコンパイラはデフォルトでC言語からライブラリを利用するためのCヘッダファイルを生成します。今回の場合、add.h
の中身は実質、何もありません。C言語にAPIを公開する場合は、C ABIに従う関数を定義しなければなりません。詳細は、14. Cとのインタフェースを参照して下さい。
オブジェクトファイルからライブラリを生成する場合は、以下のコマンドになります。
$ zen build-lib --object add.o --name add_from_obj
C言語のソースファイルからライブラリを作成する場合、以下のコマンドを実行します。
$ zen build-lib --c-source c_add.c
c_add.c
は例えば、次のような内容で作成します。この場合、C言語の標準ライブラリを使用していないため、上のコマンドでも--library c
は不要です。
int add(int a, int b) {
return a + b;
}
オブジェクトファイルをソースファイルからビルドします。以下のいずれかの形式で利用します。
zen build-obj <Zenソースファイル>
zen build-obj --c-source <Cソースファイル>
基本的な利用方法はbuild-lib
と同様です。
ソースコードをビルドし、(ビルドが成功すれば) アプリケーションを実行、もしくは、テストを実行します。
アプリケーションとしてソースコードをビルドし、アプリケーションを実行します。ソースファイルにpub
で公開されたmain
関数が存在していなければなりません。
以下は実行例です。
次の内容でmain.zen
を作成します。
const std = @import("std");
pub fn main() void {
std.debug.warn("Hello World!\n", .{});
}
次のコマンドでmain.zen
を実行します。
zen run main.zen
Hello World!
指定したソースコードとそのソースコードが依存するソースコード内に含まれるテストをビルドし、実行します。
以下は実行例です。
次の内容でadd.zen
を作成します。
const std = @import("std");
const ok = std.testing.ok;
fn add(a: u32, b: u32) u32 {
return a + b;
}
test "test add" {
ok(add(1, 2) == 3);
}
次のコマンドでadd.zen
のテストを実行します。
$ zen test add.zen
Test [██████████ 1/1] test "test add"...OK
All 1 tests have succesfully passed.
Zenコンパイラ組込みのコードフォーマッタです。Zenで推奨するコーディングスタイルにソースコードを修正します。
コマンドは次の形式で実行できます。
$ zen fmt <ファイル名 or ディレクトリ名>
複数のファイル名とディレクトリ名を指定することも可能です。ディレクトリを指定した場合、ソースコードを再帰的に検索し、フォーマットを実行します。
fmt
コマンドのオプションです。
Options:
--help ヘルプを表示します
--color [auto|off|on] エラーメッセージを色付きで出力するかどうかを有効化 / 無効化します
--stdin 標準入力からフォーマットするソースコードを入力し、標準出力に出力します
--check ソースコードの修正は行わず、フォーマット違反があった場合のみ、報告します
--mut_conv const, mut の変換を行います
--mut_conv
オプションについて詳細を説明します。
Zen 0.8.x 初期バージョンまでは、ポインタ型はデフォルトでミュータブルでありイミュータブルにするためには const
をつける必要がありました。しかし、Zen 0.8.x LTS版からはポインタ型はデフォルトでイミュータブルとなり、ミュータブルポインタとするために mut
をつける必要があるように変わりました。
この変更はソースコード全体に関わる大きな変更であるため fmt
のオプションとして --mut_conv
を用意しています。
0.8.x 初期バージョンのソースファイルに対して zen fmt --mut_conv
を実行することで自動的に不要な const
を削除し、代わりに mut
が必要な箇所に付加することができます。
ただし、この変換は完全ではない場合があるため、コンパイルエラーが発生する場合は適宜手動で修正する必要があることはご注意ください。
また、一度 --mut_conv
オプションを付けて zen fmt
を実行したファイルに対して再度実行すると不正な変換が行われる可能性があるためご注意下さい。
Zenコンパイラが保有している情報を表示するためのコマンドです。
Zenコンパイラがサポートするターゲット環境一覧を表示します。
$ zen targets
ターゲット環境情報は、アーキテクチャ、OS、ABIがそれぞれ出力されます。これら3つをハイフン (-
) で接続し、-target
オプションに指定します。-target
オプションの使用方法は、10.2 ビルドオプションを参照して下さい。
また、"libc"
にC言語標準ライブラリのlibc
が利用可能なターゲット一覧が表示されます。
Zen言語はC言語との相互運用を重要視しています。これらのコマンドは、C言語との相互運用を行うためのものです。
Zenコンパイラは、C言語コンパイラ (clang) のドライバを内包しています。このコマンドは、Zenコンパイラを使用して、C言語のソースコードをビルドします。
使用例を示します。
次のCソースファイルmain.c
を用意します。
#include <stdio.h>
int main(void) {
printf("Hello from C World!\n");
return 0;
}
次のコマンドでCソースファイルをコンパイルします。
$ zen cc main.c
a.out
が出力されるので実行します。
$ ls
a.out main.c
$ ./a.out
Hello from C World!
zen cc
はclang
のドライバであるため、clang
のオプションを指定することが可能です。下記コマンドでヘルプを表示できます。
$ zen cc --help
例えば、クロスコンパイルのためにビルドターゲットを指定するオプションは 以下のように指定します。
$ zen cc -o hello hello.c -target aarch64-linux-gnu
...
$ file hello
hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-, for GNU/Linux 2.0.0, with debug_info, not stripped
ターゲットの指定方法については、第10章 ビルドオプション の
-target
、-mcpu
、mattr
を参照して下さい。
クロスコンパイルを行うためには、読み込むヘッダファイルやライブラリをターゲットの CPU タイプ等に合わせて切り換える必要がありますが、zen cc
コマンドはこの切り換えを自動で行うため便利になっています。
ネイティブ環境にインストールされているlibc
を検出し、結果を出力します。結果をファイルに保存し編集すると、クロスコンパイル時にlibc
を指定する際に利用することができます。
$ zen libc
次のコマンドでlibc
コマンドのヘルプを表示できます。
$ zen libc --help
C言語のソースコードをZenのソースコードに変換します。結果は標準出力に出力されるため、ファイルへリダイレクトして使用します。
次のようなmain.c
があるとします。
int add(int a, int b) {
return a + b;
}
次のコマンドで、main.c
をmain.zen
に変換します。
$ zen translate-c main.c > main.zen
main.zen
の先頭を表示すると、C言語のソースコードがZenのソースコードに変換されていることが確認できます。
pub export fn add(arg_a: c_int, arg_b: c_int) c_int {
var a = arg_a;
var b = arg_b;
return (a + b);
}
main.zen
の続きには、C言語で定義されている定数が変換されています。
☰ 人の生きた証は永遠に残るよう ☰
Copyright © 2018-2020 connectFree Corporation. All rights reserved. | 特定商取引法に基づく表示
Zen, the Zen three-circles logo and The Zen Programming Language are trademarks of connectFree corporation in Japan and other countries.