動的言語は常に解釈されますか?


18

ほとんどの(すべてではないにしても)動的言語(Python、PHP、Perl、Rubyなど)を見ると、それらはすべて解釈されます。私が間違っている場合は修正してください。コンパイル段階を経る動的言語の例はありますか?動的言語はインタープリター言語と同一ですか?


4
動的言語を定義し、動的に型付けされていますか?
ベンジャミン

3
Objective-Cは、多くの「動的」プロパティを示します。
エドワードストレンジ

4
@ Job、Lispで何十年もそれをすることができた。そして、コンパイルされ、動的に型付けされます。したがって、コンパイルと解釈の間に正確な境界線はありませんでした。
SKロジック

2
@Darien実行時にもコンパイルして、後でコードを実行できます。厳密に言えば、それは解釈ではありません。
xmm0

3
@Darienは、コンパイラがコンパイル済みバイナリにシンボルテーブル情報を格納し、実行時にアクセスするためのコードを生成することを妨げません。一部の言語は、コンパイルよりも解釈に適していることは事実ですが、全体のポイントは、その言語用のコンパイラーを持つことが可能であるということです。注意すべきもう1つの重要な点は、一部の人々は、コンパイラが何らかのマシンコードを生成する必要があると想定していることです。実際には、2つの言語(または一部のJavascriptミニファイヤのような同じ言語)でソースレベルの変換を実行するだけのコンパイラがあります。
xmm0

回答:


33

ほとんどの(すべてではないにしても)動的言語(Python、PHP、Perl、Rubyなど)を見ると、それらはすべて解釈されます。

違います。Pythonソースをコンパイルできます。これは実存的な証拠の1つです。

静的に型付けされた言語用のインタープリターと、動的に型付けされた言語用のコンパイラーがあります。2つの概念は直交しています。

サイドノート:一般に、言語はそれだけです:セマンティクスを表現するための構文構造のセットを持つ言語。ホワイトボードにPythonを書く場合、それはまだPythonと呼ばれています!インタープリターまたはコンパイラーになる可能性のある実装です。静的型付けまたは動的型付け(両方のハイブリッド型)は言語の特性であり、解釈またはコンパイルによるプログラムの実行は実装の特性です。


19
Pythonが構文的に有効であるためには、ホワイトボード上でどの精度でインデントを一致させる必要がありますか?;)
edA-qa mort-ora-y

1
Pythonをコンパイルすることはできません。PYCはモジュールのロードのみを加速します。また、py2exeは、ソースファイルとともにexeにインタープリターを埋め込むだけです。
ベンジャミン

8
@Ubiquité:.pycファイルはバイトコードです。Pythonのソースコードは、それらを作成するために解析、最適化、コンパイルされました。バイトコード命令は比較的高レベルで、最も一般的な実装はプレーンインタープリターです(対照的に、実行時にバイトコードを非常に賢いマシンコードにJITコンパイルするPyPyを見てください)が、PythonはJavaまたはC#。Pythonは、「コンパイル」がネイティブの事前コンパイルに制限されている場合にのみ「コンパイルされません」が、それについて何も言わず、一般に言語から言語への変換を参照できます。

4
@Ubiquité:はい、それは正しいですが、それは「Pythonをコンパイルできない」、またはPythonをコンパイルできるかどうかという主張とは関係ありません。まず第一に、あなたはとを混合PythonしていますがCPython、後者は前者の実装であるため、ですPyPy
phant0m

2
@ClemC言語のすべてのプロパティはコンパイラーまたはインタープリターに組み込まれます。それ以外の場合、インタープリターまたはコンパイラーは別の言語用です。
ピーターB

15

Common Lispは動的に(そして強く)型付けされ、通常コンパイルされます。

この動的性は実行時に達成されるため、コンパイラが生成されたコードを最適化してパフォーマンスを向上できるように、シンボルが特定の種類の値のみを保持することをコンパイラに保証するために、ソースコードで使用できるディレクティブがいくつかあります。


12

C#4.0は動的型(遅延バインディング)をサポートし、コンパイルされます。


4

node.jsは、GoogleのV8 JavaScriptエンジンに基づいています。V8はランタイムコンパイルを行います。その事実を考えると、V8は途方もなく高速です。http://shootout.alioth.debian.orgをチェックして、V8と上記の解釈された言語のいずれかを比較してください


3

いいえ-動的言語をコンパイルすることは確かに可能です。

常に設計によってコンパイルされる動的言語もあります(Clojureなど)。

しかし、問題は重要な関連点に関係しています:動的言語はコンパイルできますが、多くの場合、動的言語は静的に型付けされた言語と同じくらい効率的なコードにコンパイルできない場合があります。これは、静的にコンパイルされた言語では不要な実行時チェックを必要とする動的言語に固有の機能があるためです。

