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

用語集

アサーション [assertion]

ある条件が必ず成り立つことを示すためにソースコード中に書かれる論理式のこと。 Zen では std.debug.assert を利用して書く。

例えば、ある割り算において除数 divisor がゼロでないことを示すために、 std.debug.assert(divisor != 0) というアサーションを 割り算の直前に書くことができる。

参照: 5章 アサーション

アライメント [alignment]

メモリ上に存在するデータの先頭番地が、データサイズの倍数である状態のこと。

近年の 32 ビットCPUでは、データを 32 ビット (=4バイト) 単位でアクセスする場合に、 データが 1000番地・1004番地・1008番地…… といった 4 バイト境界から始まるよう配置してあるとアクセス性能が良くなる場合が多い。 Zen では例えば、 var x: u32 align(4) = 0 と変数を宣言すると、 変数がメモリ上で4バイト境界から配置されるよう指定できる。

安全性保護付き未定義動作 [undefined behavior with safe guard]

一般に未定義動作とは、プログラムがどのような挙動を取るか分からない状態のこと。 C言語等では、配列の範囲外のアクセス、符号付き整数の演算のオーバーフロー、 0番地のアクセスといったバグにより未定義動作となる。 プログラムがこの状態に陥ると、すぐにクラッシュし異常終了すれば分かりやすいが、 一見正常動作しているように見えて実は不正な動作を行っているという場合もある。

Zen では未定義動作に対する安全性保護の機構があり、この機構が有効な場合、 未定義動作になるとパニック機構が働くと定められている。

参照: 11章 未定義動作

アンラップ [unwrapping]

オプション型 ?T やエラー共用体 SomeError!T の値から T 型の値を取り出すこと。 値が null やエラーである場合を考慮する必要があるため、 エラー処理と密接に関わる処理である。

イミュータブル [immutable]

イミュータブルな変数とは、初期化された後は値を変更できない変数のこと。

インタフェース [interface]

複数の種類の構造体を同じ操作で扱えるようにするため、 それらが共通して持つメソッドやフィールドをまとめて宣言したもの。

参照: 6章 インタフェース

インデックス [index]

配列の個々の要素にアクセスする際に、配列の何番目の要素かを指定する数のこと。 添字 (そえじ) とも言う。

ヴァリアント [variant]

共用体 (union) のメンバーである個々の型のこと。

エラー共用体 [error union]

通常の値またはエラー型の値のどちらか、という意味を表す型のこと。 エラーを起こす可能性のある関数の戻り値の型として多用される。

参照: 3章 エラー型 エラー共用体

ABI [ABI: application binary interface]

複数のプログラム・モジュール間のバイナリレベルのインタフェイスのこと。 中でも特に、ユーザが実行するプログラムと、OSやライブラリとの間のものを指す。

「呼出規約」は、ABI の一部である。 これはユーザプログラムからライブラリ中の関数を呼び出す際の 引数や戻り値の受け渡し方法などを定めたものである。

C言語で使われる ABI を通称「C ABI」という。 C言語で作成したライブラリを他言語から呼び出して利用する場合、 呼ぶ側が C ABI の呼出規約に合わせた方法で呼ぶ必要がある。 Zen から呼ぶ場合は、ライブラリにある関数を宣言する際に、 extern 修飾子を付けるか又は callconv を指定する。

参照: 14章 Cとのインタフェース、4章 関数 呼出規約

LLVM [LLVM]

LLVM コンパイラ基盤は、コンパイラを開発するためのコード生成器や関連ツールを 開発するプロジェクトの1つである。 Zen 言語処理系は、LLVM をバックエンドとして利用している。

参照: The LLVM Compiler Infrastructure

オプション型 [optional type]

オプション型は、ある型 T の値、 または「値がない」ことを示す null という値を取る型である。 ?T と表記する。

参照: 3章 オプション型

組込み関数 [builtin function]

コンパイラが提供し、ユーザプログラム内で利用できる関数のこと。 関数名の最初に @ が付く。 内容は、型変換やビット操作など、低レベルのものが多い。

参照: 7章 組込み関数

コンパイル時計算可能 [computable in compile time]

comptime の項を参照。

comptime [comptime]

Zen 言語の予約語の1つ。ある式の評価 (結果を計算すること) がプログラムを実行するまでもなく コンパイル時に可能である場合に、実際に計算してしまうよう指示するもの。

参照: 12章 comptime

C ABI [C ABI]

ABI の項を参照。

シグネチャ [signature]

関数やメソッドを呼び出す際に必要な、それらを特定する情報のこと。 Zen では、属する名前空間、関数 (メソッド) 名、引数の個数と個々の型と順番、 返り値の型などから成る。

終端値付き配列 [array with sentinel value]

配列の一種で、本来の要素データの並びの後に 終端値あるいは番兵 [sentinel] と呼ばれる特別なデータを置くことによって、 配列の要素数を示したもの。 C言語の文字列リテラルはその代表例の一つである。

Zen では、指定した終端値を持つ配列を型として扱える。 例えば文字列定数 "hello" は、const [5:0]u8 という型の値であり、 o の次の位置にヌル文字 0 が終端値として格納されている。 終端値は配列の要素数に含まれない点に注意すること。

参照: 2章 配列 終端値付き配列

スライス [slice]

