JavaScriptの動作原理を理解しましょう

JavaScriptの動作原理を理解しましょう

JavaScript がどのように実行され、その動作メカニズムを理解するには、まずブラウザのカーネルを理解する必要があります。

ブラウザカーネル

カーネルについて学んだ人は、ブラウザによってカーネルが異なることを知っているでしょう。では、どのようなカーネルが存在し、よく使用されるブラウザではどのようなカーネルが使用されているのでしょうか。

  • Gecko: 初期には Netscape および Mozilla Firefox ブラウザで使用されていました。
  • Trident: Microsoft によって開発され、IE4 ~ IE11 ブラウザーで使用されていますが、Edge ブラウザーは Blink に切り替えました。
  • Webkit: Apple が KHTML をベースに開発し、オープンソースで、Safari で使用され、以前は Google Chrome でも使用されていました。
  • Blink: Google によって開発され、現在 Google Chrome、Edge、Opera などで使用されている Webkit のブランチ。

いわゆるブラウザ カーネルは、ブラウザのタイプセッティング エンジン、つまりブラウザ エンジンを指します。エンジンの作業実行プロセスは次のとおりです。

ここに画像の説明を挿入

しかし、この実行プロセス中に、HTML を解析するときに JavaScript タグに遭遇した場合はどうすればよいでしょうか?
HTML の解析を停止し、JavaScript コードを読み込んで実行します。

もちろん、ここで停止するのではなく、JavaScript コードを非同期的に読み込んで実行してみてはいかがでしょうか?

したがって、ブラウザは、新しい DOM ツリーを頻繁に生成するのではなく、HTML によって解析された DOM と JavaScript 操作後の DOM を組み合わせて最終的な DOM ツリーを生成しようとします。

では、JavaScript コードを実行するのは誰でしょうか?
答え: JavaScript エンジン

JavaScript エンジン

なぜ JavaScript エンジンが必要なのでしょうか?

  • 実際、私たちが書いた JavaScript をブラウザに渡して実行しても、Node に渡して実行しても、最終的には CPU によって実行されます。
  • しかし、CPU は、実際にはマシン語である独自の命令セットのみを認識し、CPU によって実行できます。
  • したがって、JavaScript コードを実行用の CPU 命令に変換する JavaScript エンジンが必要になります。

一般的な JavaScript エンジンは何ですか?

  • SpiderMonkey: Brendan Eich (JavaScript の作者) によって開発された最初の JavaScript エンジン。
  • Chakra: Microsoft によって開発され、Internet Explorer で使用されます。
  • JavaScriptCore - Apple が開発した WebKit の JavaScript エンジン。
  • V8: Google が開発した強力な JavaScript エンジンで、Chrome が他の多くのブラウザよりも優れている点にも貢献しています。(V8 は強力な JavaScript エンジンです)

V8エンジン

  • V8 は、C++ で記述された Google のオープンソースの高性能 JavaScript および WebAssembly エンジンで、Chrome や Node.js などで使用されています。
  • ECMAScript と WebAssembly を実装し、x64、IA-32、ARM、または MIPS プロセッサを使用する Windows 7 以降、macOS 10.12 以降、Linux システムで実行されます。
  • V8 はスタンドアロンで実行することも、任意の C++ アプリケーションに埋め込むこともできます。

V8 エンジンが JavaScript コードを実行する原理:

インタープリターは JavaScript コードを直接理解できないため、Parse モジュールは JavaScript コードを AST (抽象構文木) に変換します。

  • 関数が呼び出されない場合、AST に変換されません。
  • Parse の V8 公式ドキュメント: https://v8.dev/blog/scanner

IgnitionはASTをバイトコードに変換するインタープリタです

  • 同時に、TurboFan の最適化に必要な情報 (実際の計算に必要な関数パラメータの型情報など) も収集します。
  • 関数が 1 回だけ呼び出されると、Ignition はバイトコードを解釈して実行します。
  • Ignition の V8 公式ドキュメント: https://v8.dev/blog/ignition-interpreter

