2024年12月26日くいなちゃん


プログラミング言語Kuin」の言語仕様11、コンパイラとIDEについてです。

1Kuinコンパイラ

Kuinコンパイラには、エディタやデバッガとセットになっている「kuin.exe」と、コマンドライン上でコンパイルできる「kuincl.exe」が用意されています。

2kuincl.exeのコンパイルオプション

kuincl.exeのコンパイルオプションは表2-1の通りです。
表2-1: kuincl.exeのコンパイルオプション
コンパイルオプション 説明 省略時の挙動
-i ファイル コンパイルする.knファイルを指定 使い方を示すヘルプを表示
-o ファイル 出力する.exeファイルを指定 -iで指定した.knファイルと同じディレクトリにout.exeを生成
-s ディレクトリ システムディレクトリを指定 コンパイラが存在するディレクトリ/sys/
-c ファイル アイコンに設定する.icoファイルを指定 デフォルトアイコン
-p ディレクトリ リソースディレクトリ(/res/)の位置を指定 -iで指定した.knファイルと同じディレクトリ
-f ディレクトリ 関連ファイルが書かれたテキストファイルを指定 特になし
-e 実行環境 実行環境を指定 exe(Windows用実行ファイル)
-x 追加オプション 実行環境ごとに定められた追加オプション 特になし
-r リリースビルドを行う デバッグビルド
-h 使い方を示すヘルプを表示 特になし
-v コンパイラのバージョンを表示 特になし
-q エラーと警告以外の出力を抑制する 特になし
いずれのオプションも省略可能です。 それぞれコンパイルオプションについて、以下で詳しく説明します。

2.1-i



「input」の頭文字です。 main関数が存在する.knファイルを指定します。

2.2-o



「output」の頭文字です。 出力する実行ファイルを指定します。 省略すると、-iで指定した.knファイルと同じディレクトリに、「out.exe」という名前で生成されます。

2.3-s



「system」の頭文字です。 システムディレクトリを指定します。 通常は省略して問題ありません。

2.4-c



「icon」の2文字目です。 .icoファイルを指定すると、実行ファイルやウインドウアイコンなどにそのアイコンが使われるようになります。 省略するとKuinが用意するデフォルトアイコンが設定されます。

2.5-p



「pack」の頭文字です。 リソースディレクトリ(/res/)の位置を指定します。 省略すると、-iで指定した.knファイルと同じディレクトリに「/res/」が存在するものとみなされます。

2.6-f



「files」の頭文字です。 出力先ディレクトリ内にコピーする関連ファイルが書かれたテキストファイルを指定します。
テキストファイルの中身は、1行ずつ「コピー元ファイルのフルパス」「コピー先ファイルの出力先ディレクトリからの相対パス」を繰り返して書きます。

2.7-e



「environment」の頭文字です。 表2-2で示す実行環境を指定します。 省略すると「-e exe」とみなされます。
表2-2: 実行環境
コンパイルオプション 実行環境
-e exe Windows用の実行ファイルを生成する
-e cpp C++用のソースコードを生成する
-e web Webブラウザで実行できるHTMLとJavaScriptを生成する
指定した値は、プログラム中で「env("e")」を使って[]char型で参照できます。 例えば「-e exe」と指定した場合、プログラム中に「env("e")」と書くと「"exe"」の値が定数として取得できます。

2.8-x



「extra」の頭文字です。 -eで指定される実行環境ごとに定められた追加オプションを指定します。 複数指定できます(表2-3)。
表2-3: 追加オプション
-eの指定 コンパイルオプション 説明
任意 -x binary (実装中の機能につき使用禁止)
任意 -x hint Kuin Editor用にヒント情報を生成する(上級者向け機能)
exe -x dbgbreak デバッガがアタッチしやすいように、プログラム起動直後にメッセージボックスを出したのちブレークポイント例外(INT3)を発生させる
exe -x pause 「-x wnd」を指定しないときのみ有効。 プログラム終了時に「pause」コマンドを実行する(上級者向け機能)
exe -x wnd ウインドウアプリにする。 省略するとコンソールアプリになる
cpp -x lib エントリーポイントをライブラリ用として生成する
cpp -x nogc ガーベージコレクション(GC)を無効化し、確保したヒープはプログラム終了時に一括解放する
cpp -x nogcdb 「-x nogc」を指定したときのみ有効。 ヒープをダブルバッファリングする(上級者向け機能)
web -x merge 生成するHTMLとJavaScriptを、1つのHTMLにマージして出力する
web -x static JavaScriptを即時実行せず、外部からの呼び出しで実行できるようにする
コンパイルオプションはユーザが自由に作成することができます。 指定した値は、プログラム中で「env()」を使って[]char型で参照できます。 例えば「-x option」と指定した場合、プログラム中に「env("option")」と書くと「"true"」の値が定数として取得できます。 このようにオプションが定義されていれば「"true"」が返り、定義されていなければ空文字列「""」が返ります。
「-x option=abc」のようにコンパイルオプションの値を指定することもできます。 この場合、プログラム中に「env("option")」と書くと「"abc"」の値が定数として取得できます。

