この章では、#Script プログラムを実行する際の規則を定める。
実行環境がプログラムを実行する際の具体的な処理の手順は、各々の手順が一度 実行されるたびに、その結果をもたらす。結果は、一個の結果型のデータである。
この仕様書において処理の手順を示す際に、X を返す
という表記をすることがある。これは、現在行っている処理をその時点で終了し、
結果として X をもたらす
という意味である。
この仕様書では、結果型のデータを二重括弧を用いて [[エラー: a]] のように表す。ここで、コロン記号の前にある部分は結果型の種類を表しており、 コロン記号の後にあるのは結果型の値である。 また、結果型の種類が正常終了である場合は、種類を省略して、[[a]] のように値のみを記す。
この仕様書において処理の手順を示す際に、X を投げる
という表記をすることがある。これは、[[エラー: X]]
を返す
と言う意味である。
この仕様書において処理の手順を示す際に、……してもよい
という表記を
することがある。これは、実行環境はその裁量によって、その動作を行っても良いし、
あるいはその動作を行わずに次の手順に進んでも良いという意味である。
#Script は、実行環境によって実行する。実行環境とは、#Script ソースコードを入力として受け取り、この仕様書の定義に従って #Script プログラムを実行する任意の存在である。
一つの実行環境は、それ自身が独立した存在である。ある実行環境の存在や状態が、 他の実行環境の存在や状態や動作に影響を与えることはない。 特に、ある実行環境で扱われているオブジェクトやデータの内容が 他の実行環境の動作に影響することはない。
以下に、実行環境がスクリプトプログラムを実行する方法を定める。
実行環境が新しく作られることを、実行環境の起動という。
実行環境が起動されると、新しい基底実行コンテクストが作られる。基底実行コンテクストが正しく作られたならば、 ソースコードの解釈と実行に移る。
ソースコードの解釈と実行には、対話形式のものとバッチ形式のものとの二種類がある。実行環境は、二つのどちらかの形式により ソースコードを解釈・実行する。
対話形式の解釈と実行では、 ソースコードカウントという特別な整数値を使用する。
実行環境は、ソースコードカウントの値を 1 とした後、 任意の個数のソースコードを入力として順次受け取る。 一つのソースコードを受け取るごとに、 直ちに以下の手順でソースコードを処理する:
0
から 9
までの数字のみによる十進位取り記数法で表したものに変換し、それを N
とする。このとき、N の最も左側の桁は 0
であってはならない。$
の後に N をつなげてできる Unicode
文字列を名前とするメンバを、組込み変数領域に作成する。そして、r の値をこのメンバの値とする。
(既にこのようなメンバ名のメンバが存在する場合は、単にそのメンバの値を
r の値に変更する)$
のみからなる Unicode 文字列を名前とするメンバを、組込み変数領域に作成する。そして、r
の値をこのメンバの値とする。
(既にこのようなメンバ名のメンバが存在する場合は、単にそのメンバの値を
r の値に変更する)実行環境は、任意の個数のソースコードを入力として受け取る。 受け取ったソースコードは、順番に一つづつ以下の手順で処理する:
#Script の構文解析における開始表現には、CommandCode と StatementCode の二種類がある。
CommandCode の実行は、それに含まれる Commands を実行し、その結果を返す。
StatementCode の実行は、それに含まれる Statements を実行し、その結果を返す。
この版の #Script では、全ての処理は 単一のスレッドにおいて処理することを前提に定義する。 一つの実行コンテクストやオブジェクトを 複数のスレッドで同時に使用した場合の実行結果は未定義である。
この仕様書で定義する処理の手順は、 実行環境の振る舞いを定義するための形式的な手順である。 実行環境は、この仕様書で定めるものと同じ入出力結果が得られる限り、 処理をより効率的にするために、 この仕様書で示した手順とは異なる手順を実行することが出来る。
スクリプトの実行中にメモリ不足などの原因によりスクリプトの正常な実行を 続けることができなくなった場合を、エラーという。 エラーが発生したときは、 実行環境は適切なエラーメッセージを出力してスクリプトの実行を中止するか、 または本来の処理の結果を返す代わりにそのエラーに対応する適切な種類の新しいエラーオブジェクトを投げることでスクリプトの実行を継続することができる。 (一部の状況においては、どのエラー型オブジェクトのインスタンスを投げるかが この仕様書の中で定められている)
実装上の注意: 実行環境は、エラーが発生した時でも、 可能な限りエラー型オブジェクトのインスタンスを投げることで スクリプトの実行を続けるのが望ましい。
スクリプトの実行における処理の手順が組込みオブジェクトやそのメンバを参照している場合において、 その処理を行う時点で当該オブジェクトがもともと基底実行コンテクストが 作られたときのものとは異なるものに変更されているならば、実行環境は次の二つのうち どちらかを選択することができる:
ただし、処理手順の定義において組込みオブジェクト (のメンバ) を指し示す際に初期の……
と書いてあるならば、必ず前者の方法を選択しなければならず、現在の……
と書いてあるならば、必ず後者の方法を選択しなければならない。
後者の方法を選択した場合に、処理を続けるための前提条件が満たされていなければ (例えば、組込みオブジェクトが置き換えられたために処理手順に示した変数が 存在していなかったり、関数として呼出し可能な組込みオブジェクトが呼出し不可能な オブジェクトに置き換えられていたりした場合)、エラーとする。
また、組込みオブジェクトが関数として呼出されたときの動作は、 別途禁止されていない限り、他の組込みオブジェクトに依存していても良い。 依存しているオブジェクトがスクリプトの実行により変更・削除された場合、 呼出しの際の挙動が変わったりエラーになったりしても良い。
実装上の注意: とはいえ、通常のスクリプトの実行において 利便・実用性を損なわぬよう、無理な依存を行わないことが望まれる。
この仕様書において、メソッドが関数として呼出されたときの動作を規定するとき、特に明示しない限り、 関数呼出しにおける @this 値はそのメソッドを取得するために行われた get-property での参照先オブジェクトと 同じオブジェクトであると見なす。もし実際の呼出しにおいて これら二つのオブジェクトが異なっていれば、 (そのような場合の動作が明示的に規定されている場合を除いて) 動作は未定義である。
© 2006-2007 Magicant