ECMAScript仕様輪読会 #4
前回: ECMAScript仕様輪読会 #3
Scrapboxの招待リンク: https://scrapbox.io/projects/esspec/invitations/85b96c9fa718ce5185e307196ed8fb53
connpass: https://esspec.connpass.com/
Discord: https://discord.gg/59S3y6weQj
Twitter hashtag: #esspec
https://youtu.be/ruxi7aFJ5NU
自己紹介
syumai
Twitter: https://twitter.com/__syumai GitHub: https://github.com/syumai
仕事でNext.jsやったり、Go書いたりしてます
Goの言語仕様の輪読会が終わったので、勢いでこれを開催しました
Nozomu Ikuta
Twitter: https://twitter.com/NozomuIkuta
GitHub: https://github.com/NozomuIkuta
Vue/Nuxtのスタック中心に仕事をしています
JunYasumura Jun Yasumura.icon
https://twitter.com/harupiyo 不活発
趣味はCommon Lisp
HTMLの仕様書を読んだ経験あり
2021年12月からフロントエンドの勉強を始めたばかり
英語苦手!
noyannoyan.icon
Reactが大好きです。React内部のコードリーディングに時間を溶かしていました
言語仕様書を読むのは初めてなので緊張しています…!
最近はChakra UIのEslint Pluginのコラボレーターになりました
yebis0942yebis0942.icon
Reactたまにやってます
Kyoto.go リモートLT会やります https://kyotogo.connpass.com/event/238059/
2/23(水祝) 13:00〜
How to Read the ECMAScript Specificationの邦訳書きつつある
日本語が難しい
Discordで共同作業しよう
おーみー
Twitter: aumy_f GitHub: aumyf
高校生です。趣味でReact, OCaml, F#, Kokaなどをいじって遊んでいます
プログラミング言語に興味があります
JSはだいぶ前から少しずつ書いてました。ES2015以降が主です
最近は友人のNext.js個人開発を手伝っています
tars0x9752 (たーず / naoki aoyama)
GitHub: https://github.com/tars0x9752
ブログ: https://tars0x9752.com/
Matrix: @tars0x9752:matrix.org
仕事ではwebアプリ・モバイルアプリ開発のフロントエンド~バックエンドをTSで書いたりしてます。
普段英語を人前で話す機会とかは全然ないので、発音とかお聞き苦しいかもですが、ご容赦ください。(がんばります)
今回の範囲
ES2021 の Spec の6 ECMAScript Data Types and Values からです。
6 ECMAScript Data Types and Values
この仕様書のAlgorithmsとは
値を操作するもの
値は型付き
型は2種類
ECMAScript language types
言語のユーザーが触れる値の型
Undefined, Null, Boolean, String, Symbol, Number, BigInt, and Object
この型の値はECMAScript language value
specification types
empty == “no value of any type”...?
nullとundefinedを区分するのってやや珍しい感あるけど、その理由は特に説明されてないんですねyebis0942.icon
undefinedは初期値
文字列型
16ビット符号なし整数の配列
ECMAScriptプログラムの中ではUTF-16のunit valueとして扱われる
サロゲートペア
Unicodeでは16ビットよりも大きいコードポイントの文字がある
これは16ビットユニットのペアで表現される
つまりUnicodeとしてはペアで1文字
ECMAScriptではUnicodeとしての意味を無視して16ビットで1文字のように扱う操作もある
code:hokke.js
console.log("𩸽".codePointAt(0) > Math.pow(2, 16)) // コードポイントが2^16を超える文字
console.log("𩸽".length) // 2
console.log("𩸽"0) // 謎の文字
console.log("𩸽"1) // 謎の文字
console.log("𩸽"0 + "𩸽"1) // 𩸽
yebis0942.iconStringのところで言われていたno further semanticsの話は「ESでは基本的にはunicodeの意味論には立ち入らず、stringは単に16ビット整数列として扱う」っていう話のような感じっぽいのですね。なのでその後に「だからUTF-16としては不正なビット列が出現する可能性がある」という注意喚起が出てきたりする
どうだろう?noyan.icon
ECMAScript operations that do not interpret String contentsの場合には、意味論に立ち入らずという制限にみえました。
あ、たぶん同意です。Unicodeの意味論に立ち入るケースもあると思ってますyebis0942.icon
いや、「基本的に立ち入らない」というのも言い過ぎてましたね。
ありがとうございます!noyan.icon
こちらこそありがとうございました!yebis0942.icon
5.2.3 Runtime Semantics
5.2.3.1 Implicit Completion Values
algorithm stepの記法のうち、暗黙的にcompletion valueを生成して返すものの解説
Return なんかの値. = Normal Completion Record(値はなんかの値)を返す
Return = Normal Completion Record(値はundefined)を返す
読んでもよく分からなかった箇所多い
The abstract operation Completion(completionRecord) is used to emphasize that a previously computed Completion Record is being returned.
(謎) 何のためにこの話が出てくるのか。
(英語) otherwise
Unless it is otherwise obvious from the context, an algorithm statement that returns a value that is not a Completion Record, such as:
otherwise
単に直前の文章との対比として使われている
取り除いても意味が変わらないと考えていったん訳すとうまくいきそう
value expressionとは
この2箇所にしか出てこない
たぶんalgorithm stepsの中に出現する値のある式
Return "Infinity".の"Infinity"とかに相当するやつっぽい
Any reference to a Completion Record value that is in a context that does not explicitly require a complete Completion Record value
この一文の大意: 「Completion Recordの値を参照すると[[Value]]を明示的に参照したのと同じことになる(abruptでなければ)」
(謎) 「完了したCompletion Recordの値を明示的に要求しない」ってどういうことなのか
"Implicit Completion Values"はES6で追加されたっぽいyebis0942.icon
もしかしてES 5.1まではCompletion Valueはかなりふわっとした雰囲気の定義しかなかった?
現状追認的に追加されたのではという想像
5.2.3.3 ReturnIfAbrupt
#ReturnIfAbrupt
次の3つの呼び出しパターンごとに動作が定義されている
1. ReturnIfAbrupt(argument).
2. ReturnIfAbrupt(AbstractOperation()).
3. Let result be AbstractOperation(ReturnIfAbrupt(argument)).
パターン1
1. If argument is an abrupt completion, return argument.
2. Else if argument is a Completion Record, set argument to argument.{{Value}}.
2は何をしてるのか
「argument(というcompletion record)のvalueを取り出して次のステップに行く」という操作なのでは
引数として渡された値の内容そのものを書き換えるのってなんか不思議
実際の使用例を見てみる
例) https://tc39.es/ecma262/multipage/ecmascript-language-expressions.html#sec-runtime-semantics-propertydefinitionevaluation のReturnIfAbrupt(propKey).
propKeyが
normal completion recordなら、valueを取り出してpropKeyに入れる
abrupt completion recordなら、そのcompletion recordをもって実行を打ち切る
completion recordでなければ何もせず次のステップに進む
例) https://262.ecma-international.org/12.0/#sec-runtime-semantics-iteratorbindinginitialization のReturnIfAbrupt(next).とかは次のステップで即nextの値確認してる
2のケースでもelseの場合は未定義になるのでは?
たぶん「何もしない」という定義になってる
(英語) "set A to B"
「Aの値をBにする」らしい
「AをBに代入する」ではない
https://www.jeol.co.jp/words/emverbs/search_result.html?keyword=set
科学技術論文では、装置や機器のパラメータや、分析の条件など(A)を「ある値や条件(B)に設定する」(set A to B)というように使う。
パターン2
3. Else if hygienicTemp is a Completion Record, set hygienicTemp to hygienicTemp.{{Value}}.
(謎) 外部から参照できないはずのhygienicTempを操作しても意味なくない?
hygienicTemp
hygienic: 衛生的な
Where hygienicTemp is ephemeral and visible only in the steps pertaining to ReturnIfAbrupt.
外のスコープに変数の参照が漏れない
参考: hygienic macroという用法がある
https://ja.wikipedia.org/wiki/健全なマクロ
識別子が誤って捕捉されてしまう問題が起こらないことが保証されているマクロ
パターン3
1. If argument is an abrupt completion, return argument.
2. If argument is a Completion Record, set argument to argument.{{Value}}.
3. Let result be AbstractOperation(argument).
2はElse ifとなるべきでは?
動作的にはIfでもElse ifでも同じだけど、他と整合性がない気がする
5.2.3.4 ReturnIfAbrupt Shorthands
(英語) syntax-directed
構文指向の?
Perform ! SyntaxDirectedOperation of NonTerminal.
syntax-directed operation
https://tc39.es/ecma262/multipage/syntax-directed-operations.html#sec-syntax-directed-operations
NonTerminal
文法規則でいうところの非終端記号
文脈自由文法と生成規則は数式の演算順序とのアナロジーから理解できる。
数式1 + 3 * 2の計算順序を明示的に示すと、1 + (3 * 2)で、これを計算すると1 + 6 => 7が得られる。数学はこのように演算の順序を規定することで一意の計算結果を保証している。
プログラミング言語も、数学と同じようなやり方で処理順を規定している。
演算における「足し算は左から計算する」「掛け算は足し算に優先する」のような個々のルールに対応するものを生成規則と呼び、生成規則というルールセット全体を指して文脈自由文法という。
https://www.sigbus.info/compilerbook#木構造による文法構造の表現
ECMAScriptの構文規則
https://tc39.es/ecma262/multipage/notational-conventions.html#sec-syntactic-and-lexical-grammars
5.2.4 Static Semantics 静的意味論
文脈自由文法ではECMAScriptを記述しきれない
ECMAScriptのalgorithm記法や自然言語で補っている
という話だと思うyebis0942.icon
文脈自由文法以外の4文法はこのために用いられるのではと発言しましたが、自分の勘違いだったようですnoyan.icon
The ECMAScript spec defines four grammars. ...(略)... Each grammar is defined as a context-free grammar, consisting of a set of productions.
Understanding the ECMAScript spec, part 3
これらの文法の上位カテゴリーとして自由生成文法がある、という形でいまのところ理解しています。
次回
5.2.4 Static Semantics
Static Semantic Rules have names and...
から再開
メモ
今回からYouTube Liveしてます
ECMAScript仕様書ページ
https://www.sigbus.info/compilerbook
/noyan/Notational Conventions
ECMAScript仕様輪読会 #4の振り返り会