オフィスアワーがそろそろ始まるよ!()

ビルドコマンド

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コマンドでビルドすることが可能です。

  • init-exe
  • init-lib

init-exe

カレントディレクトリにアプリケーションプロジェクトを作成するためのコマンドです。プロジェクト名 (バイナリ名) は、デフォルトではカレントディレクトリ名となります。

$ 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というファイル名で生成されています。

init-lib

カレントディレクトリにライブラリプロジェクトを作成するためのコマンドです。プロジェクト名 (ライブラリ名) は、デフォルトではカレントディレクトリ名となります。

$ 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
  • build-exe
  • build-lib
  • build-obj

build

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

build-exe

実行ファイルをソースファイルもしくはオブジェクトファイルからビルドします。以下のいずれかの形式で利用します。

  • 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関数が必要なことに注意して下さい。

build-lib

ライブラリファイルをソースファイルもしくはオブジェクトファイルからビルドします。以下のいずれかの形式で利用します。

  • 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;
}

build-obj

オブジェクトファイルをソースファイルからビルドします。以下のいずれかの形式で利用します。

  • zen build-obj <Zenソースファイル>
  • zen build-obj --c-source <Cソースファイル>

基本的な利用方法はbuild-libと同様です。

実行コマンド

ソースコードをビルドし、(ビルドが成功すれば) アプリケーションを実行、もしくは、テストを実行します。

  • run
  • test

run

アプリケーションとしてソースコードをビルドし、アプリケーションを実行します。ソースファイルに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!

test

指定したソースコードとそのソースコードが依存するソースコード内に含まれるテストをビルドし、実行します。

以下は実行例です。

次の内容で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で推奨するコーディングスタイルにソースコードを修正します。

  • fmt

コマンドは次の形式で実行できます。

$ 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コンパイラが保有している情報を表示するためのコマンドです。

  • targets

targets

Zenコンパイラがサポートするターゲット環境一覧を表示します。

$ zen targets

ターゲット環境情報は、アーキテクチャ、OS、ABIがそれぞれ出力されます。これら3つをハイフン (-) で接続し、-targetオプションに指定します。-targetオプションの使用方法は、10.2 ビルドオプションを参照して下さい。

また、"libc"にC言語標準ライブラリのlibcが利用可能なターゲット一覧が表示されます。

C言語コマンド

Zen言語はC言語との相互運用を重要視しています。これらのコマンドは、C言語との相互運用を行うためのものです。

  • cc
  • libc
  • translate-c

cc

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 ccclangのドライバであるため、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-mcpumattr を参照して下さい。 クロスコンパイルを行うためには、読み込むヘッダファイルやライブラリをターゲットの CPU タイプ等に合わせて切り換える必要がありますが、zen cc コマンドはこの切り換えを自動で行うため便利になっています。

libc

ネイティブ環境にインストールされているlibcを検出し、結果を出力します。結果をファイルに保存し編集すると、クロスコンパイル時にlibcを指定する際に利用することができます。

$ zen libc

次のコマンドでlibcコマンドのヘルプを表示できます。

$ zen libc --help

translate-c

C言語のソースコードをZenのソースコードに変換します。結果は標準出力に出力されるため、ファイルへリダイレクトして使用します。

次のようなmain.cがあるとします。

int add(int a, int b) {
    	return a + b;
}

次のコマンドで、main.cmain.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言語で定義されている定数が変換されています。

その他

  • id
  • version
  • meditation

Chapter 1

Chapter 2

Chapter 3

Chapter 4

Chapter 5

Chapter 6

Chapter 7

Chapter 8

Chapter 9

Chapter 10

Chapter 11

Chapter 12

Chapter 13

Chapter 14

Chapter 15

Appendix

Error Explanation

☰ 人の生きた証は永遠に残るよう ☰
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.