プログラムの実行

この章では、#Script プログラムを実行する際の規則を定める。

この仕様書での表記規則

実行環境がプログラムを実行する際の具体的な処理の手順は、各々の手順が一度 実行されるたびに、その結果をもたらす。結果は、一個の結果型のデータである。

この仕様書において処理の手順を示す際に、X を返すという表記をすることがある。これは、現在行っている処理をその時点で終了し、 結果として X をもたらすという意味である。

この仕様書では、結果型のデータを二重括弧を用いて [[エラー: a]] のように表す。ここで、コロン記号の前にある部分は結果型の種類を表しており、 コロン記号の後にあるのは結果型の値である。 また、結果型の種類が正常終了である場合は、種類を省略して、[[a]] のように値のみを記す。

この仕様書において処理の手順を示す際に、X を投げるという表記をすることがある。これは、[[エラー: X]] を返すと言う意味である。

この仕様書において処理の手順を示す際に、……してもよいという表記を することがある。これは、実行環境はその裁量によって、その動作を行っても良いし、 あるいはその動作を行わずに次の手順に進んでも良いという意味である。

実行環境

#Script は、実行環境によって実行する。実行環境とは、#Script ソースコードを入力として受け取り、この仕様書の定義に従って #Script プログラムを実行する任意の存在である。

一つの実行環境は、それ自身が独立した存在である。ある実行環境の存在や状態が、 他の実行環境の存在や状態や動作に影響を与えることはない。 特に、ある実行環境で扱われているオブジェクトやデータの内容が 他の実行環境の動作に影響することはない。

以下に、実行環境がスクリプトプログラムを実行する方法を定める。

実行環境の起動

実行環境が新しく作られることを、実行環境の起動という。

実行環境が起動されると、新しい基底実行コンテクストが作られる。基底実行コンテクストが正しく作られたならば、 ソースコードの解釈と実行に移る。

ソースコードの解釈と実行には、対話形式のものとバッチ形式のものとの二種類がある。実行環境は、二つのどちらかの形式により ソースコードを解釈・実行する。

対話形式のソースコードの解釈と実行

対話形式の解釈と実行では、 ソースコードカウントという特別な整数値を使用する。

実行環境は、ソースコードカウントの値を 1 とした後、 任意の個数のソースコードを入力として順次受け取る。 一つのソースコードを受け取るごとに、 直ちに以下の手順でソースコードを処理する:

  1. ソースコードを、CommandCode を開始表現として解析する。解析において文法エラーがあった場合は、 その旨を出力してこのソースコードに対する処理を中止し、 次のソースコードの処理に移る。
  2. 解析が文法エラーなく完了したら、CommandCode に定められた処理を実行し、その結果を r とする。
  3. r が正常終了ならば、更に以下の処理を行う:
    1. ソースコードカウントの値を、0 から 9 までの数字のみによる十進位取り記数法で表したものに変換し、それを N とする。このとき、N の最も左側の桁は 0 であってはならない。
    2. 記号 $ の後に N をつなげてできる Unicode 文字列を名前とするメンバを、組込み変数領域に作成する。そして、r の値をこのメンバの値とする。 (既にこのようなメンバ名のメンバが存在する場合は、単にそのメンバの値を r の値に変更する)
    3. 記号 $ のみからなる Unicode 文字列を名前とするメンバを、組込み変数領域に作成する。そして、r の値をこのメンバの値とする。 (既にこのようなメンバ名のメンバが存在する場合は、単にそのメンバの値を r の値に変更する)
  4. r の内容を、実行環境が定める方法により出力する。
  5. ソースコードカウントの値を 1 増やす。

バッチ形式のソースコードの解釈と実行

実行環境は、任意の個数のソースコードを入力として受け取る。 受け取ったソースコードは、順番に一つづつ以下の手順で処理する:

  1. ソースコードを、StatementCode を開始表現として解析する。 解析において文法エラーがあった場合は、このソースコードに対する処理を中止し、 次のソースコードの処理に移るか、または実行環境全体を終了する。
  2. 解析が文法エラーなく完了したら、StatementCode に定められた処理を実行し、その結果を実行環境が定める方法により出力する。

開始表現

#Script の構文解析における開始表現には、CommandCode と StatementCode の二種類がある。

CommandCode
D Commands EOC
StatementCode
D Statements EOC

CommandCode の実行は、それに含まれる Commands を実行し、その結果を返す。

StatementCode の実行は、それに含まれる Statements を実行し、その結果を返す。

スレッド

この版の #Script では、全ての処理は 単一のスレッドにおいて処理することを前提に定義する。 一つの実行コンテクストやオブジェクトを 複数のスレッドで同時に使用した場合の実行結果は未定義である。

処理の最適化

この仕様書で定義する処理の手順は、 実行環境の振る舞いを定義するための形式的な手順である。 実行環境は、この仕様書で定めるものと同じ入出力結果が得られる限り、 処理をより効率的にするために、 この仕様書で示した手順とは異なる手順を実行することが出来る。

エラーの発生

スクリプトの実行中にメモリ不足などの原因によりスクリプトの正常な実行を 続けることができなくなった場合を、エラーという。 エラーが発生したときは、 実行環境は適切なエラーメッセージを出力してスクリプトの実行を中止するか、 または本来の処理の結果を返す代わりにそのエラーに対応する適切な種類の新しいエラーオブジェクトを投げることでスクリプトの実行を継続することができる。 (一部の状況においては、どのエラー型オブジェクトのインスタンスを投げるかが この仕様書の中で定められている)

実装上の注意: 実行環境は、エラーが発生した時でも、 可能な限りエラー型オブジェクトのインスタンスを投げることで スクリプトの実行を続けるのが望ましい。

組込みオブジェクトの置換えによる動作への影響

スクリプトの実行における処理の手順が組込みオブジェクトやそのメンバを参照している場合において、 その処理を行う時点で当該オブジェクトがもともと基底実行コンテクストが 作られたときのものとは異なるものに変更されているならば、実行環境は次の二つのうち どちらかを選択することができる:

ただし、処理手順の定義において組込みオブジェクト (のメンバ) を指し示す際に初期の……と書いてあるならば、必ず前者の方法を選択しなければならず、現在の……と書いてあるならば、必ず後者の方法を選択しなければならない。

後者の方法を選択した場合に、処理を続けるための前提条件が満たされていなければ (例えば、組込みオブジェクトが置き換えられたために処理手順に示した変数が 存在していなかったり、関数として呼出し可能な組込みオブジェクトが呼出し不可能な オブジェクトに置き換えられていたりした場合)、エラーとする。

また、組込みオブジェクトが関数として呼出されたときの動作は、 別途禁止されていない限り、他の組込みオブジェクトに依存していても良い。 依存しているオブジェクトがスクリプトの実行により変更・削除された場合、 呼出しの際の挙動が変わったりエラーになったりしても良い。

実装上の注意: とはいえ、通常のスクリプトの実行において 利便・実用性を損なわぬよう、無理な依存を行わないことが望まれる。

メソッド呼出しにおける @this 値

この仕様書において、メソッドが関数として呼出されたときの動作を規定するとき、特に明示しない限り、 関数呼出しにおける @this 値はそのメソッドを取得するために行われた get-property での参照先オブジェクトと 同じオブジェクトであると見なす。もし実際の呼出しにおいて これら二つのオブジェクトが異なっていれば、 (そのような場合の動作が明示的に規定されている場合を除いて) 動作は未定義である。

© 2006-2007 Magicant