質問

簡単な質問んいくプログラミング(庄)とめの言語のようにC++/Javaおよび解釈される言語のようにPython/Javascriptです。個人的に見る私のコードはほとんどいつもより強固な私がプログラム静的型付き言語。しかし、ほとんどすべて解釈される言語に出会う用いた動的タイピング(PHP、Perl、Python、など)。ぜとめの言語使用の静的タイピング(ほとんどの時間)ができないの嫌staticコマンドプロンプトに解釈される言語でデザイン。

なぜ急傾斜の切断?でも自然の一部の解釈される。OOP?

役に立ちましたか?

解決

興味深い質問です。ちなみに、私の作のmaintainerの メリットをもたらすことが期待さ (コンパイラのためのサポートに対するコミットメント、ということも博士課程にコンパイラのための動的言語、思いくつかを提供することができ講演会を開催します。

という誤った前提です。の著者のPHP、Perl、Python、Ruby、Luaなどなかったデザイン"の解釈される言語で、"設計的言語で実施します。では、これらが支援通訳ボランティアは、通いやすく書くよりコンパイラでコンパイル.

Java初の実現のための解釈され、静的型言語です。通訳者が存在するための静的言語:ウと存と通訳者が使用する人気の通訳がいたはずっと前から気付いていた。になっている人する事が可能なため REPL, これにより開発します。

とはいえ、抵抗感がある静的タイピングの動的言語コミュニティります。が当たり前のように行われている静的タイプシステムのC,C++とJavaは、デフォルト値が設定され、プライベートビーチがあります。思いをするものではあプログラミングPythonかなり楽しいよC++.

アポイントのその他のもの

  • dlamblinと:"思いを強く感じることがあったものの特集vs解釈することを示唆動的過静的な文字を入力す" 、こちらをクリックして下さいっても間違いあります。編集の動的な言語は難しいです。が主に eval 決考えに幅広くご利用いただけるJavascriptのRubyなどがある。メリットをもたらすことが期待統PHP先までの時間がまだ実行時通訳対応 evals. eval もできない分析を静的に最適化コンパイラがあ 涼しい技術 必要がなければ健全性

  • にdamblinの対応 アンドリュー-ヘア:きのコースを静的解析に通訳者は、誤りを見つけ 実行時は、どのウ ghci います。ることを期待したいときの通訳者の使用言語が必要です。dlamblinはもちろん右しているとは言い分析ではない。

  • アンドリューハ回答 を前提としquestioners間違った前提で、同様にしてもどの原因となります。■■しかし、彼のおかげろう"については、静的解析の動的言語".非常に難しいです基本的には、多くの博士を記述する方法で、どんやってます。ものです。

  • 最も正しい答えをこれまでの Ivo Wetzel.しかし、ポイントについても語って扱うことができ行時にコンパイラ、および多くのコンパイラでコンパイルが存在するLispおよびスキームがこのタイプの動的拘束力を有します。があり、そのトリッキー.

他のヒント

静的解析を行うには、コンパイル・ステップが存在しないので、

インタプリタ言語は動的な型付けを使用しています。コンパイルされた言語は、コンパイル時に静的解析を行うの、それらが動作するよう、あらゆるタイプのエラーは、開発者に報告されていることを意味します。

あなたが静的型付け言語は強制は、実行のコンテキスト外のルールを入力することをコンパイラを持っていることを考慮すれば理解しやすいです。タイプのルールは、実行のコンテキスト内でインタプリタによって強制されなければならないので、インタプリタ言語は静的に解析されることはありません。

私はそれがために解釈された言語の性質上だと思う、彼らがダイナミックになりたいので、あなたは、実行時に物事を変更することができます。このため、コンパイラは、正確に次のコード行がexcecutedされた後のプログラムの状態だ知っていることはありません。

(Pythonで)次のシナリオを想像します:

import random
foo = 1

def doSomeStuffWithFoo():
    global foo
    foo = random.randint(0, 1)

def asign():
    global foo
    if foo == 1:
        return 20
    else:
        return "Test"


def toBeStaticallyAnalyzed():
    myValue = asign()

    # A "Compiler" may throw an error here because foo == 0, but at runtime foo maybe 1, so the compiler would be wrong with its assumption
    myValue += 20


doSomeStuffWithFoo() # Foo could be 1 or 0 now... or 4 ;)
toBeStaticallyAnalyzed()

あなたがうまく行けば見ることができるように、コンパイラはこのような状況では何の意味も持たないだろう。 Acutallyそれは数よりも、他の「myValue」は多分何かその可能性について警告できます。 「myValueは」文字列の場合、20はimplictilyので、エラーが発生しないだろう、あまりにも文字列に変換されますので、しかし、その後はJavaScriptに失敗しています。あなたはすべての場所で無用の警告の数千を得るかもしれない、と私は、コンパイラのつもりであるということを考えていないようにします。

柔軟性は常に価格が付属して、あなたはそれがより慎重に、他の言葉であなたは上記のような状況でコンパイラですより深いあなたのプログラムを見て、またはプログラムを取る必要があります。

だから、コンパイラとしてあなたのソリューション? )