2.9-r



「release」の頭文字です。 このオプションを指定するとリリースビルドされ、省略するとデバッグビルドされます。
指定した値は、プログラム中で「dbg」定数としてbool型で参照できます。 「-r」を指定した場合、プログラム中に「dbg」と書くと「false」の値が取得できます。 「-r」を指定しなかった場合、「dbg」は「true」になります。

2.10-h



「help」の頭文字です。 このオプションを指定するとkuincl.exeの使い方が表示されます。

2.11-v



「version」の頭文字です。 このオプションを指定するとコンパイラのバージョンが表示されます。

2.12-q



「quiet」の頭文字です。 このオプションを指定するとエラーと警告以外の出力を抑制します。 処理が成功したときにはログに何も出力したくない場合に指定します。

3コンパイル時の仕様

以下にKuinのコンパイル時の仕様をまとめます。

3.1入力ファイルの特殊な仕様



コンパイルするファイルの特殊な仕様は図3-1の通りです。
  • 指定した.kn内に1文字も存在しなかった場合は「Hello, world!」を出力するプログラムになる。
  • 指定した.kn内に「q」の1文字だけ書かれていた場合は「q」を出力するQuineプログラム(自身のソースコードを出力するプログラム)になる。
  • 指定した.kn内に「f」の1文字だけ書かれていた場合は「Fizz Buzz」プログラムになる。
  • 指定した.kn内に「9」の1文字だけ書かれていた場合は童謡「99 Bottles of Beer」の歌詞を出力するプログラムになる。
  • これらには、ファイルの末尾に改行を1つ加えることも許容される。 しかしそれ以上の改行やスペースなど他の文字を含めてはならない。
図3-1: 入力ファイルの特殊な仕様
設計の理由

これらのプログラムは他のプログラムに比べてとても頻繁に書かれるため、Kuinコンパイラはその需要に応えるべきだと考えました。

3.2デバッグビルドとリリースビルドの違い



デバッグビルドとリリースビルドの違いは表3-1の通りです。
表3-1: デバッグビルドとリリースビルドの違い
項目 デバッグビルド リリースビルド
用途 開発時に日常的に使う 完成時に1回だけ使う
最適化 最適化せず、コンパイル速度を優先 最適化し、実行速度を優先
リソースデータの暗号パック化 なし 暗号パック化
dbg定数の値 dbgは「true」となる dbgは「false」となる
assert 実行時にアサーションチェックする assert文を削除
配列の範囲外アクセスチェック 範囲外アクセスで例外を発生させる 範囲外アクセスをチェックしない
その他、標準ライブラリや組み込み関数が生成する多くの例外は、リリースビルド時には生成されません。
一般に開発時はコンパイルが高速なデバッグビルドで入念に検証し、完成時にはリリースビルドで配布用のファイルを生成する流れで開発します。

3.3実行環境の詳細



コンパイラが生成した実行ファイルが動作する環境は表3-2の通りです。
表3-2: 実行環境の詳細
実行環境 詳細
-e exe -x wnd Windows 7以降(Windows 10など)の64bit環境で動作する、グラフィックス機能等を活用したウインドウアプリ
-e exe Windows 7以降(Windows 10など)の64bit環境で動作する、コマンドプロンプト上で動作するコンソールアプリ
-e cpp Visual C++、g++、clang++などでビルド可能な、C++ソースコード
-e web Chrome、Firefox、Edge、Internet Explorer 11などのWebブラウザ上で動作する、HTMLとJavaScriptソースコード
1735211706jaf