by shigemk2

当面は技術的なことしか書かない

第15回 ECMA-262 Edition5.1読書会 まとめ #ecma262

ecma262reading.doorkeeper.jp

第14条 プログラム

Program :
    SourceElementsopt

SourceElements :
    SourceElement
    SourceElements SourceElement

SourceElement :
    Statement
    FunctionDeclaration

1.このProgramのコードは、指定プロローグ (14.1 指定プロローグ)が、 Use Strict 指定を含む当該SourceElementsから成る場合や一部が、 10.1.1を適用した条件から成る場合、strict mode(厳格モード)のコード Programのコードが、strict mode(厳格モード)のコードである場合、SourceElementsは、strict mode(厳格モード)のコードのように次のステップ内で評価され、それ以外は、SourceElementsは、非strict mode(厳格モード)のコードのように次のステップ内で評価される 2. SourceElementsが、存在しない場合には、return (normal, empty, empty) 3. progCxt は、 10.4.1で説明したようにグローバルコードにおける新たな実行コンテキストとする 4. result は、SourceElementsを評価した結果とする 5.実行コンテキスト progCxt を抜ける 6. resultを返す

optionalなのでプログラムは書かれていなくてもいい

gist.github.com

SourceElements : SourceElements SourceElement
  1. headResult は、SourceElementsを評価した結果とする
  2. headResult が、中途完了(an abrupt completion)である場合、 headResultを返す
  3. tailResult は、SourceElementを評価した結果とする
  4. tailResult.value が、 emptyである場合、 V = headResult.value とし、それ以外の場合、 V = tailResult.valueとする
  5. return (tailResult.type, V, tailResult.target)
SE1;SE2;SE3;SE4;
----------- ---
head        tail
------- ---
head    tail
--- ---
head tail

いろいろ書かれていはいるが、ソースコードを上から読んでいって、評価結果を言語処理系に渡している。 (仕様書に書かれてはいないが)上記のような再帰で

SourceElement : Statement
  • Statementを評価した結果を返す
SourceElement : FunctionDeclaration
  • return (normal, empty, empty)
  • 関数定義しただけだったら、emptyを言語処理系に渡す
  • 宣言しただけだったらプログラムに何の影響も与えない
  • 関数を呼び出して初めて関数宣言が意味をなす
  • ただし関数リテラルの形で書かれていたら、代入自体がstatementになるので、そのまま評価される
  • 関数が宣言されていても呼ばれなければ存在しないのと一緒(ので、minifyツールなどで呼ばれていない関数を消すことは出来る)
function a() {
  var a = 1;
}

呼び出したらエラーになるような関数を定義していても呼び出さなければエラーにならない(実行可能かどうかは呼び出さなければわからない) gist.github.com

でも、構文として形式的に正しいかどうかは見ている。形式がおかしかったらエラーになる。

ただし、構文パースで問題ないことと、実行時にエラーになることはまた話が違うが、構文エラーにもならず実行時にもエラーにならないものはインタプリタはエラーは吐かない(consoleに警告を出すことはあるかもしれない) gist.github.com

これもおーけー。ただし、AltJSによってはコンパイル不可能な可能性はある。

gist.github.com

www.webzoit.net

14.1 Directive Prologue と Use Strict Directive

Program (プログラム)や FunctionBody (関数本体)の最初の SourceElement (ソース要素)プロダクション、また、セミコロンに続けて StringLiteral (文字列リテラル・文字そのままの)トークン (字句)全体を構成する並びにある各 ExpressionStatement (式文・式の文)として現れる ExpressionStatement プロダクションの最も長い並び

use strictについてのはなし。

http://blog.niw.at/post/26687866336
blog.niw.at

24-202513.js · GitHubgist.github.com

www.webzoit.net

次回以降

6と5.1の15条を比較しながら

ECMA-262 Edition 5.1を読む

ECMA-262 Edition 5.1を読む