【#も読】JSConf、YAPC、HonoConf──カンファレンスの秋を振り返る(@yusuktan)のトップ画像

【#も読】JSConf、YAPC、HonoConf──カンファレンスの秋を振り返る(@yusuktan)

投稿日時:
maguroのアイコン

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

maguro

Xアカウントリンク

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


みなさんこんにちは。

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

さて、10月と11月は数々の技術カンファレンスが開催されました。カンファレンスの秋ですね。僕も毎週のように何かに参加して、興味のある発表を聞いたり、休憩スペースで大学院の試験勉強をしたりしていました。カンファレンスごとにテーマが違うのはもちろん、運営陣・登壇者・参加者が一体となって作り上げる雰囲気もそれぞれ異なっており、それを直に感じられるオフラインのカンファレンスは良いなと改めて感じました。

今回はそんなカンファレンスで僕が聞いた発表の中から、JavaScriptに関するものを3つご紹介していこうと思います。

JavaScriptにおけるasync/await呼び出しのスタックトレースの困難と実装

まず1つ目は、sosukesuzukiさんによるJSConf JP 2025での発表です。

SafariやBunなどの内部で使われているJavaScriptエンジンであるJavaScriptCore。ここでasync/awaitを使用すると、例外が発生したときのスタックトレースが不完全になってしまうという問題がありました。具体例として、以下の例が紹介されています。

async function foo() {
  await bar();
}
async function bar() {
  await 1;
  throw new Error("oops");
}
foo().catch(e => console.log(e.stack));

このコードを実行したとき、プログラマとしては以下のようなスタックトレースが得られることを期待します。つまり、エラーがthrowされた箇所 bar に至るまで、どのような関数呼び出しが連なっていたのか――この例で言うと、bar が呼び出される前に foo が呼び出されていた、という事実が出力されることを期待します。

Error: oops
    at bar (test.js:6:13)
    at async foo (test.js:2:16)

しかし、実際には以下のように foo の情報が欠損してしまっていました。

Error: oops
    at bar (test.js:6:13)

この欠損という挙動は、JavaScriptのセマンティクスを考えれば説明ができるものの、JavaScript利用者の立場からすると不便であることには変わりありません。そこでsosukesuzukiさんは、JavaScriptCoreに対して修正を加えることで、この問題に対処しようとしました。

具体的には、JSGeneratorJSPromiseJSPromiseReactionといったJavaScriptCore内部のデータ構造を辿ることで、コールスタックに依存しない形で半ば無理矢理に呼び出し元情報を復元していく、という手順が解説されていました。

さらにややこしいことに、これだけでは「関数が呼び出された位置」の情報は復元できず、さらに追加で、async関数に対応するバイトコードから位置情報を取得するというステップを踏む必要があることも説明されました。

普段何気なく活用しているスタックトレースも、async/awaitが絡むとかなり実装が複雑になっている、ということを知りました。

また、JavaScriptCoreのような大規模なソフトウェアに対して、何か機能追加・修正したくなったとき、幾つものデータ構造が複雑に参照し合っている状態を把握し、実現に向けた道筋を解きほぐす能力が必要不可欠だと感じました。

一人で大規模OSSに立ち向かうには

この記事のつづきを読もう
新規登録/ログインしたらできること
  • すべての記事を制限なく閲覧可能
  • 限定イベントに参加できます
  • GitHub連携でスキルを可視化
ログイン
アカウントをお持ちでない方はこちらから新規登録