web-dev-qa-db-ja.com

プログラミング言語を動的と見なすものは何ですか?

プログラミング言語が動的言語と呼ばれるのは何が適していますか?動的プログラミング言語を使用してどのような問題を解決する必要がありますか?静的プログラミング言語と動的プログラミング言語の主な違いは何ですか?

41
Gainster

私はここに白黒があるとは思いません-動的と静的の間に全体のスペクトルがあります。

スペクトルの両側で2つの極端な例を考えて、それがどこに行くのかを見てみましょう。

Haskellは、静的な方向では極端です。

  • これは、コンパイル時にチェックされる強力な型システムを備えています。プログラムをコンパイルする場合、一般的なエラーではなく、一般的なエラーはありません。
  • コンパイルされた形式は、haskellプログラム(バイナリー)とは大きく異なります。そのため、予測していない限り、実行時の反映と変更は困難です。オリジナルを解釈する場合と比較して、コンパイラーはファンキーな最適化を自由に行うことができるため、結果は潜在的に効率的です。

したがって、静的言語の場合、私は通常考える:かなり長いコンパイル時間の分析が必要な場合、型システムは愚かな間違いを犯すのを防ぐだけでなく、実際に有効ないくつかのことをするのを防ぎ、実行時にプログラムを操作したい場合は、プログラムの実行時の表現(つまり、そのコンパイルされた形式)は実際の言語自体とは異なるため、多少面倒になります。また、私がそれを予見していなかった場合、後で変更するのは面倒かもしれません。

Clojureは、動的な方向で極端です。

  • これにも型システムがありますが、コンパイル時には型チェックは行われません。多くの一般的なエラーは、プログラムを実行することによってのみ発見できます。
  • Clojureプログラムは、本質的には単なるClojureリスト(データ構造)であり、そのように操作できます。したがって、ランタイムリフレクションを行う場合、実際にはClojureプログラムを入力するときと同じように処理します。ランタイムフォームはプログラミング言語自体に非常に近いものです。したがって、基本的には、実行時に「タイプ時」と同じことを実行できます。その結果、コンパイラは多くの事前最適化を行うことができないため、ランタイムパフォーマンスが低下する可能性があります。

動的言語の場合、私は通常、短いコンパイル手順(基本的には構文の読み取りのみ)、非常に高速でインクリメンタルな開発であり、実際に何ができるかに制限はありませんが、愚かな間違いを防ぐことはできません。

他の投稿が示しているように、他の言語はより中立的な立場を取ろうとします-例えばF#やC#などの静的言語は、個別のAPIを介してリフレクション機能を提供します。もちろん、F#のREPLなどの巧妙なツールを使用することで、段階的な開発を提供できます。動的言語は、オプションの型指定(Racket、Strongtalkなど)を提供する場合があり、一般に、コンパイル時の健全性チェックの欠如を相殺するためのより高度なテストフレームワークがあるようです。また、タイプヒントは、コンパイル時にチェックされませんが、より効率的なコード(Clojureなど)を生成するのに役立つヒントです。

与えられた問題に適切なツールを見つけようとしている場合、これは確かにあなたが見ることができる側面の1つですが、それだけではどちらの方法でも決定を強制することはありません。あなたが検討している言語の他の特性について考えてみてください-それは機能的であるかOOまたは論理または...言語ですか?それは私が必要とするもののための良いフレームワークを持っていますか?行います安定性とバイナリの下位互換性が必要ですか、それともコンパイラーのチャーンに対応できますか?広範なツールが必要ですか?など。

31

動的言語はruntimeで多くのタスクを実行しますが、静的言語はcompile-timeで実行します。
問題のタスクは通常、タイプシステム、メソッドディスパッチ、コード生成の1つ以上です。

これは、それらの使用法に関する質問にもかなり答えます。

8
Jaroslav Jandek

使用されているさまざまな定義のlotがありますが、one可能な違いは次のとおりです。

  • dynamic言語は通常dynamicタイピングを使用します。
  • static言語は通常staticタイピングを使用します。

一部の言語は、静的型または動的型のいずれかに分類することが困難です。たとえば、C#は伝統的に静的型付き言語と見なされていますが、C#4.0は dynamic と呼ばれる静的型を導入しました。

6
Mark Byers

動的言語と呼ばれるプログラミング言語を修飾するもの。

動的言語は通常、実行時に柔軟性を提供する言語と見なされます。これは静的型システムと必ずしも競合しないことに注意してください。たとえば、F#は静的に型付けされているにもかかわらず、会議で「.NETのお気に入りの動的言語」に最近投票されました。 F#はメタ循環評価、Read-Evaluate-Print-Loop(REPL)、および動的なタイピング(ソート)などのランタイム機能を提供するため、多くの人々はF#を動的言語と見なしています。また、型推論は、F#コードがほとんどの静的型付き言語(C、C++、Java、C#2、Scalaなど)のような型宣言で散らかされていないことを意味します。

動的言語が解決するために私が行くべき問題は何ですか?.

一般に、時間と空間がそれほど重要でない場合は、ランタイムの柔軟性とランタイムコンパイルなどの機能を備えた言語を常に使用することをお勧めします。

4
Jon Harrop

このスレッドは問題をかなりうまくカバーしています:

静的/動的vs強/弱

3
Shakakai