Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ECMAScript仕様を読むのに必要な知識 - ダイジェスト版
Search
syumai
August 23, 2024
Programming
5k
10
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ECMAScript仕様を読むのに必要な知識 - ダイジェスト版
syumai
August 23, 2024
More Decks by syumai
See All by syumai
Workers Cache を知る
syumai
0
380
自分的「カンファレンスの楽しみ方」
syumai
0
220
go-spidermonkeyでAIエージェントのCode Modeを実装する
syumai
3
1.6k
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
2.2k
Oxlintのカスタムルールの現況
syumai
6
2.2k
Oxlintはいかにしてtsgolintのlint ruleを呼び出しているのか
syumai
2
1.7k
『[入門] Cloudflare Workers』本はなぜ誕生したのか
syumai
0
660
tsgolintはいかにしてtypescript-goの非公開APIを呼び出しているのか
syumai
9
3.4k
知られているようで知られていない JavaScriptの仕様 4選
syumai
3
1.3k
Other Decks in Programming
See All in Programming
あなたの await、OS まで届いてる? strace で覗く JavaScript の非同期
hasutosasaki
1
1.5k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
430
Inertia Rails: The One-Person Framework with React & Friends
skryukov
0
120
우리의 Nitro Modules는 당신의 Turbo Modules보다 아름답다
l2hyunwoo
0
220
sbt 2.0: takeoff
eed3si9n
0
170
クラウドゲーミングのパフォーマンス最適化に挑む / Cloud Gaming Performance Tuning
vivion
0
260
dotNET_vulnclicker_intro.pdf
deka_morita
0
150
Kotlinize Is Not Just Converting to Kotlin
chigichan24
1
190
Event is what happens
moro
2
1.6k
エージェントを使い続けるためのメタワーク / Meta-work for keeping using the agent
rkaga
6
1.9k
Jetpack Compose Mechanisms
skydoves
3
870
AIで開発が速くなった先で、開発チームは何を目指すか
shihochan
1
1.8k
Featured
See All Featured
The Cost Of JavaScript in 2023
addyosmani
55
10k
WCS-LA-2024
lcolladotor
0
920
Building Adaptive Systems
keathley
44
3.3k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
59k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
650
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.9k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.4k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
580
Chasing Engaging Ingredients in Design
codingconduct
0
370
Building Better People: How to give real-time feedback that sticks.
wjessup
371
20k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
280
The Curse of the Amulet
leimatthew05
3
16k
Transcript
ECMAScript仕様を読むのに必要な知識 - ダイジェスト 版 syumai フロントエンドカンファレンス北海道2024 (2024/8/23)
自己紹介 syumai ECMAScript 仕様輪読会 主催 株式会社ベースマキナで管理画面のSaaSを開発中 GoでGraphQLサーバー (gqlgen) や TypeScriptでフロント
エンドを書いています Software Design 12月号からCloudflare Workersの連載をして ます Twitter: @__syumai Website: https://syum.ai
None
本日話すこと ECMAScript仕様を読むのに必要な知識について、5分でなるべく多く話します 全部を網羅するのは無理なので、特にハマりやすいものについて紹介します Meguro.es #26 での発表と被りがありますがご容赦ください
ECMAScript仕様書
ECMAScript仕様書 Ecma Internationalのサイトから、PDFまたはHTMLで閲覧可能 https://ecma-international.org/publications-and-standards/standards/ecma-262/ 現在の最新はECMAScript 2024 (第15版) 版が切られる前の最新のドラフトも閲覧可能 https://tc39.es/ecma262/
仕様を読むのに必要な知識
仕様を読むのに必要な知識 ECMAScript仕様書を読み始めるには、以下を知っておく必要がある 表記法 文法の表記法 アルゴリズムの表記法 ← 今日話すのはここまで ECMAScript仕様上のみ登場する型 ↑ を理解していないと、ひたすら理解不能な内容が続く
None
文法の表記法
文法の表記法 文法は、文脈自由文法で表現される Syntax に記載される 斜体文字 は非終端記号 下記スクショでは RelationalExpression など :
や :: などは非終端記号の定義 (文法生成規則とも言う) 左辺の非終端記号を構成するトークン列が : などの右辺に示される 右辺のトークン列には、非終端記号および終端記号が並ぶ 構文的文法 (Syntactic Grammar) を示す : が最も頻出する
文法の表記法 等幅フォントの文字は終端記号 下記スクショでは < 終端記号は、非終端記号と異なり、記載された通りにソースコード中に現れる
文法生成規則の読みにくさ 下記の生成規則も実は2つの生成規則を省略して1つにまとめたもの 省略記法が大量にあるので難しい ここでは3つ紹介します
文法生成規則の省略記法1: 縦に並べる 左辺の非終端記号が同一となる生成規則が複数並ぶ場合、縦に並べて記載される 繰り返し同じ記載をするのを避けるための省略記法 例 これは以下2つの生成規則の省略記法 ArgumentList : AssigmentExpression ArgumentList
: ArgumentList , AssignmentExpression
文法生成規則の省略記法2: optional opt と言うsuffixは、 opt の付いているトークンが存在する生成規則と、存在しない 生成規則の2つの省略記法 例 これは以下2つの生成規則の省略記法 VariableDeclaration
: BindingIdentifier Initializer VariableDeclaration : BindingIdentifier
文法生成規則の省略記法3: 文法的パラメータ 省略記法シリーズの中では一番ややこしい [ParameterName] がsuffixに付いた左辺側の非終端記号は、その文法的パラメータ (Grammatical Parameters) の名前がsuffixに付いた生成規則と、付いていない生成規則 の2つの省略記法 例
これは以下2つの生成規則の省略記法 StatementList : ReturnStatement StatementList_Return : ReturnStatement
文法生成規則の省略記法3: 文法的パラメータ 文法的パラメータが複数ある時は、全てをかけ合わせた種類分の省略記法になる 例 これは以下4つの生成規則の省略記法 StatementList : ReturnStatement StatementList_Return :
ReturnStatement StatementList_In : ReturnStatement StatementList_Return_In : ReturnStatement
文法生成規則の省略記法3: 文法的パラメータ 文法的パラメータを持つ右辺側の非終端記号に対して、引数を明示することが出来る [Yield, Await] で超頻出 (awaitが利用可能な文脈のみで有効な識別子など) 例 下記の [In]
パラメータを持つ生成規則があると仮定して、引数の渡し方の例を示します 生成規則は2つ ExpresssionStatement : (右辺は省略) ExpresssionStatement_In : (右辺は省略)
文法生成規則の省略記法3: 文法的パラメータ [+ParameterName] は、その引数があるパターンのみを使うことを指示する記法 例 これは以下の生成規則1つを表す StatementList : ExpressionStatement_In
文法生成規則の省略記法3: 文法的パラメータ [~ParameterName] は、その引数が無いパターンのみを使うことを指示する記法 例 これは以下の生成規則1つを表す StatementList : ExpressionStatement
文法生成規則の省略記法3: 文法的パラメータ [?ParameterName] は、左辺の非終端記号が持つ文法的パラメータに受け取った引数 と同じパターンをそれぞれ使うことを指示する記法 例 これは以下の生成規則2つの省略記法 StatementList : ExpressionStatement
StatementList_In : ExpressionStatement_In
アルゴリズムの表記法
アルゴリズムの表記 ECMAScriptの仕様内で記述されるアルゴリズムは、主に下記の2種類の操作を通じて 呼び出される。 Abstract Operation (抽象操作) Syntax-Directed Operation (構文指向操作)
Abstract Operation Abstract Operationは Operation(arg1, arg2) といった関数的なスタイルで、値を 受け取ってアルゴリズムを処理する。 例
Syntax-Directed Operation Syntax-Directed Operationは Operation of Syntax のスタイルで、文法生成規則を 受け取ってアルゴリズムを処理する。 文法生成規則に複数の代替
(alternatives) が存在する場合、それぞれに対するアル ゴリズムが定義される
Syntax-Directed Operation の定義の例
Syntax-Directed Operation の利用例 14.7.4.2 Runtime Semantics: ForLoopEvaluation より抜粋
セマンティクス ECMAScriptでは、以下の2種類で定義されている Runtime Semantics 文法生成規則に対応する形で、実行時 (runtime) のセマンティクスを示すアルゴリ ズム列 Static Semantics
文脈自由文法だけでは入力列が有効か判断できないようなケースなどで使う (※補足: 5.2.4 Static Semantics で明確に説明されていないように思われま すが、文脈自由文法で表現できるようなケースについても、静的にセマンテ ィクスが決まるものはStatic Semanticsに分類されているように見えます) アルゴリズム列か、散文的な記法で示される
Runtime Semanticsの例 ArrayLiteral の文法生成規則に対応するRuntime Semantics (抜粋) それぞれの文法生成規則に対応するアルゴリズムが存在する
Static Semanticsの例 (アルゴリズム列) 一般的なStatic Semanticsは、アルゴリズム列でセマンティクスを定義している
Static Semanticsの例 (散文的な記法) Early Errorsと言う特殊な種類のStatic Semanticsは、散文的な記法 (ここでは箇条書 き) でセマンティクスが定義されている ここでは
"let" と言う名前の識別子をlet / constの宣言に含められない、など Runtime Semanticsに進む前のバリデーション的に使われる
Completion Record Completion Recordは、プログラム上の制御フローおよび、それに伴う値を伝播する役 割を持っているECMAScript仕様上のみの型 制御フローの例: break, continue, return, throw
多くのAbstract OperationやSyntax-Directed Operationがこれを返す Completion Recordは大きく2種類に分けられる normal completion Completion Recordの [[Type]] が NORMAL のもの 正常終了を表す abrupt completion Completion Recordの [[Type]] が NORMAL 以外のもの BREAK, CONTINUE, RETURN, THROW 実際にabrupt completionを使うアルゴリズムが登場する時、その内容はほと んどが THROW のパターン (TypeErrorのthrowなど)
ReturnIfAbrupt 呼び出したAbstract OperationやSyntax-Directed OperationがAbrupt Completionを返 した時に、Early returnする操作
ReturnIfAbruptの省略表記 操作の呼び出しの前に置かれている ? はReturnIfAbruptの省略表記 大体の場合、 「この操作はErrorを投げる可能性があり、Errorが投げられたらそこ で終了する」と読むので問題ない 代わりに ! が置かれていたら、呼び出し対象の操作がAbrupt
Completionを返す可能 性があるが、ここでは絶対に返すことがないと言うAssertionになる
さいごに 実はこれでもまだ全然紹介しきれていない とりあえず最初の一歩を踏み出せれば芋づる式に読み方がわかってくる みなさんもぜひECMAScriptの仕様を読んでみましょう!
宣伝 ECMAScriptの仕様を読むのに興味が出た方は、ぜひECMAScript仕様輪読会にお越し ください! 2週に1回、火曜に開催しています https://esspec.connpass.com/
ご清聴ありがとうございました!