Brian Goetz によるこの記事の最初の行により、この質問を SO に投稿することになりました。ここに再び行があります:
Java などの動的にコンパイルされる言語のパフォーマンス ベンチマークを記述して解釈することは、C や C++ などの静的にコンパイルされる言語よりもはるかに困難です。
静的に型付けされた言語と動的に型付けされた言語の答えを知っています。しかし、動的にコンパイルされた言語と静的にコンパイルされた言語の違いは何ですか?
Brian Goetz によるこの記事の最初の行により、この質問を SO に投稿することになりました。ここに再び行があります:
Java などの動的にコンパイルされる言語のパフォーマンス ベンチマークを記述して解釈することは、C や C++ などの静的にコンパイルされる言語よりもはるかに困難です。
静的に型付けされた言語と動的に型付けされた言語の答えを知っています。しかし、動的にコンパイルされた言語と静的にコンパイルされた言語の違いは何ですか?
動的にコンパイルされたものと動的に型付けされたものは、互いにあまり関係がありません。型付けは言語構文の一部ですが、コンパイル戦略は言語の実装の一部です。
動的型付けとは、変数を宣言するときに必ずしも型を宣言する必要がなく、ほとんどの場合、型間の変換が自動的に行われることを意味します。
動的コンパイルとは、プログラムの実行前ではなく、実行中に言語がマシンコードにコンパイルされることを意味します。これにより、たとえば、ジャストインタイムの最適化が可能になります。アプリケーションの実行中にコードが最適化されます。JIT オプティマイザーには、最適化を適用する前に動作中のアプリケーションを観察できるため、コードのどの分岐が最も頻繁に使用され、通常はどのように使用されるかについて、より信頼できる情報が得られるという利点があります。
動的コンパイルは自動ベンチマークの問題です。オプティマイザーが 2 回の実行間で実装を変更することを決定したため、同じプログラム コード セクションの複数の測定値が完全に異なるマシン コードの解釈を比較する可能性があるためです。
C および C++ ソース コードは通常、コンパイラによってネイティブ マシン コードにコンパイルされます。
Java は、Java コンパイラによってバイトコードにコンパイルされます。Java プログラムを実行すると、ジャストインタイム (JIT) コンパイラーが Java バイトコードを、プログラムが実行されている CPU のネイティブ マシン コードにコンパイルする場合があります。
プログラムの実行時にプログラムをネイティブ マシン コードにコンパイルすることは、動的コンパイルとも呼ばれます。
動的コンパイルと静的コンパイルとは、コンパイラが生成したコードを実行中に変更して、パフォーマンスまたはプログラムを変更する方法と場合を指します。
静的コンパイルでは、すべてのアドレスとジャンプが固定されているため、そのような操作はできません (実行中に命令の順序を変更するコードを自分で作成しない限り)。
動的コンパイルにより、プログラムの実行中に検査が可能になり、収集された情報を使用して処理を高速化できます。ウィキペディアの記事は読みやすく、かなり有益です。
ベンチマークの観点からの違いは、動的にコンパイルされたプログラムの実行時間は、実行中に劇的に変化する可能性があることです。通常、Javaコードが最初に解釈され、次にインタープリターがいくつかのメソッドが何度も呼び出されていることを発見すると、JITコンパイラーを呼び出してそれらをネイティブコードに変換します。コンパイルされたコードは引き続き監視され、コードの頻繁に実行される部分 (「ホット スポット」) が特定されると、さらに最適化されます。
少なくとも、動的にコンパイルされる言語のベンチマークでは、「ウォーミング フェーズ」(コードが最適化されるとき) を残りの実行とは別に処理する必要があります。