この例:オブジェクトのランタイムパッチを許可する言語(Rubyなど)では、オブジェクトのメソッドを呼び出すたびに(ハッシュテーブルルックアップなどで)オブジェクトを検査する必要があります。これがコンパイルされたとしても、コンパイラは実行時にメソッド検索を行うためのコードを生成する必要があります。ある程度まで、このメソッドのルックアップは、インタープリターがしなければならないことと似ています。

これにより、コンパイラーがクラス定義から正しいメソッドを静的に決定し、ネイティブコードでの単純な関数呼び出しに減らすことができるJavaなどの言語でのメソッド呼び出しと比較すると、大きなオーバーヘッドが追加されます。

静的にコンパイルされた対応言語よりも平均的にパフォーマンスが遅い動的言語をもたらすのは、他の何よりもこの効果だと思います。欠陥のあるベンチマークからわかるように、ランキングの一番下にある動的言語(Perl、Python、Ruby、PHPなど)で最も速くなる傾向があるのは、静的に型付けされた言語(C、Java、Fortranなど)です。


2

むかしむかし、BASICは解釈されました。また、BASICの一部のバリアントには動的型付けがありました。また、それらのコンパイラも入手できます。

(これは、恐竜がまだ地球を歩き回り、疑いを持たないソフトウェア開発者を朝食に食べた100Kフロッピードライブの時代にさかのぼります。)


...ただし、GOTOを使用した場合のみ。(もちろん、BASICで開発している場合は非常に一般的でした。AHA!それはそれを説明しています!)
メイソンウィーラー

設計時のBASICはコンパイルされた言語でした。
AProgrammer

2

さまざまなSmalltalk実装はこれを異なる方法で処理しますが、それらのいくつかは高性能VMで実行されるバイトコードにコンパイルされます。


2

実際、いわゆる「解釈された」言語のほとんどは、ジャストインタイムコンパイルを通過/許可して、より高速に実行できるようにします。また、それらの一部は、実行する前にバイトコードにコンパイルする必要があります。

実際、動的で解釈されたものは完全に2つの異なるアイデアですが、相関関係があります。動的型付けを感じる人が仕事をより簡単に、より速くするので、彼らはコードが少し遅いが移植可能であることを気にしません。


1

Chrome、IE9、Firefox 3.1以降はすべてJavaScriptをネイティブバイナリにコンパイルし、JavaScriptは動的に型指定されます。

動的言語が歴史的に解釈される傾向があるのは、動的型付けと解釈(具体的には、コンパイルの欠如)の両方がスクリプト言語とスクリプトタスク全般に役立つ機能であるためだと思います。

また、パフォーマンスはこれらの言語で書かれた種類のプログラムに対する関心ではない(そうではなかった)ので、動的型付けと解釈のオーバーヘッドは言語の場合ほど大きな問題ではなかったその価値のパフォーマンス。


1

Pythonは通常、コンパイルされます。確かにバイトコードにコンパイルされ、その後解釈されます。

Perlも同様に機能します。

Common Lispは、通常、ネイティブコードまたはバイトコードのいずれかにコンパイルされます。これは実装ごとに異なります(さまざまな最適化設定に応じて、実装内である程度異なります)。


-5

はい。すべての動的言語はインタープリター言語です(ただし、インタープリター言語は非ダイナミック言語である場合があります)。

理由は簡単です。動的な場合は、バイナリコンパイルのレベルでダイナミズムを実行するインタープリターが必要です。

例 :PHP変数にデータを入力し、後で別のタイプのデータを挿入すると、各タイプには独自のバイナリ表現形式があるため、プログラムはバイナリコードにコンパイルできませんでした。インタープリターは、動的な方法でバイナリレベルでシフトを管理します


2
違う。動的言語をコンパイルすることができます(たとえば、JITや適応コンパイル手法を使用して非常に効率的な場合もあります)
Basile Starynkevitch

「大まかに言うと、JITコンパイルは、コンパイルされたコードの速度と解釈の柔軟性、およびインタープリターのオーバーヘッドを兼ね備えています...」 en.wikipedia.org/wiki/Just-in-time_compilationプログラムはコンパイルされません。あなたのための通訳
ClearMind


承知しました。あなたのリンクは次のように言及しています:「Selfの特徴の1つは、以前のSmalltalkシステムが使用していたのと同じ種類の仮想マシンシステムに基づいていることです。つまり、プログラムはC実行するためのメモリ環境全体。」スタンドアロンではない=バイナリコンパイルされていないバイナリコンパイルを実行するには仮想マシンが必要です
-ClearMind

1
コンパイラの定義が制限的すぎます。すべてのコンパイラがバイナリ実行可能ファイルを生成するわけではありません。最近の反例については、SBCLの実装を検討してください。最新のDragon BookLisp in Small Pieces
Basile Starynkevitch
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.