配列のある範囲を表現する型。 配列の要素の型が T であるとき、そのスライスの型は []T と表す。 スライスは配列に比べ、要素数が実行時に決まるという柔軟性があり、 実際のソース中では配列よりも多用される。

参照: 2章 スライス

ターゲット環境 [target environment]

プログラムをコンパイルして生成した実行ファイルが動作する環境のこと。

ターゲット環境は、コンパイル自体を行う環境とは異なる場合がある。 例えば、x86_64 アーキテクチャの CPU を持ち Linux や Windows が動作する一般的なパソコンで、 RISC-V や ARM プロセッサを持つシングルボードコンピュータで 動作させるためのプログラムをコンパイルする、 といった行為は組込みソフトウェア開発では一般的である。 このような行為はクロスコンパイルと呼ばれる。

Zen は、クロスコンパイルのサポートを特長の一つとしており、 ターゲット環境を <アーキテクチャ>-<OS>-<ABI> の3情報の組として表す。

参照: 10章 ビルドオプション

タグ付き共用体 [tagged union]

型の一種で、列挙型 (enum) と共用体 (union) を組み合わせたもの。 通常の共用体と比べ、ヴァリアントの場合分けを switch で行える等の利点がある。

参照: 3章 タグ付き共用体

テストフレームワーク [test framework]

テスト (特に単体テスト) を記述するためのガイドライン、 およびそれを自動実行する機構のこと。 Zen では、ソースコードと同じファイルにテストブロックを記述でき、 zen test コマンドでこれを実行する。

参照: 5章 ユニットテスト

テストランナー [test runner]

テスト実行時に、 ソースファイルに記述された多数のテストブロックを順番に実行していく機構のこと。 Zen では、テストランナーがデフォルトで用意されているが、 必要に応じてカスタマイズしたものを使うこともできる。

参照: 5章 カスタムテストランナー

パニック [panic]

実行中のプログラムが配列の範囲外アクセス等の未定義動作を起こそうとした時に、 プログラムの異常終了を安全に行う仕組みのこと。

参照: 11章 未定義動作

ビルドスクリプト [build script]

Zen 処理系に対して、ソースファイル (群) から実行ファイルを生成する 手順を指示するスクリプトのこと。 C言語等では makeCMake といった外部ツールを使うのが一般的であり、 それら独自の記述方法や使い方を憶えなければならないが、 Zen では処理系自体にビルドの仕組みがあり、スクリプトの記述も Zen 言語で行う。

参照: 10章 ビルドスクリプト

ブール型 [Boolean type]

真偽値 (真 true または偽 false) を表す型。論理型ともいう。 Zen 言語では bool 型がこれに当たる。

参照: 2章 ブール型

フォーマット文字列 [format string]

様々な値を組み合わせて一つの文字列を作る際に、雛形となる文字列のこと。

Zen の標準ライブラリでは、フォーマット文字列中の {} に囲まれた部分が 別の値で置換される。例えば、 std.debug.warn("Hello, {}!", .{"world"}); は画面に Hello, world! を出力する。

参照: 13章 文字列のフォーマット

未定義動作 [undefined behavior]

安全性保護付き未定義動作 の項を参照。

ミュータビリティ [mutability]

変数等が、初期化された後に変更可能であるかどうかの性質のこと。

無名構造体 [anonymous struct]

名前のない構造体型のこと。

ジェネリック構造体の型は、実行時に決まるため名前を付けることができないので、 無名構造体として扱う。

参照: 6章 ジェネリクス ジェネリック構造体

無名構造体リテラル [anonymous struct literal]

無名構造体の値をソース中に直接記述したもの。 フォーマット文字列の置換データを与える際などに使用される。

参照: 3章 構造体

呼出規約 [calling convention]

ABI の項を参照。

ラップアラウンド [wrap around]

ある整数型の表せる範囲の最大値より大きな値 (または最小値より小さな値) を 表そうとした時に、CPU や演算命令によってはビット表現で上位ビットの結果を捨て、 下位ビットのみ正しい結果を表すという挙動を取るものがある。 このような挙動をラップアラウンドという。

Zen では、通常の四則演算などの結果が型の表現できる範囲を超え オーバーフローした場合は未定義動作となるが、 ラップアラウンド演算子 を用いた場合はラップアラウンド動作が起こり、 オーバーフローとはならない。

参照: 11章 未定義動作

CPU や演算命令によっては、最大値を超えるような値は最大値で示す (最小も同様) という挙動を取るものもあり、これを飽和演算 [saturation arithmetic] という。

ラベル付きブロック [labelled block]

ラベル (名前) を付けることにより、 それをソースコード中で指定できるようになったブロックのこと。 ブロックから値を返す場合や、 入れ子になったブロックの中から脱出する場合などにラベルを用いる。

参照: 4章 分岐 ラベル付きブロック

リテラル [literal]

値をソースコード中に直接書いたもの。

リリースモード [release modes]

コンパイルの際に、デバッグサポートの有無や最適化の方針や安全性チェックの有無を 指定するモードのこと。

参照: 10章 ビルドオプション

リンクセクション [link section]

プログラム起動時に変数や関数がメモリ上で配置されるセクションのこと。 Zen では、変数や関数の定義でセクションを指定できる。

参照: 2章 変数と定数, 4章 関数 関数の定義

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.