2023-03 の TC39 meeting
まとめ
決まったこと
Web compatibility issues / Needs Consensus PRs
N/A
Stage 4 (ES2023)
N/A
Stage 3
Iterator helpers: validate arguments before opening iterator (issue, PR) | Kevin Gibbons 各メソッドで this がオブジェクトではない場合に早めに TypeError を投げる Normative Change。承認された。
Iterator helpers: closing iterators which have not been iterated (issue, PR) | Kevin Gibbons ソースの Iterator に対して return を複数回呼ばないようにする Normative Change。承認された。
Iterator helpers: renaming take/drop (slides) (issue) | Michael Ficarra Iterator#{take, drop} を別のメソッド名にするかどうかの議論。
https://gyazo.com/39cf71e83349e8cc4a9e9d7f6fb7b83d
特に強い理由があったわけではないので承認されず。今までと変わらず Iterator#{take, drop} のままとなった。
What to do about Set.prototype.intersection order (issue, slides) | Kevin Gibbons Set の要素には順番が定義されているため、積集合を新しく作るにあたって receiver (this) の順番のままになっていてほしいが、JavaScriptCore が Linked List で実装しているためそのアルゴリズムは実装困難とわかった。
奇妙な仕様となるがパフォーマンス的にどのエンジンでも問題がなくかつ挙動が決定できるように、receiver と argument の Set の相対サイズによってその順番が変わる Normative Change が承認された。
Decorators: Normative updates (issue) | Chris Hewell Garrett いくつかの細かい Normative Changes が承認された。
いつものことながら、またちらほら Normative Changes があった。全部承認された。
シンタックスをどうするかの話になっていた。
https://gyazo.com/1a97706d448bcb92590758f999e1a401
await using で落ち着いて(最終レビュー待ち)Stage 3 になった。
with キーワードを使うこととなり、改めて Import Attributes として Stage 3 になった。
ただし TypeScript や V8 などで以前の assert キーワードを使った実装がすでになされており、エコシステムに影響するということで assert キーワードについても Normative Optional, Legacy として仕様にもり込まれることとなってしまった。
Stage 2
Decorator Metadata の仕様デザインについて3つの案が話された。
1. Symbol.metadata で直接メタデータオブジェクトにアクセスする
2. Symbol.metadata でメタデータオブジェクトのキーオブジェクトを返し、それを使って WeakMap でメタデータにアクセスする
3. 1と同じだがメタデータオブジェクトには Symbol しか受け入れないようにし、それをキーにしてメタデータにアクセスする
今まで通り1の方針で進め、次回会議で Stage 3 にするべく進める予定。
Import Reflection update (slides) | Luca Casonato, Guy Bedford モジュールの読み込みは抽象化すると5つのフェーズがある。それぞれ resolve, fetch/compile, attach evaluation context, link そして eval。
resolve フェーズでは相対的なモジュールの読み込みを解決する。Web だと URL や Import Maps に関係する。このフェーズに対しては Stage 1 Asset References が対応しており、asset キーワードを割り当てる。 code: js
import asset img from "./test.png";
fetch/compile フェーズではネットワークやディスクからの読み込みコンパイルする。Web だと Content Security Policy に関係する。このフェーズについては source キーワードを割り当て、WebAssembly.Module を取得したいときなどに用いる。
code: js
import source wasm from "./test.wasm";
attach evaluation context フェーズではモジュールをインスタンスに変換する。このインスタンス化は単一のモジュールに対して何回でも再利用することができる。これには instance キーワードを割り当てる。
code: js
import instance mod from "./test.mjs";
code: js
import defer * as ns from "./test.mjs";
eval フェーズはモジュールが実行される。これが通常の ES Modules と対応している。
code: js
import foo from "./test.mjs";
次回会議に持越しとなった。
もともと {Number, BigInt}.range だったが Stage 3 Iterator Helpers で Iterator クラスができるためそちらに移動になった。
code: js
Iterator.range(0, Infinity)
.take(1000)
.filter((x) => !(x % 3))
.toArray();
いくつか懸念点はあるもののとりあえず Stage 2 になった。
自分が6年くらい ponyfill を保守しながら推し進めている提案。Stage 1 になっていたものの実装者にあまり好印象を持たれず進んでこなかった。 今まで Canvas の HDR 対応や WebGPU など様々な Web 標準の提案に対して Float16Array をアピールしてきたが、今回 Color Web CG の Canvas で色を浮動小数点数で扱いたいという提案の中で Float16Array が ECMAScript にないためやむを得ず Float32Array を使うといった内容があったのでアピールしたところ好意的に受け入れてもらえて、その流れから TC39 の bakkot さんにこの提案のリポジトリ、仕様書を作ってもらい champion として進めてもらえることとなった。 Stage 2 になった。各エンジンが実装可能かどうか調査してもらい、その結果がよかったら Stage 3 になる予定。
Async Context for stage 2 (spec text, slides) | Justin Ridgewell, Chengzhong Wu Node.js の AsyncLocalStorage 相当の機能を ECMAScript に持ってくる提案。ロギング以外のユースケースについてよくわからないためそのあたりを説明してほしいという話になった。Stage 2 になった。
Stage 1
所謂固定小数点数。金融や科学、データベースなどでユースケースがある。BigInt 同様に BigDecimal にするか IEEE 754 Decimal128 を使うか色々方向性があることが共有された。
RegExp に文字列を渡すときにエスケープするための提案。
code: js
const escaped = RegExp.escape("Hello."); // "Hello\."
const pattern = new RegExp(escaped, "g");
Template Tag の方がいいかもという話になった。
Type annotations update (repo, slides) | Asumu Takikawa and Daniel Rosenwasser 型消去にするかランタイム型チェックにするか議論され、すべてのブラウザエンジン実装者が型消去を支持した。まあそうなるよね……。
Type annotations delimiting concerns (slides) | Waldemar Horwat Type Annotations で型消去したときに、誤ってコード部分を消してしまうことがあることの懸念の共有。
https://gyazo.com/0559ba899e632711a51478947cedd868
Shared Structs update: prototype implementation, challenges, and performance (slides) | Shu-yu Guo Worker 間でシェアできるオブジェクトを定義する提案。SharedArrayBuffer でもシェアできるが、シリアライズ、デシリアライズを JS 側でやるのはコストがかかるし面倒なため追加したいというモチベーション。
Google が Microsoft と協力して Chromium で dev trial をしている。SharedArrayBuffer では達成できない GC されるヒープメモリを持つ構造体に対してベンチマークでいい成績が出たとのこと。
Await Dictionary for stage 1 (repo, slides) | Ashley Claymore Promise.all のオブジェクト対応バージョンを追加したいという提案。
code: js
const obj = {
shape: await getShape(),
color: await getColor(),
mass: await getMass(),
};
これだと直列になってしまうので、Promise.all を使って並行にしたいがかなり面倒。例えば Promise.ownProperties を追加して以下のようにできるようにする。
code: js
const {
shape,
color,
mass,
} = await Promise.ownProperties({
shape: getShape(),
color: getColor(),
mass: getMass(),
});
Stage 1 になった。
Promise.withResolvers for stage 1 (repo, slides) | Peter Klecha Promise のコールバック関数をスコープの外に持ち出すのが面倒なのでそれを楽にする静的メソッドの提案。
code: js
const { promise, resolve, reject } = Promise.withResolvers();
Stage 1 になった。どうやら ES2015 の仕様を減らすために取り入れられなかったという歴史があるらしい。今後は Symbol.species について考慮しないといけない(今までの流れから対応しない選択肢になりそうではある)。
code: js
Temporal.TimeZone.from('Asia/Kolkata');
// => Asia/Kolkata (Firefox)
// => Asia/Calcutta (Chrome, Safari, Node -- does not conform to ECMA-402)
これを仕様で正規化したいという提案。具体的にどう解決するかはまだ定かではないが、とりあえず Stage 1 になった。
Stage 3 Decorators の仕様からは将来の拡張ということでオミットされていたパラメーターデコレーターの提案。TypeScript のレガシーデコレーターにある機能なため、高い優先度で進めたいとのこと(Angular, NestJS, InversifyJS, LoopBack などで使われている)。
code: js
// without parameter decorators:
class BookApi {
@Route("/book/:isbn/review", { method: "post", form: true })
@param(0, FromUri({ name: "isbn" })) // need to repeat declaration name here and in parameter list...
@param(1, FromForm({ name: "subject" }))
@param(2, FromForm({ name: "description" }))
@param(3, FromForm({ name: "score" }))
postReview(isbn, subject, description, score) { ... }
}
// with parameter decorators:
class BookApi {
// no need for repetition if the names match...
@Route("/book/:isbn/review", { method: "post", form: true })
postReview(@FromUri isbn, @FromForm subject, @FromForm description, @FromForm score) { ... }
}
Stage 1 になった。ただ Stage 2 にする前に Function Decorators を検討したいということになった。
その他
4月1日にて Google によるファンドが終了したため、委託保守が終了となる。今後については議論する必要がある。
総括
今回は Import Reflection や Shared Structs の実験など面白い話題が多かった。個人的には Float16Array が Stage 2 に進んだのでやっと時代が追いついたような気がする。
Import Attributes で assert キーワードが Optional Normative, Regacy として残ってしまったのが残念だった。しょうがないけど。