syntactical な解釈と semantical な解釈

例えば代入。

syntactical /構文上では、

AssignmentExpression :
	ConditionalExpression
	LeftHandSideExpression AssignmentOperator AssignmentExpression

LeftHandSideExpression :
	NewExpression
	CallExpression

なので、

new Object() = 1;
(function test(){ return; })() = "test";

とかが有効なってしまう。ちなみに実装によってはこれはシンタックスエラーにならない。

ましかし、これが実際的に有効なわけない。 semantical/意味的?解釈上? には、

11.13.1 Simple Assignment ( = )

The production AssignmentExpression : LeftHandSideExpression = AssignmentExpression is evaluated as follows:
1. Evaluate LeftHandSideExpression.
2. Evaluate AssignmentExpression.
3. Call GetValue(Result(2)).
4. Call PutValue(Result(1), Result(3)).
5. Return Result(3).

なので、 LeftHandSideExpression の式の結果に対し、 PutValue できないといけない。しかし PutValue は、

8.7.2 PutValue (V, W)

1. If Type(V) is not Reference, throw a ReferenceError exception.
2. Call GetBase(V).
3. If Result(2) is null, go to step 6.
4. Call the Put method of Result(2), passing GetPropertyName(V) for the property name and W for the value.
5. Return.
6. Call the Put method for the global object, passing GetPropertyName(V) for the property name and W for the value.
7. Return.

このように、第一引数が内部 Reference 型でないとランタイム時に ReferenceError 例外で終わることになっているので、無効。

syntactical と semantical が少しわかった気がした。

5.2 Algorithm Conventions

The specification often uses a numbered list to specify steps in an algorithm. These algorithms are used to clarify semantics. In practice, there may be more efficient algorithms available to implement a given feature.

ECMAScript 仕様上では、 Algorithm Conventions が semantics を明確にする為に用いられるとあるから、 Algorithm Convention を見たらセマンティックのことだ、セマンティックの具体例が Algorithm Convention だ。この仕様上では。と、考えてしまって大きな間違いはないみたいだ。