web-dev-qa-db-ja.com

Clojureが動的に型付けされるのはなぜですか?

私が一番好きなのは、さまざまなプログラミング言語について読むことです。現在、私はScalaを学んでいますが、それは私がGroovy、Clojure、Python、およびその他の多くに興味がないことを意味しません。これらの言語はすべて、独特のルックアンドフィールといくつかの特徴を持っています機能。Clojureの場合、私はこれらの設計上の決定の1つを理解していません。私が知る限り、Clojureはその機能的パラダイムに非常に重点を置いており、可能な限り不変の「変数」を使用することを強制しています。あなたの値は不変ですが、言語が動的に型付けされるのはなぜですか?

ClojureのWebサイトには次のように書かれています。

何よりもまず、Clojureは動的です。つまり、Clojureプログラムは、コンパイルして実行するだけでなく、対話できるものです。

まあ、それは完全に奇妙に聞こえます。プログラムがコンパイルされている場合、それを変更することはできません。もちろん、それと「対話」することができます。それがUIの使用目的ですが、Webサイトはきちんとした「動的」なGUIを意味しません。

Clojureは動的型付けからどのように利益を得ますか

動的型付けの一般的な利点ではなく、Clojureの特殊なケースを意味します。

動的型システムは関数型プログラミングの改善にどのように役立ちますか

繰り返しますが、「int a」をこぼさないことの喜びを知っています。ソースコード全体に渡って、型推論は多くの苦痛を和らげることができます。したがって、動的型付けが関数型言語の概念をどのようにサポートしているかを知りたいだけです。

50
lhk

同意します。純粋に関数型の言語でも、インタラクティブなread-eval-print-loopを使用でき、型推論を使用するとより簡単になります。 Clojureは「jvmのLISP」になることでLISPプログラマーを引き付けたかったので、他のlispsのように動的であることを選びました。もう1つの要因は、型システムを言語の最初のステップとして設計する必要があり、言語の実装者がそのステップをスキップするほうが高速であることです。

11
Tobu

プログラムがコンパイルされている場合、それを変更することはできません。

これは間違っています。 LISP(ClojureはLISP方言と見なすことができます)やSmalltalkなどの画像ベースのシステムでは、コンパイルされた環境を変更できます。このような言語での開発は、通常、実行中のシステムでの作業、関数定義、マクロ定義、パラメーターなどの追加と変更を意味します(追加とは、コンパイルしてイメージにロードすることを意味します)。

これには多くの利点があります。まず、すべてのツールはプログラムと直接対話することができ、システムの動作を推測する必要はありません。また、コンパイルされた各ユニットは非常に小さいため、長いコンパイルの一時停止はありません(すべてを再コンパイルすることは非常にまれです)。 NASA JPLは、宇宙で数十万キロ離れたプローブで実行中のLISPシステムを修正しました。

そのようなシステムの場合、実行時に型情報を利用できるようにするのは自然なことです(つまり、動的型付けとは)。もちろん、コンパイル時に型推論と型チェックを行うことを妨げるものは何もありません。これらの概念は直交しています。最新のLISP実装は通常、両方を実行できます。

22
Svante

まず第一に、ClojureはLISPであり、伝統的にLispは常に動的に型付けされてきました。

第二に、引用した抜粋のように、Clojureは動的言語であると述べました。これは、とりわけ、実行時に新しい関数を定義したり、実行時に任意のコードを評価したりできることを意味します。これらすべてを静的に型付けされた言語で実行することは困難または不可能です(場所全体にキャストを埋め込むことなしに)。

別の理由は、マクロがタイプエラーのデバッグを非常に複雑にする可能性があることです。マクロで生成されたコードによって生成された型エラーに対して意味のあるエラーメッセージを生成することは、コンパイラにとってかなりの作業になると思います。

14
sepp2k

Clojureは、そのマクロシステムとcode-as-data哲学を備えたLISPであり、この哲学は静的型システムとほとんど一致しません。たとえば、そのようなlistのタイプは次のようになります。

(defn square [x] (* x x))

それにもかかわらず、静的型付けが必要な場合、Clojureは type hints を使用してそれを許可します。

7
ffriend

それが世界/市場が必要とするものだからです。すでに構築されているものを構築する意味はありません。

JVMには静的に型付けされた言語がすでにあると聞きました;)

5
Arthur Ulfeldt