ほとんどの(すべてではないにしても)動的言語(Python、PHP、Perl、Rubyなど)を見ると、それらはすべて解釈されます。私が間違っている場合は修正してください。コンパイル段階を経る動的言語の例はありますか?動的言語はインタープリター言語と同一ですか?
ほとんどの(すべてではないにしても)動的言語(Python、PHP、Perl、Rubyなど)を見ると、それらはすべて解釈されます。私が間違っている場合は修正してください。コンパイル段階を経る動的言語の例はありますか?動的言語はインタープリター言語と同一ですか?
回答:
ほとんどの(すべてではないにしても)動的言語(Python、PHP、Perl、Rubyなど)を見ると、それらはすべて解釈されます。
違います。Pythonソースをコンパイルできます。これは実存的な証拠の1つです。
静的に型付けされた言語用のインタープリターと、動的に型付けされた言語用のコンパイラーがあります。2つの概念は直交しています。
サイドノート:一般に、言語はそれだけです:セマンティクスを表現するための構文構造のセットを持つ言語。ホワイトボードにPythonを書く場合、それはまだPythonと呼ばれています!インタープリターまたはコンパイラーになる可能性のある実装です。静的型付けまたは動的型付け(両方のハイブリッド型)は言語の特性であり、解釈またはコンパイルによるプログラムの実行は実装の特性です。
.pyc
ファイルはバイトコードです。Pythonのソースコードは、それらを作成するために解析、最適化、コンパイルされました。バイトコード命令は比較的高レベルで、最も一般的な実装はプレーンインタープリターです(対照的に、実行時にバイトコードを非常に賢いマシンコードにJITコンパイルするPyPyを見てください)が、PythonはJavaまたはC#。Pythonは、「コンパイル」がネイティブの事前コンパイルに制限されている場合にのみ「コンパイルされません」が、それについて何も言わず、一般に言語から言語への変換を参照できます。
Python
していますがCPython
、後者は前者の実装であるため、ですPyPy
。
Common Lispは動的に(そして強く)型付けされ、通常コンパイルされます。
この動的性は実行時に達成されるため、コンパイラが生成されたコードを最適化してパフォーマンスを向上できるように、シンボルが特定の種類の値のみを保持することをコンパイラに保証するために、ソースコードで使用できるディレクティブがいくつかあります。
node.jsは、GoogleのV8 JavaScriptエンジンに基づいています。V8はランタイムコンパイルを行います。その事実を考えると、V8は途方もなく高速です。http://shootout.alioth.debian.orgをチェックして、V8と上記の解釈された言語のいずれかを比較してください。
いいえ-動的言語をコンパイルすることは確かに可能です。
常に設計によってコンパイルされる動的言語もあります(Clojureなど)。
しかし、問題は重要な関連点に関係しています:動的言語はコンパイルできますが、多くの場合、動的言語は静的に型付けされた言語と同じくらい効率的なコードにコンパイルできない場合があります。これは、静的にコンパイルされた言語では不要な実行時チェックを必要とする動的言語に固有の機能があるためです。
この例:オブジェクトのランタイムパッチを許可する言語(Rubyなど)では、オブジェクトのメソッドを呼び出すたびに(ハッシュテーブルルックアップなどで)オブジェクトを検査する必要があります。これがコンパイルされたとしても、コンパイラは実行時にメソッド検索を行うためのコードを生成する必要があります。ある程度まで、このメソッドのルックアップは、インタープリターがしなければならないことと似ています。
これにより、コンパイラーがクラス定義から正しいメソッドを静的に決定し、ネイティブコードでの単純な関数呼び出しに減らすことができるJavaなどの言語でのメソッド呼び出しと比較すると、大きなオーバーヘッドが追加されます。
静的にコンパイルされた対応言語よりも平均的にパフォーマンスが遅い動的言語をもたらすのは、他の何よりもこの効果だと思います。欠陥のあるベンチマークからわかるように、ランキングの一番下にある動的言語(Perl、Python、Ruby、PHPなど)で最も速くなる傾向があるのは、静的に型付けされた言語(C、Java、Fortranなど)です。
むかしむかし、BASICは解釈されました。また、BASICの一部のバリアントには動的型付けがありました。また、それらのコンパイラも入手できます。
(これは、恐竜がまだ地球を歩き回り、疑いを持たないソフトウェア開発者を朝食に食べた100Kフロッピードライブの時代にさかのぼります。)
さまざまなSmalltalk実装はこれを異なる方法で処理しますが、それらのいくつかは高性能VMで実行されるバイトコードにコンパイルされます。
実際、いわゆる「解釈された」言語のほとんどは、ジャストインタイムコンパイルを通過/許可して、より高速に実行できるようにします。また、それらの一部は、実行する前にバイトコードにコンパイルする必要があります。
実際、動的で解釈されたものは完全に2つの異なるアイデアですが、相関関係があります。動的型付けを感じる人が仕事をより簡単に、より速くするので、彼らはコードが少し遅いが移植可能であることを気にしません。
はい。すべての動的言語はインタープリター言語です(ただし、インタープリター言語は非ダイナミック言語である場合があります)。
理由は簡単です。動的な場合は、バイナリコンパイルのレベルでダイナミズムを実行するインタープリターが必要です。
例 :PHP変数にデータを入力し、後で別のタイプのデータを挿入すると、各タイプには独自のバイナリ表現形式があるため、プログラムはバイナリコードにコンパイルできませんでした。インタープリターは、動的な方法でバイナリレベルでシフトを管理します