Javascriptでの巻き上げ===コンパイル?


9

最近の就職の面接で面白い視点に出会いました。

JavaScriptでのホイストとは、変数宣言と関数宣言をスクリプトの先頭に移動することです。このフェーズをコンパイルと呼ぶことができますか?

Javascriptインタープリターには入力スクリプトに対する2つのパスがあり、最初のパスではホイストし、2番目のパスでは実際にスクリプトを実行するという事実を知っています。JavaScriptがインタプリタ言語であることを知っていたので、この質問は私を少し混乱させました。

回答:


18

いいえ。巻き上げはコンパイルではありません。

ホイストは、変数と関数宣言がそれらを含むスコープの最上部に移動されたときにコンパイル中に何が起こるかを説明するために開発者によって作成された概念です。

コンパイルとは、JavaScriptコードが他の表現(通常はある種の実行可能コード)に変換されて、現在または後で実行されるときに行われることです。ChromeのV8 JavaScriptエンジンには、実際には2つのコンパイラがあります。1つは迅速でダーティな実行可能コードを今すぐ作成するためのもので、もう1つは最適化されたコードを後で作成するためのものです。

プログラミング言語は、「コンパイルされた」または「解釈された」言語として定義されていません。むしろ、言語は必要に応じて解釈またはコンパイルされます。

また、読書
JavaScriptで吊り上げる
方法V8エンジンの動作


1
インタプリタ言語に関するウィキペディアの記事は、「解釈済み」と「コンパイル済み」の区別にも役立ちます:en.wikipedia.org/wiki/Interpreted_language

これを正しく理解している場合、ホイストはスクリプトを機械可読コードに変換しないため、コンパイルではありません。私は正しいですか?:)
Rahul Desai 2015年

私の回答の2番目の段落をもう一度読んでください。
Robert Harvey、

1
このトピックについてのインタビュアーとの最近の会話で、彼はFrontendMasters.comのAdvanced JSコースへの参照をくれました。そこでは、Kyle Simpsonがコンパイルだと説明しています。これをBashスクリプトと比較すると、たとえば、行#3にある間、行#4で何を期待するかはわかりません。しかし、JSコンパイラーの場合、ホイストパスの前の行#4で何が発生するかを確認しました。他の言語とは異なり、バイナリコードに変換されないだけです。Javascriptは、実行されるたびにコンパイルされます。
Rahul Desai
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.