TypescriptはJSに発生します。次に、ツリーの揺れ、「少ない」(オプション)、および展開を行うプロセスで他に何が発生します。しかし、そのようなもの(afaik)は「コンパイル」とは何の関係もありません。すべてがバンドルされ、大幅に最適化されていますが、実際にはコンパイルされていませんよね?
コンパイルとは、言語Aで記述されたプログラムを言語Bで記述された意味的に同等のプログラムに変換し、コンパイルされたプログラムを言語Bのルールに従って評価する(たとえば、Bのインタープリターで解釈する)と同じ結果が得られるようにすることを意味します。言語Aの規則に従って元のプログラムを評価するのと同じ副作用(たとえば、Aのインタープリターでプログラムを解釈する)。
コンパイルとは、プログラムを言語Aから言語Bに翻訳することを意味します。それが意味するすべてです。(また、AとBが同じ言語である可能性も完全にあります。)
場合によっては、AとBが何であるか、およびコンパイラーが何をするかに応じて、特定の種類のコンパイラーに対してより特殊な名前が付けられます。
- 場合Aはアセンブリ言語であることを認識され、Bは機械語であることを認識され、その後、我々はそれを呼び出すアセンブラ、
- 場合Aは、機械語であることを認識されているとBがアセンブリ言語であることを認識され、その後、我々はそれを呼び出す逆アセンブラ、
- AがBよりも低レベルであると認識された場合、それを逆コンパイラと呼びます。
- 場合はAとBは同じ言語であり、結果としてプログラムが何らかの方法で速くなったり、軽い、そして我々はそれを呼び出すオプティマイザ、
- 場合はAとBは同じ言語であり、結果としてプログラムは小さい、そして我々はそれを呼び出すminifier、
- 場合はAとBは同じ言語であり、その結果、プログラムが読みにくくあり、我々はそれを呼び出す難読化ツール、
- 場合AとBは、抽象化のほぼ同じレベルであると認識されており、我々はそれを呼び出すtranspiler、及び
- 場合AとBは、抽象化のほぼ同じレベルであると認識し、得られたプログラムジャムは、コメントをフォーマットし、プログラマの意図なものであることは、我々が呼ぶ、元のプログラムと同じ方法で得られたプログラムを維持することが可能であることそれはリエンジニアリングツールです。
また、古いソースでは、「コンパイル」や「コンパイラ」の代わりに「翻訳」や「翻訳者」という用語が使用されている場合があることに注意してください。たとえば、Cは「翻訳単位」について話します。
また、「言語プロセッサ」という用語に出くわすこともあります。これは、定義に応じて、コンパイラー、インタープリター、またはコンパイラーとインタープリターの両方を意味します。
Javascript自体はまだ解釈されていますよね?
JavaScriptは言語です。言語は、論理的なルールと制限のセットです。言語は解釈もコンパイルもされません。言語はただです。
コンパイルとインタプリタは、コンパイラまたはインタプリタの特性です(ええと!)。すべての言語はコンパイラーで実装でき、すべての言語はインタープリターで実装できます。多くの言語には、コンパイラとインタプリタの両方があります。多くの最新の高性能実行エンジンには、少なくとも1つのコンパイラと少なくとも1つのインタプリタの両方があります。
これらの2つの用語は、異なる抽象化レイヤーに属しています。英語が型付き言語である場合、「インタープリター型言語」は型エラーになります。
一部の言語にはインタプリタもコンパイラもありません。まったく実装されていない言語があります。それでも、それらは言語であり、プログラムを書くことができます。あなたはそれらを実行することはできません。
また、すべてがある時点で解釈されることに注意してください。何かを実行したい場合は、それを解釈する必要があります。コンパイルは、コードをある言語から別の言語に変換するだけです。それは実行されません。解釈はそれを実行します。(インタープリターがハードウェアに実装されている場合、それを「CPU」と呼ぶこともありますが、それでもインタープリターです。)
適切な例:現在存在する主流のJavaScript実装にはすべてコンパイラがあります。
V8は純粋なコンパイラとして始まりました。JavaScriptを適度に最適化されたネイティブマシンコードに直接コンパイルしました。その後、2番目のコンパイラが追加されました。現在、2つのコンパイラがあります。適度に最適化されたコードを生成する軽量コンパイラですが、コンパイラ自体は非常に高速で、RAMをほとんど使用しません。このコンパイラは、コンパイルされたコードにプロファイリングコードも挿入します。2番目のコンパイラは、より重く、低速で、高価なコンパイラですが、はるかにタイトで高速なコードを生成します。また、最初のコンパイラによって挿入されたプロファイリングコードの結果を使用して、動的な最適化の決定を行います。また、2番目のコンパイラを使用して再コンパイルするコードは、そのプロファイリング情報に基づいて決定されます。通訳が関与することは決してないことに注意してください。V8は決して解釈せず、常にコンパイルします。それはしません 通訳も含まれています。(実際、私は最近そうだと信じています。最初の2つの反復について説明しています。)
SpiderMonkeyはJavaScriptをSpiderMonkeyバイトコードにコンパイルし、それを解釈します。インタープリターはコードのプロファイルも作成し、最も頻繁に実行されるコードはコンパイラーによってネイティブマシンコードにコンパイルされます。したがって、SpiderMonkeyには2つのコンパイラが含まれています。1つはJavaScriptからSpiderMonkeyバイトコードまで、もう1つはSpiderMonkeyバイトコードからネイティブマシンコードまでです。
ほとんどすべてのJavaScript実行エンジン(V8を除く)は、JavaScriptをバイトコードにコンパイルするAOTコンパイラのこのモデルと、そのバイトコードの解釈とコンパイルを切り替える混合モードエンジンに従います。
あなたはコメントに書いた:
マシンコードはどこかに関係していると本当に思っていました。
「マシンコード」とはどういう意味ですか?
ある人の機械語は別の人の中間言語であり、その逆は何ですか?たとえば、JVMバイトコードをネイティブに実行できるCPUがありますが、そのようなCPUでは、JVMバイトコードはネイティブマシンコードです。また、x86マシンコードを実行すると、バイトコードとして解釈されるx86マシンコードのインタープリターがあります。
Javaで書かれたJPCと呼ばれるx86インタプリタがあります。ネイティブJVMCPUで実行されているJPCでx86マシンコードを実行すると…バイトコードとネイティブコードはどれですか?x86マシンコードをJavaScriptにコンパイルして(はい、それを実行できるツールがあります)、バイトコードとネイティブマシンコードである電話(ARM CPUを搭載)のブラウザーで実行するとどうなりますか?コンパイルしているプログラムがSPARCエミュレーターであり、それを使用してSPARCコードを実行している場合はどうなりますか?
すべての言語は抽象機械を誘発し、その機械の機械語であることに注意してください。したがって、すべての言語(非常に高水準の言語を含む)はネイティブマシンコードです。また、すべての言語の通訳を書くことができます。したがって、すべての言語(x86マシンコードを含む)はネイティブではありません。