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 桁)

推薦する

MySQLの高可用性と高パフォーマンスのクラスタを構築する方法

目次MySQL NDB Clusterとはクラスター構築のための準備作業クラスターのデプロイを開始す...

最高の無料英語フォント33選を紹介

チャンクファイブフリータイプファミリーCuprum JAH I フリーフォントイェセヴァブークレフィ...

docker-composeの詳細なインストールと使用方法

Docker Compose は、複雑なアプリケーションを定義および実行するための Docker ツ...

Spring環境を構成するためのDocker-composeの手順

最近、メンバーがテストできるようにプロジェクトをパッケージ化する必要がありますが、パッケージ化された...

Vue3 コンポジション API でロジックの再利用を実装する方法

Composition API はロジック再利用手順を実装します。ロジックコードを関数に抽出します。...

MySQL InnoDB のトランザクション特性を確保するにはどうすればよいですか?

序文「データベース トランザクションの特徴は何ですか?」と尋ねられたら、 ACID 特性である原子性...

JSフロントエンドモジュール化のいくつかの仕様についての簡単な説明

目次序文フロントエンドモジュール開発の価値厄介な名前の競合面倒なファイル依存関係モジュール化の利点C...

フロントエンドとバックエンド分離プロジェクトのDockerデプロイメントの実装例

目次1. 環境整備2. イメージを実行する問題を解決するRedis のインストールNginx のイン...

Docker-compose を使用して ELK クラスターを構築する方法

すべてのオーケストレーション ファイルと構成ファイルは、私の Github からアクセスできます。構...

Dockerはmysqldumpコマンドを使用してプロジェクト内のmysqlデータをバックアップおよびエクスポートします。

mysqldump コマンドはじめに: データベースバックアッププログラム形式: mysqldum...

Dockerのセキュリティについて Docker-TLS暗号化通信の問題

目次1. Dockerのセキュリティ問題2. Dockerアーキテクチャの欠陥とセキュリティメカニズ...

Mysql ファジークエリが大文字と小文字を区別するかどうかの詳細な調査

序文最近、私は小さな個人ブログ プロジェクトを書くのに忙しくしています。 「グローバル検索」機能を実...

MySQL ログイン警告問題の解決策

1. はじめにMySQL にログインすると、次のような警告が表示されることがよくあります。警告: コ...

初めてDockerイメージを構築、実行、公開、取得するための詳細な手順

1. はじめに以前は、Python アプリケーションの作成を開始したい場合、最初のステップはマシンに...

Chromeブラウザの自動パスワード保存プロンプト機能を無効にする方法

注: Web 開発では、フォームに autocomplete="off" を追加...