← 研修トップ
ブラウザの仕組み
画面が出るまでに、ブラウザは何をどの順で決めているのか。プロセスの分け方・12段のレンダリング・イベントループ・JITを、公式文書の文言から積み上げます。広く語られている説明の多くが一次ソースに無い領域でもあります。
- 1約 8 分なぜプロセスを分けるのか — OSがやったことを、Webにもう一度ブラウザが重いのは、プロセスをたくさん作るからです。しかしそれは無駄ではなく、**OSが過去にやったことをWebにもう一度適用した結果**です。公式は「memory protection and access control が OS にもたらした利益を、Webブラウジングにもたらす」と書いています。
- 2約 9 分分離の単位は origin ではなく site — 妥協が設計に残っている「ブラウザはオリジンごとにプロセスを分けている」という説明は**誤り**です。分離の単位は **site** で、site とは **scheme + eTLD+1**。`https://foo.example.com:8080` の site は `https://example.com` です。サブドメインもポートも無視されます。
- 3約 9 分画面が出るまでの12段 — 5段モデルはどこから来たのかChromium公式(RenderingNG)がレンダリングパイプラインとして挙げているのは **12段**です。逐語の1段目は **Animate** で、通説の先頭にある **Parse という段はこの一覧に存在しません**。
- 4約 9 分誰がピクセルを作るのか — Layout・Paint・Raster の分担**Paint はピクセルを塗る段ではありません。** 公式の逐語は `compute a display list` — 描画命令のリストを作る段です。それを `GPU texture tiles` に変えるのは後の **Raster** 段、公式が `create pixels on-screen` と書くのは最後の **Draw** 段です。
- 5約 9 分イベントループ — タスクは集合、マイクロタスクは待ち行列「タスクキュー」は名前に queue と付いていますが、HTML仕様の定義は **set(集合)** です。仕様は理由まで書いています。先頭から取り出すのではなく「最初の *実行可能な* タスク」を取るからです。一方でマイクロタスクキューは本物の queue で、仕様は "The microtask queue is not a task queue." と明言しています。
- 6約 9 分JITと脱最適化 — 仮定して速くし、外れたら捨てるV8は過去のフィードバックから「この変数は整数だろう」と**仮定して**機械語を作ります。仮定が破られると、作った最適化コードを**捨てて**最適化前の実行に戻ります。これを脱最適化(deoptimization)と呼びます。