TurboFan は、バイトコードを CPU が直接実行できるマシン コードにコンパイルするコンパイラです。

  • 関数が複数回呼び出されると、ホット関数としてマークされ、TurboFan によって最適化されたマシン コードに変換され、コードの実行パフォーマンスが向上します。
  • ただし、マシン コードは実際には ByteCode に復元されます。これは、関数のその後の実行中に型が変更された場合 (たとえば、sum 関数は最初は数値型を実行しましたが、後で文字列型に変更された場合)、以前に最適化されたマシン コードは操作を正しく処理できず、バイトコードに変換されるためです。
  • TurboFan の V8 公式ドキュメント: https://v8.dev/blog/turbofan-jit

上記はJavaScriptコードの実行プロセスです

学び、記録し、お互いを励まし合いましょう!

JavaScript の仕組みについての記事はこれで終わりです。JavaScript の仕組みについてさらに詳しく知りたい方は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JavaScriptの動作メカニズムの詳細な説明とイベントループについての簡単な説明
  • jsBridgeの動作メカニズムを1つの記事で学ぶ
  • Dockerのインストール、イメージの作成、NodeJSプログラムの読み込みと実行の詳細なプロセス
  • Jupyter Notebook で JavaScript を実行する方法
  • ノードターミナルでjsファイルを実行するとES6構文がサポートされないという問題を解決します
  • Visual Studio Code で HTML、CSS、JS ファイルをコンパイルして実行するチュートリアル
  • GolangでJavaScriptを実行する例
  • フロントエンドJavaScriptの動作原理

<<:  Nginx のステータス監視とログ分析の詳細な説明

>>:  MySQL の乗算と除算の精度の不一致の問題 (除算後の小数点以下 4 桁)

推薦する

JS での矢印関数と this の記述と理解

目次序文1. JSで関数を書く方法1. 通常の関数の書き方2. 矢印関数の書き方2. 通常の関数でこ...

フロントエンドのパフォーマンス最適化 - フロントエンドエンジニアが話し合うべき問題点

はじめに<br />前回の記事「私の CSS アーキテクチャ コンセプト」では、公園で友...

VUE+Canvasはデスクトップピンボールブロック破壊ゲームのサンプルコードを実装します

誰もがピンボールやレンガ崩しのゲームをプレイしたことがあるでしょう。左と右のキーを使用して、下にある...

JS はシンプルな todoList (メモ帳) 効果を実装します

メモ帳プログラムは、HTML + CSS + JavaScript の 3 つの主要なフロントエンド...

MySQL の一般的な問題とアプリケーション スキルの概要

序文MySQL の日常的な開発やメンテナンスでは、パスワードの紛失やテーブルの破損など、避けられない...

Vueでショッピングカートのすべての機能を実装する簡単な方法

主な機能は次のとおりです。製品情報を追加する製品情報を変更する単一の製品を削除する複数の製品を削除す...

N キロメートル以内のデータを検索する MySQL の簡単な例

地球の円周率と半径、検索ポイントの経度と緯度から、検索ポイントと検索データテーブル間の距離はNキロメ...

MySQL マスター/スレーブ ステータスを監視するシェル スクリプト

Linuxでシェルスクリプトを共有して、MySQLのマスタースレーブ状態を監視し、エンタープライズW...

dockerカスタムイメージでphp7をビルドする方法

まず、簡単な Docker インストールを実行します。イメージをカスタマイズするには、ベースイメージ...

Vue で lodop 印刷コントロールを使用してブラウザ互換の印刷を実現する方法

序文このコントロールを直接印刷すると下部に透かしが入りますが、公式 Web サイトから購入することで...

Linux での MySQL データベースのマスター スレーブ同期レプリケーション構成

Linux での MySQL データベースのマスター/スレーブ同期構成の利点は、この方法をバックアッ...

MySQL 演算子の具体的な使用法 (and、or、in、not)

目次1. はじめに2. 本文2.1 および演算子2.2 または演算子2.3 オペレーター2.4 no...

Linux での crontab スケジュール実行コマンドの詳細な説明

LINUX では、定期的なタスクは通常、cron デーモン プロセス [ps -ef | grep ...