JavaScriptの言語仕様を決める委員会「TC39」の会議に参加してきたのトップ画像

JavaScriptの言語仕様を決める委員会「TC39」の会議に参加してきた

投稿日時:
maguroのアイコン

Deno Land Inc. / ソフトウェアエンジニア

maguro

Xアカウントリンク
「あの人も読んでる」略して「も読」。さまざまな寄稿者が最近気になった情報や話題をシェアする企画です。他のテックな人たちがどんな情報を追っているのか、ちょっと覗いてみませんか?

みなさんこんにちは。

「あの人も読んでる」、第23回目の投稿です。maguro(X @yusuktan)がお届けします。

いつもは記事や本、動画などを取り上げていますが、今回は少し趣向を変えて、先日僕が参加してきた会議の話をしようと思います。もはや「も読」(あの人も読んでる)なのか?という声が聞こえてきそうですが、会議で議題に上がっていたプロポーザルもいくつか紹介しますので、ご容赦ください。

TC39とは?

プログラミング言語のJavaScriptは、みなさんご存じかと思います。JavaScriptの言語そのものの仕様は、ECMAScriptという名前で標準化されています(fetchやDOMといったWeb APIは、また別の団体が策定しています)。ECMAはEcma International[1]という標準化団体の名前で、その技術委員会のひとつであるTC39がECMAScriptの仕様を策定しています。このTC39の第116回会議が、2026年9月29日から10月1日にかけて東京で開催されました。

TC39の会議には、Ecmaの会員企業や団体から派遣された delegate(代表者)と呼ばれる人たちが参加しています。ブラウザやJavaScriptエンジンの開発者をはじめ、さまざまな立場の人が集まって議論を交わします(Google、Apple、Mozilla、Bloomberg、Igalia、Cloudflareなど)。

どのような経緯でTC39の会議に参加することになったか

僕自身はdelegateではないのですが、会議を見学できるobserverという立場で参加することができました。会社の同僚のLeo(X @crowlKats)がdelegateを務めていて、「今回東京でやるから、よかったら参加してみない?」と声をかけてくれたのがきっかけです。

前々回の「も読」で、JavaScriptを使う側から仕様が決まる過程を眺める側へと見方が変わってきた話を書きましたが、僕にとってTC39はこれまで、公開される議事録やproposalのリポジトリを通して外から追うだけの存在でした。それが今回、実際にJavaScriptの仕様がつくられていく現場に立ち会えたことで、これまでGitHub上のテキストで追っていた議論が、人と人とのやりとりとして立体的に見えてきました。

TC39の会議はどう進むのか

まず前提として、TC39に持ち込まれる新機能の提案(proposal)は、Stage 0からStage 4までの段階を踏みながら仕様へと組み込まれていきます。詳しいルールはTC39のプロセス文書にまとまっていますが、ざっくり言うと次のような流れです。

  • Stage 0:アイデア段階。まだ委員会では正式に検討されていない
  • Stage 1:委員会が、その問題とありうる解決策を検討することに合意した段階
  • Stage 2:解決策の方向性が決まり、仕様の草案ができた段階。設計はまだ大きく変わりうる
  • Stage 2.7:仕様が完成してレビューも済み、あとはテストや実装による検証を待つ段階
  • Stage 3:実装が推奨される段階。各エンジンでの実装が進む
  • Stage 4:Test262[2]に通る2つの実装と、実際にshipされた実装での十分な実績が揃い、ECMAScript本体の仕様に取り込まれる段階

各Stageへ進むかどうかは、会議の場で議長がコンセンサスを確認しながら決めていきます。

会議はおよそ2カ月に1回のペースで開催されていて、議題は事前にtc39/agendasリポジトリで公開されます。今回の東京会議のアジェンダを見ても、各議題には5m、30m、120mといった持ち時間(timebox)がきっちり割り振られています。

実際に参加してまず驚いたのは、会議の進行がとても整然としていて、ほぼ時間通りに進んでいくことでした。発言したい参加者はTCQという専用のキュー管理ツールを使い、新しいトピックか、現在の話題への返信か、確認の質問か、あるいは議事進行上の割り込みかを選んで順番待ちに並び、議長はそのキューに沿って議事を進めていきます。会場の感触を確かめたい場面では、TCQのTemperature Checkという機能を使って、delegateたちから "Strong Positive" や "Unconvinced" といった反応を集め、その場で全体の温度感を可視化していました。

では議論まで杓子定規なのかというと全然そんなことはなく、delegateたちは積極的にキューへ並びますし、細かい仕様の挙動についてもどんどん意見が飛び交っていました。

特に印象に残っているのは、ある議題で議論が白熱して、何人かが互いに被せるように話し始めてしまった場面です。すかさず議長が "Please, let's not talk over each other" と割って入ると、場はすっと落ち着いて、またキューの順番どおりのやりとりに戻っていきました。成熟した会議だなと感じました。

会議の議事録は後日tc39/notesリポジトリで公開されます。TC39で普段どんなやりとりがされているのか気になる方は、ぜひ議事録を覗いてみてください。雰囲気がつかめると思います。

どういうプロポーザルが議論されたか

3日間の会議の中で、さまざまなトピックが議論されていました。今回はその中から、普段JavaScriptやTypeScriptを書いている人にも馴染み深そうで、僕自身もおもしろいと感じたものをいくつか紹介します。

Stage 4に到達したIteratorヘルパーたち

まずは、日常のコードにすぐ効いてきそうなIterator関連の提案からです。

イテレータは、next() を呼ぶたびに、次の値を { value: 1, done: false } のような形で1つずつ返すオブジェクトです(MDN: 反復処理プロトコル)。配列の values() や Map の keys()、ジェネレータ関数を呼び出したときの戻り値などがこれにあたります。配列と違って、値は要求されたタイミングで1つずつ取り出されるので、無限に続く列も表現できます。

この記事のつづきを読もう✨
新規登録/ログインしたらできること
  • すべての記事を制限なく閲覧可能
  • 限定イベントに参加できます
  • GitHub連携でスキルを可視化
ログイン
アカウントをお持ちでない方はこちらから新規登録
32
32
利用規約、プライバシーポリシーに同意の上サービスを、ご利用ください。