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

推薦する

CSS3 とテーブルタグを使用して円軌道アニメーションを実装するためのサンプルコード

html: 実際には、テーブルタグに従っていくつかの実線の円 div を正六角形に配置し、div コ...

Linux のさまざまなロックメカニズムの使用方法と違いについて詳しく説明します

序文:この知識を理解する必要がある人は、すでにプロセス間通信とスレッド間通信の基本的な理解を持ってい...

MySQL でストリーミングクエリを使用してデータ OOM を回避する

目次1. はじめに2. JDBCはストリーミングクエリを実装する3. パフォーマンステスト3.1. ...

Windows 10 Home Edition に Docker をインストールする方法

最近、プロジェクトをアップグレードするために Docker を使用しました。これまで使用したことがな...

MySQL データ圧縮パフォーマンス比較の詳細

目次1. テスト環境1.1 ハードウェアとソフトウェア1.2 テーブル構造2. テストの目的2.1 ...

HTML でスクロールバーを非表示にしたり削除したりする方法

1. 属性付きHTMLタグXML/HTML コードコンテンツをクリップボードにコピー< htm...

Vue 初心者ガイド: 最初の Vue-cli スキャフォールディング プログラムの作成

1. Vue - 最初の vue-cli プログラムVueの開発はNodeJSに基づいています。実際...

MySQL での limit の使用方法は何ですか (推奨)

SELECT * FROM テーブル名制限m,n; SELECT * FROM テーブル LIMI...

初心者がHTMLタグを学ぶ(2)

関連記事:初心者が学ぶ HTML タグ (1)初心者は、いくつかの HTML タグを理解することで ...

CSS 評価効果の星の例

何?何のスターコートですか?さて、もっとわかりやすくするために写真を見てみましょう。 よく見ると、パ...

CSSの高さの崩壊問題についての簡単な説明

パフォーマンス例えば: HTML: <div class="first"&...

JSはキャンバス技術を使用してeChartsの棒グラフを模倣します

Canvas は HTML5 の新しいタグです。js を使用して Canvas 描画 API を操作...

Dockerコンテナが起動直後に終了する問題を解決する

最近、Docker がコンテナの起動時に特定のプロセスを直接実行できるようにする方法を調べていたとこ...

Dockerイメージが消える問題を解決する

1. 50と93では鏡像が消える [root@h50 /]# df -h ファイルシステムの使用済み...

Docker ベースの Etcd 分散デプロイメントの方法と手順

1. 環境整備1.1 基本環境NTP設定: 省略 #時間の一貫性を確保するためにNTPサービスを設定...