: - ":除く試し" で固定し、それ

コンパイラ+静的タイプ=効率的なマシンコード
コンパイラ+ダイナミックタイプ=非効率的なマシンコード

次の擬似コードを考えてみましょう

function foo(a, b) {
    return a+b
}

A静的言語は、aおよびbは整数であり、そして

までコンパイルすること(宣言または推論によって)知ることができるようになります
%reg = addi a,b
とにかく

または似たような、ます。

の動的言語のコンパイラは、
にコードを放出しなければなりません 1.彼らをチェックの種類およびb
各ケースまたはケースの組み合わせをハンドル2

%reg1 = typeof a
beq %reg1, int, a_int_case
beq %reg1, float, a_float_case
beq %reg1, string, a_string_case

label a_int_case
%reg1 = typeof b
beq %reg1, int, a_int_b_int_case
beq %reg1, float, a_int_b_float_case
beq %reg1, string, a_int_b_string_case

label a_int_b_int_case
%out = addi a,b
goto done

label a_int_b_float_case
%tmp = mkfloat a
%out = addf %tmp,b
goto done

... Etc. I can't finish

あなたがより賢くマシンコードを生成することができますが、あなたは、コードの助け発生たくさんすることができないであろう - コンパイルではない動的言語のための主要な勝利になります。

通訳が書き込みにはるかに簡単であり、コンパイルはあなたに多くの良いをしないので、なぜインタプリタを書くか?

(ジャストインタイムコンパイラは、実際に型情報を持っており、単一の文に右のダウンをコンパイルすることができます彼らは実際には、静的なタイプのシステムよりも多くの情報を持っており、理論的にはより良い行うことができますすべてのアセンブラがシミュレートされます。。。に任意の類似実マシン上で実行することができ、実際のコードでは、純粋に偶然です。)

私のメインのインタプリタ言語の一つはPerlので、私のコンパイル言語の一つが、Objective-Cのですが、私は強く解釈対コンパイルについては何の特別な存在だと感じたことはありませんので、多分それはだと静的型付けを超える提案ダイナミックます。

私はそれが両側が他と思考を見ていることは明らかだと思う、「それにはいくつかの利点があります。」静的型付けと強制されたものを維持しやすくなることができますがそれは、いくつかの動的な型の柔軟性を得るために、いくつかのアプリケーションに簡単です。

私はアンドリューうさぎさんに反対します説明するけれども。純粋なインタプリタ言語は前処理ステップで追加する必要があります、したがって、純粋に静的型付けのエラーを実行する前に、プログラマに警告するために解釈されていないが、それが起こると、実行時に型エラーを投げ妨げるものではありません。コンパイルを欠いていることを意味するものではありませんので、静的な型チェックが発生しないことがあります。しかし、実行時に型エラーを取得して以来、コンパイル時に1つを得るなどとして有用ではない、またはプリフライトチェック中に、私は、そのような状況での静的型付けの「利点」はより厄介であるように見えることができますどのように見ることができますしたがって、動的型付けがもたらす利点の賛成で投げ出さます。

個人的にあなたが結果としてよりよくより保守コードを書くと、あなたのインタプリタ言語を設計していたので、あなたがあなたのタイプの静的を維持することを好むことを最初から知っていた場合は、

、何も静的型付け一つとして、言語を設計からあなたを停止するべきではありませんます。

理論的には「のインタプリタ言語のwikiの記事を引用すると、任意の言語は、コンパイルまたは解釈することができます、この指定があるため一般的な実装の実践と言語のないいくつかの基本的な性質を純粋に適用されるように。 "
ちょうどタイピングのまともな
ウィキ記事のがあります。

