新しいシステムの設計を行うとき、静的に型付けされた言語(Haskellなど)または動的に型付けされた言語(Rubyなど)から始める方が良いですか?
私が考えることができる引数:
静的言語を使用すると、プログラムが行うことの仕様とスコープをすばやく作成できます。動的な言語を使用すると、実用的なデモをすばやく作成して、レビューのために顧客に提示できます。
動的言語を使用すると、設計を変更するときにデータ構造を再配置したりコードをリファクタリングしたりする必要がなくなることがよくあります。静的言語を使用すると、実装前に型を定義して、コードを非常に小さく維持できます。
静的言語では、プログラムが何をするかを事前に理解する必要があります。動的言語を使用すると、コードの記述を開始して、デザインを有機的に成長させることができます。ポール・グラハムがハッカーと画家で言っているように:
プログラミング言語は、プログラムを考えるためのものであり、すでに考えたプログラムを表現するためのものではありません。
静的言語を使用すると、コンパイラーは多くのタイプのバグを識別するのに役立ちます。動的言語を使用すると、バグのテストと発見をより早く開始できます。
静的型付けと動的型付けには、プロトタイピングに関する限り、長所と短所があります。ただし、どちらも同じように有効なアプローチを好むようです。あなたの経験に基づいて、どちらが最終的に優れていますか?
ノート
自然言語でのプロトタイピング
考慮すべき言語の3番目のタイプ:自然言語。コードでプロトタイプを作成する代わりに、書面でプロトタイプを作成できます。その後、顧客はドキュメントを読んでデザインを批判することができますが、実際のデモをいじることはできません。適切に記述されていれば、ドキュメントはどの言語でも簡単に実装できます。警告:
ドキュメンテーションは読むのが面倒で、見ることができないと要約するのが難しいかもしれません。私は、顧客がテキスト(および画像)の壁を読むのではなく、機能するものを試してみたいと思います。
タイプ定義ではなく英語でアプリケーションのプロトタイプを作成することは、より冗長で具体的ではありません。
Haskellのタイプは説明的です
型は、C ++やJavaなどの多くの静的言語よりも、Haskellで特に説明的であることに注意してください。たとえば、Haskellに次の型シグネチャを持つ関数があるとします。
foo :: forall a. [a] -> a
任意のタイプについて、タイプa
の項目のリストを取り、タイプa
の値を返す関数a
。
関数の名前を知らなくても、私は次のことを知っています。
Haskellは純粋に機能しているため、入出力を実行したり、値を変更したりすることはありません(unsafePerformIOを誤って使用しない限り)。
任意の型をサポートする必要があるため、アイテムを整数などとして扱うことはできません。
それは持っている(つまり、あるいは例外をスローしたり無限ループに入る)入力リストを使用します。そうでなければ、それはどこ
a
から型の値を取得しますか?
したがって、この関数が実行できる唯一のこと(失敗以外)は、入力リストから項目を抽出して返すことです。どのアイテムを使用するかはまだわかりませんが、[a] -> a
他のすべてについて教えてくれます。