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

Hello World

Zenでプログラムを書く準備が整いました。まず、Zenのサンプルプロジェクトを作成して、実行してみましょう。

サンプルプロジェクト

プロジェクトの作成

作業用のディレクトリhelloを作成し、zen init-exeコマンドを実行して下さい。

$ mkdir hello
$ cd hello
$ zen init-exe

これで、プロジェクトの雛形であるbuild.zensrc/main.zenが生成されます。

.
├── build.zen
└── src
    └── main.zen

1 directory, 2 files

build.zenについては、10章ビルドスクリプトで紹介します。

src/main.zenの内容を確認してみましょう。

examples/hello/src/main.zen

const std = @import("std");

pub fn main() anyerror!void {
    std.debug.warn("Zen の道へようこそ。\n道案内はこちらからどうぞ:\nhttps://www.zen-lang.org/ja-JP/docs/\n", .{});
}

これは、ZenのHello Worldプログラムに相当します。通常、このファイルを編集してプログラムを作成していきますが、今回はこの雛形をそのまま実行してみましょう。

プロジェクトの実行

zen build runでプロジェクトをビルドして、実行します。

$ zen build run
Zen の道へようこそ。
道案内はこちらからどうぞ:
https://www.zen-lang.org/ja-JP/docs/

おめでとうございます!これでZenでソフトウェアを書く第一歩を踏み出しました!

プログラムをビルドして実行する方法はいくつかあります。zen build runは最もお手軽な方法です。他の方法も試してみましょう。

様々なプロジェクトのビルド、実行方法

zen build runを実行すると、zen-cacheというディレクトリが作成されます。

.
├── build.zen
├── src
└── zen-cache  # ★

2 directories, 1 file

zen-cacheにはビルド時の一時ファイルや、ビルド済みの実行ファイルが含まれています。zen-cache/bin/helloに実行ファイルが格納されており、直接この実行ファイルを実行することができます。

ノート: 実行ファイル名は、デフォルトでは作業ディレクトリ名であるため、ディレクトリ名をhello以外にした場合、実行ファイル名が異なります。

$ ./zen-cache/bin/hello 
Zen の道へようこそ。
道案内はこちらからどうぞ:
https://www.zen-lang.org/ja-JP/docs/

プログラムを実行せず、ビルドだけすることもできます。

$ zen build

zen buildコマンドは、Zenのビルドスクリプトであるbuild.zenを実行します。Zenコンパイラを直接利用して、プログラムをビルドする場合は、次のようになります。

$ zen build-exe src/main.zen
$ ./main 
Zen の道へようこそ。
道案内はこちらからどうぞ:
https://www.zen-lang.org/ja-JP/docs/

ソースファイルの内容

それでは、サンプルプロジェクトのソースファイルsrc/main.zenの内容を、少し詳しく見ていきましょう。

examples/hello/src/main.zen

const std = @import("std");

pub fn main() anyerror!void {
    std.debug.warn("Zen の道へようこそ。\n道案内はこちらからどうぞ:\nhttps://www.zen-lang.org/ja-JP/docs/\n", .{});
}

1行目は、Zenの標準ライブラリをインポートしています。

const std = @import("std");

標準ライブラリには、入出力、コレクション、暗号などのモジュールが含まれています。標準ライブラリをconst変数stdにインポートすることで、std.xxxという構文で標準ライブラリ機能が利用できます。

3行目は、関数の宣言です。

pub fn main() anyerror!void {

pubmain関数が外部からアクセス可能であることを意味します。fnは関数であることを示すキーワードです。mainは関数名で、()内には関数の引数を書くことができます (今回は引数なしです) 。anyerror!voidは戻り値の型です。main関数は、何らかのエラーを返すか、戻り値がない (void) ことを意味しています。Zenでは、戻り値の型を省略することができません。これは、戻り値の型がvoidであっても同様です。

{ }が関数の本体です。4行目で、文字をコンソールに表示します。

    std.debug.warn("Zen の道へようこそ。\n道案内はこちらからどうぞ:\nhttps://www.zen-lang.org/ja-JP/docs/\n", .{});

std.debug.warnは、コンソールに文字を出力する標準ライブラリの関数です。()内の文字列"..."標準エラーに出力します。std.debug.warnは、ベースとなるフォーマット文字列と、1つの無名構造体リテラルを引数に取ります。今回無名構造体リテラルは空 (.{}) です。std.debug.warnは改行文字を自動で挿入しないため、文字列の最後に改行文字\nを入れています。

標準出力でのHello World

これまで見てきたサンプルプログラムでは、文字列を標準エラーに出力していました。Zenで標準出力 (stdout) に文字を出力するプログラムは、次のようになります。

examples/hello_stdout/src/main.zen

const std = @import("std");

pub fn main() anyerror!void {
    // 標準出力を取得できない環境では、エラーが発生してプログラムが停止します。
    const stdout = try std.fs.getStdOut();
    // 標準出力への表示に失敗すると、エラーが発生してプログラムが停止します。
    _ = try stdout.write("Hello, world!\n");
}

tryについては後の章で詳しく説明しますが、エラーが発生した場合にmain関数から戻るためのキーワードです。Zenで標準出力に文字列を出力するには、まず、標準ライブラリ関数であるstd.io.getStdOut()によって標準出力を取得できるかどうかを試し、その上で標準出力に文字列を書き込みます。これはZenが、プログラムが実行される環境に対していかなる前提も置かないためです。今回の例では、プログラムがOS上で動作することを前提としていないため、まず、標準出力を取得できるかどうか、から試しています。

上記の内容で、main.zenを作成し、次のコマンドを実行することで、Hello Worldプログラムを実行することができます。

$ zen build-exe main.zen
$ ./main
Hello, world!

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.