を動的に解釈言語はあなたがプログラミングの方法でより多くの自由を与えるタイプされました。これは、メタが可能であることをプログラミングすることができます。変数は、実行時に作成されることができます。無名ハッシュと無名配列は、これまで事前に手の前に何かを宣言しなくても、実行時に任意の時点で作成することを可能にします。未決定の情報はこれまで、事前にすべてのキーを宣言せずに、ハッシュにinputedすることができます。あなたは未定ランダム入力から作成されたサブルーチンを持つことができます。あなたは、動的に実行することができ、プログラムコードを供給することができます。インタプリタ言語は、一般的にプログラミングを制限し、そこからチェーンを解放します。あなたがあなたが静的型付け言語のソース・ファイルに入力するものに限定されています。あなたは動的型付け言語で以下でより多く行うことができます。

情報は、実行時に決定する必要があり、新しい変数は、実行時にこの情報を格納するために行われる必要があるため、

はほとんどのロボットはより多くのインタプリタ言語で、今日の契約を作られています。機械学習は周りに基づく情報が解釈されています。人間として私たち自身は、ロボットがそのように設計されている理由である通訳です。将来は本当に解釈されます。もちろん、あなたは通訳が将来アセンブリコードで構築されていない限り、静的型付け言語は離れて行くことは決してありませんビルド通訳に静的型付けの言語を必要としています。ほとんどの通訳は、これらの日、静的型付け言語の上に構築されます。

インタプリタ言語は、動的な環境に優れています。あなたは、なぜない、実行時に新しいコード/情報を解釈することができます。動的プログラミングでは、あなたの本当に良いなら、あなたは今までにすべてを入力せずに変数とハッシュを作成することができ、コードを作成することができます。あなたは、大量のデータを扱う場合は、大幅にラインの量を減らすことができます。インタプリタ言語は、通常はこれを可能にするためにできるように、実行時に変数の種類を追跡するので、あなたはすべてのあなたの情報をプリントアウトするために、データダンパーを使用することができます。あなたは、必要最小限のC ++でこれを行うことはできません。唯一の時間c ++とCは、コンパイル時には何かが起こっているのを知っています。ご自分で何かを自分で実装していない限り、それ以降ます。

あなたは、動的な環境で作業する場合は特に、これらの日のソースファイルにあまり縛られることを望んで。あなたのすべての操作を行うと、あなたの可能性を制限しています。あなたの首が深いで動的にコードを解釈し、あなたが戻って任意の静的型付け言語に行くたら、あなたはまだ無限の考え方で考えているので、あなたのコードの下難しくダムにそれを見つけるでしょう。あなたの心は、ソースファイルに入力されているものに限定されるものでは再びに戻って返す必要があります。

スタイルのプログラミングの方法で: 静的に型付けされたコードは、静的な結果が得られます。動的に型付けされたコードは、動的または静的な結果を生成する。

あなたは静的型付け言語は、そのための素晴らしいですそして、知られているもの以外の動作を変更したことがない何かをプログラミングするつもりならば。動的挙動であれば、あなたの取引を動的型付け言語は、これらのケースのためののの方が適しています。すべては、ほとんどの状況に依存します。

すべての言語は、その浮き沈みを持っています。ただ、選択しなきゃと賢く選びます。

私は、静的な型付けはコンパイラのが容易になり考えると、それはコンパイル言語で、それの存在することを(ない場合のみ)主な理由です。

それらは内部合うのではなく、ヒープ上のどこかに浮かぶデータのためにラベルを付ける必要がありますデータのためのプレーサーとしてではないと考えられているので、

はインタプリタ言語にとっては、変数が(値だけが持っている)タイプを持っていないと仮定する方が簡単です。

プログラマほしいですが、彼はその変数が(代入の例)指定された型の値を保持し、常にアサートすることができるなら。言語にそれを構築する理由はありません。もちろん、あなたがコンパイル言語を持っていることを制御のない同じ種類のこと。

あなたはおそらく、あなたが明示的に各変数の型を宣言する必要があるが、そうでない場合、それは静的型付けと非常に慎重に、プログラマから必要とする複雑なジェネリック型を細工することを面白い事をする方がはるかに簡単だ言語を持つことができます。

一方、

。あなたが任意の動的にコンパイル型付き(静的ではなく、JIT)の言語を知っていますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top