Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第25章 ソースからバイトコードへ

この章の目的

本章の終わりまでに、あなたは keleusma run がこれまでずっと行ってきたことを理解し、プログラムを直接実行できるファイルへとコンパイルできるようになります。

ソースとバイトコード

.kel ファイルはソース、すなわち人が書き読むテキストを保持します。仮想マシンはソースを実行しません。仮想マシンは、コンパイラがソースから生成したコンパクトな形式であるバイトコードを実行します。本ガイドで keleusma run が使われるたびに、それは静かに四つのステップを順に行ってきました。すなわちソースを読み、それをバイトコードにコンパイルし、バイトコードを検証し、実行するというものです。

これらのステップは分離できます。コンパイルは事前に一度だけ行い、その結果を保存できます。

事前コンパイル

小さなプログラムを書き、tune.kel として保存します。

fn main() -> Word { 60 + 7 }

それをコンパイルします。

keleusma compile tune.kel -o tune.kel.bin

ツールは次を出力します。

wrote tune.kel.bin (2400 bytes)

tune.kel.bin はコンパイルされたバイトコードです。これを直接実行します。

keleusma run tune.kel.bin

出力は 67 です。ツールはこのファイルをバイトコードとして認識し、コンパイルはすでに行われていたため、コンパイルせずに実行しました。

バイトコードファイルの中身

バイトコードファイルは自己記述的なパッケージです。それは、ランタイムがそれを Keleusma のバイトコードとして認識できるように短いマーカーで始まります。マーカーの後にはプログラムの事実を保持するヘッダが続き、次いでプログラム本体、そして末尾にチェックサムが来ます。ランタイムは何よりも先にヘッダを読み、本物の Keleusma バイトコードでないファイル、あるいは非互換なマシン向けにビルドされたファイルを拒否します。チェックサムにより、保管中または転送中に破損したファイルを検出できます。

初学者はバイト単位のレイアウトを知る必要はありません。要点は、バイトコードファイルはその命令が一つでも実行される前に、ランタイムによって検査されるということです。

コンパイル済みファイルはシバンを持てる

第2章では、macOS と Linux においてソースファイルにシバン行を追加しました。コンパイル済みバイトコードファイルもシバンを持てるため、完成しコンパイルされたプログラムを、同じ方法で直接実行可能にできます。

なぜ事前にコンパイルするのか

一度コンパイルしてバイトコードを配布することには二つの利点があります。プログラムを実行するマシンはコンパイラを必要とせず、ランタイムのみを必要とします。そしてプログラムは、先立つコンパイルステップなしに即座に開始します。バイトコードは、演奏者に手渡す準備が整った、完成し刻み込まれた楽譜であり、ソースである作業中の手稿とは区別されます。

ターゲットの選択

既定のコンパイルは、コンパイラを実行しているのと同じマシンをターゲットとします。異なるマシン向けのバイトコード成果物をビルドするには --target を渡します。

keleusma compile tune.kel --target embedded_16 -o tune.kel.bin

認識されるターゲット名は host(既定)、wasm32embedded_32embedded_16embedded_8 です。選択されたターゲットはワード、アドレス、浮動小数点の幅を制御し、その構成に対してプログラムを検証します。ターゲットの表現可能な範囲外のリテラルまたは定数を使用するプログラムは、コンパイル時に拒否されます。

この章のまとめ

  • ソースはあなたが書くテキストであり、バイトコードはランタイムが実行するコンパクトな形式です。
  • keleusma run は一つのステップでコンパイルと実行を行い、keleusma compile は後で実行できるバイトコードファイルを生成します。
  • バイトコードファイルは自己記述的でバージョン検査され、チェックサムによって保護されています。
  • 事前コンパイルは、実行するマシンがランタイムのみを必要とし、プログラムが即座に開始することを意味します。

ランタイムが実行する個々の命令をご覧になりたい場合、Instruction Set リファレンスがすべてのオペコードを、そのオペランド、コスト、および時間予算とメモリ予算への影響とともに一覧します。プレイグラウンドは、あなたが書いた任意のプログラムについて同じ逆アセンブルを表示します。

次章では、完成したプログラムに起こり得るさらに二つのこと、すなわち署名できることと差し替えできることを取り扱います。