strict mode - motivation and semantics

click this and start slide

X / _ / X : SlideSwitch

strict mode

- motivation and semantics -



Yusuke Suzuki

id:Constellation

About


  • Taberareloo
  • iv / lv5

経過報告 1


  • iv / lv5がES5 Conformance Suiteでpassすべきtestを全てpassしました
  • FAILしてるものはtestが間違ってたり, RegExp.prototype.compileのようにES5にはいらなかったり

経過報告 2


  • sputniktestsで現行73failsになりました
  • 以下今朝8:00に取得したtrunkをcompileした結果
enginefails
lv573
v8135
smjs152
jsc164

経過報告 3


  • Operaが76failsだそうです
  • まだまだbugがあるので, そこ潰せばもっとfail減らせそうです
  • ただとりあえず, 一応「現行最正確」と名乗っても許されるような気がします
  • lv5の前置き終わり

本題: strict mode


strict mode, それは




選ばれし者の心に膨らむ奇跡のつぼみ


※ちがいます

そもそもstrict modeはなんなのか


  • 様々な制限を掛けて, programmerが陥りやすいbugを潰す
  • strict modeの概念

early error


  • strict modeを語る上で絶対に必要な概念
  • ES5から新規に導入
    • ES3はsection 15まで
    • わざわざsection 16 Errorsを新設して導入



An implementation must report early errors in a Program prior to the first evaluation of that Program.http://es5.github.com/#16

parse time error


  • ECMAScriptにparse時errorがやってきた!(compile time error)
  • early errorはProgramの評価前にreportする必要がある
  • 代表的なearly error: SyntaxError
  • strict modeのraiseするerrorの多くはSyntaxError



strict modeはある種のstatic analysis

restrictionの一貫性


  • ES5 / strict modeのrestriction
    • with禁止
    • eval / argumentsへの代入不可
    • arguments restriction
      • caller / callee
      • 環境連携の削除
    • indirect call to eval



  • これら変更にある一貫した性質
  • すなわちstrict mode自体のsemantics

eval / argumentsの扱い


  • eval / argumentsは様々な制限が
    • 11.1.5 11.13, 11.3, 11.4.4, 11.4.5, 12.2.1, 12.14.1, 13.1, 15.3.2
  • バラバラになってて分かりづらい, なんの意図が?

ECMAScript theorist, Dmitry A. Soshnikov


eval and arguments are treated as kind of “keywords”
  • 上記制限を全て加えると, eval / argumentsの挙動はkeywordsになる
    • (仕様には書いてありません)

なんで


  • keywordはstaticに解析可能 (lexicalなので)
  • eval / argumentsはES3でstaticに解析できない
  • そして, 唯一環境への影響力がある

ex


function test(script) {
  eval(script);
  console.log(typeof i);  // not undefined
}
test("var i = 20;");
  • localの環境に対してdynamicに影響を与える
  • strict modeではdynamic call to evalも一層環境を下げることで, 元環境に新規変数を作るといった広範囲な変更をさせない(変更できるとすれば変数の内容を書き換えるくらい)

with


  • withが存在すると, with(obj) { }で環境に対してdynamicに影響を与える
  • with禁止

caller / callee


  • Function.argumentsが存在する場合, caller calleeから環境の呼び出し元に影響を与える
  • 呼び出し元はstrict modeでないかもしれない
  • strict mode codeからは他環境にdynamicな影響を与える / 与えられることを禁止

indirect call to eval


  • var g = eval; g(script);
  • staticに解析できないでevalされる恐れ
  • 評価環境をglobalに追放することでlocal環境をdynamicに変更されるのを阻止

strict mode motivation


  • 環境がdynamicに変更されうる
  • unsafeなscript
  • staticに解析可能にするためにrestrictionを加える

strict modeの結実 1


  • strict mode下で今やすべてのlocal変数はvar ident形式でしか宣言できない
  • 全ての変数へのaccessはidentでしか許容されず, かつidentでのaccessは全て環境の変数にしかひもづけられない(with禁止効果)
  • 全ての変数の存在/非存在, その変数の確保領域がparse時に決定する
  • ある変数が参照されるかどうかですら解析可能
  • 例えば, あるstrict modeのscriptにevalによるdynamic call一切含まれない場合(これはkeywords化でparse時解析可能になりました), dynamicに環境から変数を引き出すことは一切ないことがparse時に解析可能(eval直接呼出し以外はindirect call to evalになるので)
    • 変数解決を一切しないで埋め込むことだってできますよね
    • さながら静的言語のように
    • さらにつきつめればconfigurable: false, writable: falseなら, もはや定数埋め込みだって(const)

strict modeの結実 2


  • delete restrictionはこの結実の結果
  • section 11.4.1
delete (target)
  • このとき(target)がstrict reference(strict mode下でのreference)で
    • UnresolvableReference
    • ReferenceでEnvironment Record(変数)にひもづいてる時
  • SyntaxError (parse時error)

delete restriction


  • そんなのparse時に解析可能なの?
  • strict mode化では変数へのaccessはidentしか許容されない
    • withが禁止になってるのでidentでのaccessは必ず変数にひもづいている
  • UnresolvableReferenceというのはglobalにあるかもしれないとき

delete restriction 結論


先程のrestrictionを実装しようとすれば,

"use strict"
delete ident;

を全てSyntaxErrorにすれば対処できる(strict mode restrictionのおかげ)

帰宅したらできる美味しい話


  • static analysisなので試してみるだけというのもあり
    • 自宅に帰ったらおもむろに今のprojectのjsをstrict modeにする
    • そしてCUIのstrict mode対応engine上で動かす
    • もちろんbrowserがないのでruntime errorが出るが, static analysisはparse timeなので, static analysisの恩恵だけ受けることができる
    • bugになりやすいところを直したら, “use strict”を外せばいいですよね

まとめ


  • strict modeはある種のstatic analysis
    • static analysisだからぎりぎりtest関係あるかも…
  • 環境へのdynamicな変更を防ぐ
  • 変更させたとしても(direct call to eval)それの検知をstaticに解析可能にする
12 months ago
  1. stillpedant reblogged this from utatane-constellation
  2. arccosine reblogged this from utatane-constellation
  3. teramako reblogged this from utatane-constellation
  4. tumbtumb reblogged this from utatane-constellation
  5. mackmac reblogged this from utatane-constellation
  6. utatane-constellation posted this