#
strict mode - motivation and semantics
click this and start slide
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した結果
| engine | fails |
|---|---|
| lv5 | 73 |
| v8 | 135 |
| smjs | 152 |
| jsc | 164 |
経過報告 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を加える
- 環境変更を阻止し, sandboxを作る: SES (Secure ECMAScript)
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
-
stillpedant reblogged this from utatane-constellation
-
arccosine reblogged this from utatane-constellation
-
teramako reblogged this from utatane-constellation
-
tumbtumb reblogged this from utatane-constellation
-
mackmac reblogged this from utatane-constellation
-
utatane-constellation posted this