プロトタイピングに適しているのは、静的に型付けされた言語ですか、それとも動的に型付けされた言語ですか?[閉まっている]


8

新しいシステムの設計を行うとき、静的に型付けされた言語(Haskellなど)または動的に型付けされた言語(Rubyなど)から始める方が良いですか?

私が考えることができる引数:

  • 静的言語を使用すると、プログラムが行うことの仕様とスコープをすばやく作成できます。動的な言語を使用すると、実用的なデモをすばやく作成して、レビューのために顧客に提示できます。

  • 動的言語を使用すると、設計を変更するときにデータ構造を再配置したりコードをリファクタリングしたりする必要がなくなることがよくあります。静的言語を使用すると、実装前に型を定義して、コードを非常に小さく維持できます。

  • 静的言語では、プログラムが何をするかを事前に理解する必要があります。動的言語を使用すると、コードの記述を開始して、デザインを有機的に成長させることができます。ポール・グラハムがハッカーと画家で言っているように:

    プログラミング言語は、プログラムを考えるためのものであり、すでに考えたプログラムを表現するためのものではありません。

  • 静的言語を使用すると、コンパイラーは多くのタイプのバグを識別するのに役立ちます。動的言語を使用すると、バグのテストと発見をより早く開始できます。

静的型付けと動的型付けには、プロトタイピングに関する限り、長所と短所があります。ただし、どちらも同じように有効なアプローチを好むようです。あなたの経験に基づいて、どちらが最終的に優れていますか?


ノート

自然言語でのプロトタイピング

考慮すべき言語の3番目のタイプ:自然言語。コードでプロトタイプを作成する代わりに、書面でプロトタイプを作成できます。その後、顧客はドキュメントを読んでデザインを批判することができますが、実際のデモをいじることはできません。適切に記述されていれば、ドキュメントはどの言語でも簡単に実装できます。警告:

  • ドキュメンテーションは読むのが面倒で、見ることができないと要約するのが難しいかもしれません。私は、顧客がテキスト(および画像)の壁を読むのではなく、機能するものを試してみたいと思います。

  • タイプ定義ではなく英語でアプリケーションのプロトタイプを作成することは、より冗長で具体的ではありません。

Haskellのタイプは説明的です

型は、C ++やJavaなどの多くの静的言語よりも、Haskellで特に説明的であることに注意してください。たとえば、Haskellに次の型シグネチャを持つ関数があるとします。

foo :: forall a. [a] -> a

任意のタイプについて、タイプaの項目のリストを取り、タイプaの値を返す関数a

関数の名前を知らなくても、私は次のことを知っています。

  • Haskellは純粋に機能しているため、入出力を実行したり、値を変更したりすることはありません(unsafePerformIOを誤って使用しない限り)。

  • 任意の型をサポートする必要があるため、アイテムを整数などとして扱うことはできません。

  • それは持っている(つまり、あるいは例外をスローしたり無限ループに入る)入力リストを使用します。そうでなければ、それはどこaから型の値を取得しますか?

したがって、この関数が実行できる唯一のこと(失敗以外)は、入力リストから項目を抽出して返すことです。どのアイテムを使用するかはまだわかりませんが、[a] -> a他のすべてについて教えてくれます。


4
より表現力のある方。
Dietbuddha 2011

1
自然言語に言及しましたが、Powerpoint(またはPhotoshop)でのプログラミングを忘れました。多くの人がこれも非常に便利だと思っています。
sylvanaar

動的言語と静的言語についての多くの議論は誤解されていると思います。たとえば、動的言語でデザインを変更するときに、データ構造を再配置したりコードをリファクタリングしたりする必要がないというのは、私にはまったく当てはまりません。動的言語では、変数宣言を行う必要がないため、時間を節約できます。しかし、より多くの型エラーをデバッグする必要もあります。同様に、静的言語ではプログラムも有機的に成長します。....あなたはデータ構造のための具体的な種類を指定することができますが、それは即座にプログラムのためのデザインを指定すると一致しない
チェルボ

回答:


8

これについては、Paul Grahamの側に行きます。動的型付けは、プログラムを有機的に作成するのに最も役立ちます。これは、プロトタイピングが本来あるべきものです。ポイントは、最終製品自体ではなく、最終製品の機能を実証する何かを迅速に実行することです。静的型付けとは、正式な正しさに関するものです。少なくともそれは(HaskellやAgdaのように)必要があります—しかし、動的型付けは実用的な正確さに関するものであり、プロトタイピングの際に重要になります。

適切な言語では、最適化として静的型ヒントを提供したり、将来の変更に備えて安全性を追加したりできます。プロトタイプによって要件が解明され、固まったら、プロトタイプを静的型付き言語で書き直すこともできます。 。


2
動的言語は型情報を省略します。これは非常に簡潔になります。コンパイラは構造を大幅に最適化しようとしたことがないので、どんな構造でも簡単に検査できます。アルゴリズム的に複雑なコードを記述する必要があるときは、Pythonから始めます。遅くても正しい実装を行う方がはるかに簡単です。次に、最適なデータ構造などを使用してJavaに移植します。Haskellを使用する場合は、おそらくClojureをペアとして使用します。
9000

6

