非常に使いやすい言語 (Python など) は、習得がより複雑と見なされる言語 (C++ や Java など) よりも実行時間が遅いことが多いようです。なんで?問題の一部は、Python がコンパイルではなく解釈されるという事実から生じることは理解していますが、Python (または別の高級言語) が効率的にコンパイルされるのを妨げているのは何ですか? このトレードオフがないと思うプログラミング言語はありますか?
4 に答える
高水準言語 (または少なくとも動的言語) での効率性の問題は、実際のオブジェクトの型が実行時に解決されるまで、実行する必要がある操作が通常わからないという事実に起因します。結果として、これらの言語は単純なマシン コードにコンパイルされず、裏ですべての面倒な作業を行う必要があります。
C と Python を比較してみましょう。ほとんどの場合、C は Python よりもプログラミングが「複雑」です。これは、Python は C が自動化しない多くの作業を自動化するためです。たとえば、ガベージ コレクションは Python では自動化されていますが、C ではプログラマーの責任です。
この自動化の代償は、これらの「高レベルの機能」が、すべてのプログラムのニーズに「適合」するのに十分汎用的である必要があることです。たとえば、Python ガベージ コレクタには事前定義されたスケジュール/ガベージ コレクション アルゴリズムがありますが、これはすべてのアプリケーションに最適であるとは限りません。一方、C は、プログラマーが望むように GC スケジュールとアルゴリズムを定義するための完全な柔軟性を提供します。
これで、使いやすさとパフォーマンスの比較が完了しました。
基本的に、これらすべての根底には核となる理由があります。それは、何かを実行するために必要な命令の数です。
単純な古い C では、ほとんどのステートメントは、通常は 1 強から約 4 までの数個の命令と、1 に非常に近いエバージで実行できます。
C++ では、内部でさらに多くのことが行われています。たとえば、仮想メソッドを呼び出すには追加の命令が必要です。これは、優れたオプティマイザによって解決できますが、実行時の型情報がオプティマイザを妨害する可能性があります。
Java でも同じ問題が発生します。さらに、各 JVM 命令を 1 つ以上のマシン命令に展開するインタープリターでコードが実行されます。実行時の最適化。
そして、Python にはこれらすべての問題がありますが、起動時に解析する必要があり、型を処理するための柔軟な (つまり、より複雑な) システムを備えているため、さらに多くの命令が必要になります。
はい、Python をコンパイルできます。それを試みているプロジェクトさえあります。しかし、ハード コンパイルでは、動的言語の利点の一部が失われます。
Pythonコードの実行時間は、主に動的型付け言語であるため、C++よりも遅くなります。たとえば、次を参照してください。