ECMAScript仕様輪読会 #36
前回: ECMAScript仕様輪読会 #35
Scrapboxの招待リンク: https://scrapbox.io/projects/esspec/invitations/85b96c9fa718ce5185e307196ed8fb53
connpass: https://esspec.connpass.com/
Discord: https://discord.gg/59S3y6weQj
ES Spec Draft: https://tc39.es/ecma262/
Twitter hashtag: #esspec
便利ツール
esspec-memo: https://tars0x9752.github.io/esspec-memo/esspec.html
Scrapbox Codeblock Generator: https://vzvu3k6k.github.io/scrapbox-codeblock/
TC39 Terminology: https://github.com/tc39/how-we-work/blob/main/terminology.md
時事ネタ
https://jsconf.jp/2023/
CFP: 9/30/2023 ー 23:59 JST
2023年11月19日開催予定
自己紹介 (近況報告)
syumai
Twitter: https://twitter.com/__syumai GitHub: https://github.com/syumai
ずっとドラムを練習してます
tars0x9752.icon iidesune~yebis0942.icon
tars0x9752 (たーず / naoki aoyama) tars0x9752.icon
ここ2週間くらい右手首がずっと痛い。そろそろ治って欲しいと祈っている
yebis0942yebis0942.icon
embedding謎のままだった
V8の組み込みテクみたいな話しか出てこない
気になっているイベント: TAPL.ts 第1回
TypeScriptの型チェッカーの実装を参照しながら『型システム入門』を読んでいく会らしい
harupiyo / Jun Yasumura
「英文法は絵に描きやすいルールでできている」https://www.asuka-g.co.jp/book/english/011968.html 絵入りで500ページのボリュームがあって嬉しい
前回のあらすじ
Agent < Agent Cluster
9.6 InitializeHostDefinedRealm から始めて、9.7 Agents へ
今回の範囲
Agent Cluster
共有メモリによってコミュニケーションできるagentのまとまり
Agent Cluster外のagentとも共有メモリ以外の方法でコミュニケーションできることもある
SharedArrayBuffer
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer
こういう感じで他のworker (= agent)にメモリを共有することができる
code:js
const sab = new SharedArrayBuffer(1024);
worker.postMessage(sab);
構造化複製アルゴリズムは SharedArrayBuffer と、SharedArrayBuffer にマッピングされた型付き配列を受け入れます。
structuredCloneのドキュメントにはSharedArrayBufferを受け入れるという記述がないぞ?
変更がすべてのコンテキストに通知されるまでに少々時間がかかります。
現代のハードウェアのメモリモデルでは、メモリを共有していても、スレッドごとに常に同じ状態を見ていることが保証されない(キャッシュが挟まっていてスレッドごとに状態がずれている可能性がある)
https://mozaic.fm/episodes/63/cross-origin-info-leaks.html
この回良かった
SharedArrayBufferを悪用するとSprectreというCPUの脆弱性を利用して別のタブの情報を覗くことができていた
embeddingはagentをdeactivate, activate, terminateできる
deactivate, activate: forward progressを止めたり再開したりすること
forward progressの定義は次のchapterに出てくる
terminate: 定義不詳
※terminateなので、deactivateとは違って復活しなそう
agentをterminateする場合には次のどちらかの戦略を採用すること
クラスタ内のすべてのagentを終了させる
クラスタ内の少なくとも1つのagentが終了を検知できるAPIを提供する
memo: クラスタ内のagentは情報を共有できるので、1つが検知できれば他のagentにも通知できる
これが分かって何がうれしいんだろう?ECMAScript側まで終了情報が公開されることはなさそうだ
どんな場合にterminateするのか
agentが暴走してリソースを消費しすぎている場合など
(英語) external to A: Aとは無関係な
(英語) resource accounting: リソース計算
(英語) runaway: 暴走している
Forward Progress
agentがmake forward progressする
= 仕様書に従って評価を1ステップ実行すること
agentがblockする
= agentのrunning execution contextが外部のイベントを同期的かつ無期限に待つこと
liveness
9.10あたりに定義がありそう
SecCst: sequentially consistent (逐次一貫) の略
= すべての処理が逐次実行されたのと同じ結果であること
(英語) in this sense: この意味で
Processing Model of WeakRef and FinalizationRegistry Targets
This list is reset...
listとは?
ここでMDNのWeakRefの解説を読む
ECMAScriptの一般的な参照は「強い参照」という
参照されているオブジェクトはGCされない
WeakRefによる「弱い参照」しかされていないオブジェクトはGCされる(かもしれない)
code:js
const weakRef = new WeakRef(hoge);
weakRef.deref(); // hogeが取得できる(hogeがGCされていたらundefinedを返す)
FinalizationRegistry
オブジェクトがGCされたときに呼ばれる(かもしれない)コールバックを設定できる
ClearKeptObjectsやCleanupFinalizationRegistryは同期実行処理に割り込むことはない。実行タイミングはhostに任せられている。
GCは処理系が任意のタイミングで実行していいので、CleanupFinalizationRegistryの実行のために処理系がECMAScriptの実行を再開することもありえる。
GCの動作そのものは規定されていない!
(英語) referent: 参照されるもの (referenceの対義語?)
(英語) defer A to B: AをBに譲る