静的型と動的型の問題、多くの人考えているほど重要ではないと思います。

  1. 両方使っています。ある状況では、一方が他方よりも単に便利な場合があります。これはほとんどの場合、特定のツール/ライブラリ/テクノロジーを使用する必要があるために発生します。そこで、他のコンポーネントでうまく機能するものを選びました。

  2. 動的言語について人々が好むことの1つは、多くが解釈されることだと思います。REPLコンソールを使用して、対話形式で実行中にそれらを変更できます。eval関数または同等の機能を持つ任意の言語でこれを行うことができます。したがって、少なくともこの1つの側面では、型システムは実際には無関係です。

  3. シェルスクリプトのような正式な型システムがまったくないものを使用して、プロトタイプを構築できます。(ただし、REPLはあります...)


ライブラリの+1。動的であるためPythonを使用しませんが、電池が含まれているためです。
Matthieu M.

4

あなたにとって、そしてあなたがやろうとしていることに対して、最もうまくいくことをしてください。私は現在、静的言語でプロトタイプを作成するのが最善だと思います。表現力豊かな型システムを使用したプロトタイピングでは、次のようなすばらしいことができます。

  • 対応する実装なしで関数シグネチャを記述します。私の初期のHaskellコードには、次のようなステートメントが含まれていることがよくあります。

    foo :: Foo-> Bar
    foo _ =エラー「未定義」

これは、foo実際にの作業コピーがなくても、それを使用するコードを書くときに何が行われるのかを知りたいからですfoo。他の言語throw new Exception()では、これはのようなもので実現されます。これは、実際のコードでは決して実行できないことですが、初期段階では非常に役立ちます。

  • 最初に型を記述せずにコードを記述し、型推論を使用してコードについて学習します。私は頻繁に:tGHCi(Haskell REPL)を呼び出して、自分が書いたばかりの内容を発見しました。たとえば、これにより、コードの一部がどの程度一般的であるかがわかり、コードのさまざまな部分と対応する構造の要件が明らかになります。

Conal Elliotは、HaskellがiPhoneの開発を次のように支援するという彼の見解を説明しました。

「Haskellを書いていると、命令型の機構が見えなくなり、本質的なパターンを見るしかなかった。これらのパターンをいじくり回すと、新しい洞察が得られた...この高次の怠惰な言語が豊富であることに感謝している思考型ツールとしての静的型付け。洞察を得て間違いを取り除くのに役立ちます。言語が実行可能であることも私にとってのボーナスです。」 ソース

そのとおり。関数型プログラミングの神々の1人は、Haskellの第一の価値は実装言語ではなくモデリング言語であると考えています。他の達人は同様のことを考えています。ErikMeijerはHaskellを使用して、最終的にオブジェクト指向フレームワークに入る基礎となる代数とパターンを明確にします。

厳密な言語でプロトタイピングを行う場合の最も重要な理由は、「プロトタイプ化」したいものが、Paul Grahamが資金提供したい気の利いた初期段階のWebアプリではないことが多いためです。多くの場合、プロトタイプを作成する必要があります。

  1. 現在のインフラストラクチャへの拡張
  2. 特定の言語のAPI
  3. 新機能だけでなく、アーキテクチャ

これらの各ケースでは、最終的な実装言語に意味のある方法で近い言語を本当に使用する必要があります。

でも一瞬

 foo :: forall a. [a] -> a

「正しい」(常にエラーまたはを生成せずに終了するundefined)インスタンスはありません。それは

[] :: forall a. [a]

ただし、インスタンスがないため、[]to からtoまでの関数aは存在できaません。


4

機能またはデザインのプロトタイプを意味しますか?

機能のプロトタイプは、最終的な実装言語で最初から機能の開発を始める前に機能をクライアントに示すことを目的としているため、バグや保守性を気にせずに、できるだけ早く機能を作成することが重要です。動的言語は、静的に型付けされた言語では受け入れられない醜いハックを許可することで、正確さと生産性のトレードオフを可能にします。これにより、理論的には、使い捨てのプロトタイプを作成するのに適しています。もちろん、実際には、開発者のスキルは言語よりも重要ですが、HaskellとRubyの両方で同等に熟練したコーダーは、おそらくRubyでプロトタイプをより速く作成し、結果として生じるコードは混乱します。

設計プロトタイプとは、試行錯誤を通じて適切なプログラム設計を見つけることです。醜いハックは役に立たない-設計を迅速にリファクタリングする機能のみが重要です。大規模なリファクタリングの基本的な要件は、一連の自動テストです。動的言語では、これは通常、開発者が作成した単体テストのスイートであり、作成にかなりの時間がかかります。静的に型付けされた言語では、型シグネチャは自動テストとして機能し、コードの変更によって引き起こされた不整合をコンパイラに検出させます。静的に型付けされた言語は、動的に型付けされた言語では実現できない方法でリファクタリングを実行します。


0

動的、特に実際の製品が実際の問題を実際に解決するのに十分な速さであるように、実際の製品がいくつかの一般的な静的言語の1つである必要があることを知っている場合。これを行うと、プロトタイプを最終製品として使用するミスを自動的に防ぐことができます。


0

最もよく知っている言語。

動的か静的かは本当に重要ではありません。関数型オブジェクト指向かオブジェクト指向かは、実際には重要ではありません。最適な機能、機能など、通常はすべて無意味です。

プロトタイピングの唯一のポイントは、プログラムを大幅に変更する必要があるため、実装(コード作成)の速度です。そして、あなたはあなたの最高の言語で最速でなければなりません。

動的と静的の両方で最高の言語が2つある場合は、静的言語を選択します。静的なものは通常複雑さを処理できますが、動的なものはある時点で失敗します。そして、プロトタイプがどれほど大きくなるかは、だれにもわかりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.