ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript はどのようなサポートに依存していますか?

JavaScript はどのようなサポートに依存していますか?

青灯夜游
青灯夜游オリジナル
2022-09-30 15:19:332225ブラウズ

JavaScript は、基礎となる JavaScript エンジンのサポートに依存しています。 JavaScript はブラウザ内で実行され、主にブラウザの JS エンジンに依存して JS コードを解釈および実行します。JavaScript エンジンは JavaScript スクリプトの処理に特化した仮想マシンであり、通常は JS スクリプトを解釈および実行するために Web ブラウザに組み込まれています。

JavaScript はどのようなサポートに依存していますか?

このチュートリアルの動作環境: Windows7 システム、JavaScript バージョン 1.8.5、Dell G3 コンピューター。

JavaScript は、基礎となる js エンジンのサポートに依存しています。

JavaScript はブラウザ内で実行され、主にブラウザの JS エンジンに依存して JS コードを解釈して実行します。 jsエンジンを搭載した他のソフトウェアでもjsを実行できますが、一般的にjsはWebページと密接な関係にあるため、ブラウザ上で実行するのが一般的です。

JavaScript エンジン

JavaScript エンジンは、JavaScript スクリプトの処理に特化した仮想マシンであり、通常は Web ブラウザーに組み込まれており、使用されます。 js スクリプトを解釈して実行します。

有名な js エンジン:

Mozilla: SpiderMonkey エンジン、C/C で書かれた世界初の JavaScript エンジン、Mozilla Firefox バージョン 1.0 ~ 3.0

Google: C/アセンブリ言語で書かれた V8 エンジン、Chrome ブラウザで使用されます

Microsoft: Chakra (チャクラ、笑い) エンジン、32 ビット版の Internet Explorer 9 で使用されます

ブラウザ カーネルと JS エンジンの関係

Webkit を例に挙げます:

JavaScript はどのようなサポートに依存していますか?

V8 エンジン

#1. 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 エンジンで Node.js を使用することは、V8 エンジンをアプリケーションに埋め込むこととみなすことができ、Node.js には JavaScript コードを実行する機能が備わります。

原理図:

JavaScript はどのようなサポートに依存していますか?

①. インタプリタは JavaScript コードを直接理解しないため、Parse モジュールは JavaScript コードを AST に変換します。関数が呼び出されない場合、AST

② には変換されません。Ignition はインタープリターであり、AST を ByteCode に変換します。同時に、TurboFan の最適化に必要な情報 (関数パラメータの型情報など、型がないと実際の操作が実行できない) が収集されます。関数が 1 回だけ呼び出された場合、Ignition は AST を ByteCode

③ に変換しますが、最終的にマシン コードに直接変換されずにバイトコードに変換されるのはなぜですか?

JSコードを実行する環境は固定されていないため、Windows環境のブラウザ、Mac環境、Linux環境の場合もあれば、Node.jsの場合もあります。は固定されておらず、異なる環境には異なる CPU が存在し、異なる CPU には異なる CPU アーキテクチャがあり、異なるアーキテクチャは異なる機械命令を実行できます。

JavaScript はどのようなサポートに依存していますか?

は、V8 エンジンによって指定されたバイトコードに変換されます。どの環境でも実行でき、クロスプラットフォームです。最後に、V8 エンジンはバイトコードをアセンブリに変換します。その後、命令はさまざまな環境に対応する CPU 命令に変換されます。

しかし、このプロセスを毎回行うのはまだ不便です。例えば、再利用する関数がありますが、以前の一連の処理を使用すると、この関数を使用するたびにバイトコードに変換し、CPU 命令に変換する必要があり、パフォーマンスが比較的低くなります。 be 直接 機械語命令に変換して保存する この機能を使用する場合、機械語命令を直接実行する方がパフォーマンスが高くなりますが、この関数が一度だけ実行される場合は、機械語に変換して保存する必要はありません、スペースを無駄にします。

④. TurboFan ライブラリは、バイトコードを CPU で直接実行できるマシン コードにコンパイルするコンパイラであり、ignition を使用して関数の実行情報を収集し、どの関数の実行時間が比較可能かを知ることができます。多くの場合、そのような関数をホット関数としてマークし、この関数を最適化された機械語命令に変換します。将来このホット関数を使用する場合、上記の面倒なプロセスを経る必要はなく、機械語命令を直接実行するだけです。

しかし実際には、機械語コードも ByteCode に復元されます。これは、その後の関数の実行中に型が変更された場合、以前に最適化された機械語コードは操作を正しく処理できず、逆変換されるためです。 . はバイトコードです。

⑤. 非最適化: たとえば、sum 関数

を呼び出す関数

function  sum(num1,num2){
   num1+num2
}

があります。
sum(20,30)
sum(28,30)

如果传入数字,调用sum函数,需要做的工作就是对两个数字进行相加,执行的机器指令永远是对这两个数字进行相加.
一旦改变传入值的类型,如果变成字符串,那么这个函数的意思就是两个字符串拼接。

sum("aaa","bbb")

这两种类型的传入值执行“+”操作对应的机器指令是不同的,JavaScript是不会对传入值的类型做检测的,那么还是使用数字相加的机器指令,这次函数调用的结果是不能够使用的。

但是V8引擎中提供了一种解决办法Deoptimization过程,这个过程是,一旦发现在执行机器指令时候,执行的操作不一样的时候,Deoptimization会反向优化,又转化为字节码,执行后续操作。

2、V8引擎的解析图

JavaScript はどのようなサポートに依存していますか?

V8执行的细节:

①、Blink将源码交给V8引擎,Stream获取到源码并且进行编码转换

②、scanner会进行词法分析,词法分析之后会将代码转换为成tokens

③、tokens会被转换为AST树,经过Parser和PreParser:

Parser就是直接将tokens转换为AST树架构;

PreParser预解析,为什么会需要预解析?

1)如上图中的函数outer(),内部有一个函数inner(),但是并没有任何调用inner()的代码,那么就意味着并不是所有的JavaScript代码,都是一开始就被执行。对所有的JavaScript代码进行解析,必定会影响网页的运行效率。

2)V8引擎实现了Lazy Parsing(延迟解析)的方案,作用是将不必要的函数进行预解析,我只需要知道有这么个函数就行,也就是只解析暂时需要的内容,对函数的全量解析在函数被调用的时候才会执行。

3)例如上图中函数outer中的inner函数,它就是会执行预解析。

④、生成AST树之后,会被Ignition转成字节码,之后的过程就是代码的执行过程。

【相关推荐:javascript视频教程编程视频

以上がJavaScript はどのようなサポートに依存していますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。