Dev Study
← 研修トップ

ブラウザの仕組み

画面が出るまでに、ブラウザは何をどの順で決めているのか。プロセスの分け方・12段のレンダリング・イベントループ・JITを、公式文書の文言から積み上げます。広く語られている説明の多くが一次ソースに無い領域でもあります。

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