2012-02-11 9 views
1

プログラミングに関しては、フィーチャーxとフィーチャーyについて強い意見はありません。私はすべてが適切な用途を持っていると思う。動的タイピングバグとは何ですか?

そして、私はできるだけ多くのプログラミング言語を読んでいます。私は最高のアイデアを引き出し、それらをすべて比較することができます(HaskellからLisp、CからErlangまで)。

しかし、静的と動的な型定義の比較について読んだとき、動的な型定義の欠点は、コンパイラが '変数のタイプをチェックすることはできません。私はプログラミングするとき

は今、私は虫がたくさんありますが、私はが原因このような何かにバグがありませんでし持っている、と私は実際に、そのようなバグの例がどうなるか視覚化に苦労しています。多分あなたはどこかの文字列の代わりに整数を使用したことを忘れていたでしょうか?これはあまりにも工夫されているようです...

私は趣味ではなく、生きるためのプログラムです。多分、これらの種類のバグは、物事について異なる考え方を持つ人々が集まるときにのみ来ます。私は実際に実際の例を探しています。あなたはある型から別の型の変数を変更したとき

+1

私のように見えるAPIの一部として関数foo(datablob1、id、args)を与えます。あなたは何を渡してほしいと思いますか?あなたはidがStringかIntegerかを推測しますか?あなたはargsが配列であると思いますか?何の配列? datablobとは何ですか?それはどのような特性を持っていますか?良い文書がないとどうやって知ることができますか? – scriptocalypse

+0

私は通常、ドキュメント内で関数を調べます。これはほとんどの人がそれをする方法ではありませんか? – Nick

+0

"良い文書がない場合" – scriptocalypse

答えて

3

例は次のようになります。

setType(String type) 

その後、後であなたがより効率的な列挙に種類を変更することを決定した:

setType(SomeEnum type) 

あなたが行うと強く型付けされた言語では、setTypeが呼び出されたときにエラーが発生します。そうすれば、それらをすばやく修正し、欠席していないことを確認することができます。動的な型付き言語では、このようなエラーは発生せず、これらのインスタンスを自分で探す必要があります。

強く型付けされた言語は、より効率的な構造でデータを格納できるため、一般的に高速です(型はコンパイルタイプで知られているため)。例は、C配列とPHP配列です。 C配列はコンパクトですが、PHP配列に含まれる動的データを管理するためにかなり大きなオーバーヘッドがあります。

+0

ああ、それは良い点です。だから、基本的にはコードがたくさんあり、元の構造に戻っていくつかの部分を変更すると、修正が必要な他の場所で多くのことを逃してしまうでしょう。 – Nick

+0

少し考えてみたら、こうした種類の大量のプログラム変更を追跡するためのシステムが開発されているようです。 "コンパイルしてエラーを訂正しようとすると"私には厄介なようです。多分、可変型をデータベースに結びつけ、それらの関係を記述するもの。そのようなシステムは存在しますか? – Nick

+3

非公式のドキュメントは、開発中の実際のシステムでは、ほとんど常に不完全であり、同期が外れています。一方、タイプは機械で検査された文書です。 –

2

@Laurentはあなたの質問に非常にうまく答えました。私はこれを追加したいと思います。たとえば、TypedJSというJavaScript(動的型指定言語)用のテスト/動的バグ発見ツールがあります。これは、動的プログラミングのために発生するバグを防ぐために設計されています。 TypedJSを防ぐためにしようと

例のバグは、このスクリーンショットで見ることができます。

TypedJS

+0

これは興味深いです。だから、事実の後ではなく、製品が出荷される前に、人間の間違いを犯すのは基本的には? – Nick

+0

@Nick正確に。 (1、2、3のように、私のコメントの長さについてはそれほど不平を言わない... :) – Behrang

2

種類とプログラミングのための彼らの価値について言うことができるがたくさんあります。例えば、ここでは(とりわけ)関数型言語OCamlので見つかった高度な型システムのanecdotical利点を議論CACMの最近の記事である:

http://cacm.acm.org/magazines/2011/11/138203-ocaml-for-the-masses/

より理にかなったノートの最初のカップルに以下の古典的な論文のページがプログラムエラーの種類を分類し、型システムの基本的なメリットのいくつかを説明します。後者の論文は比較的古いものですので

http://www.lucacardelli.name/Papers/TypeSystems.pdf

、私は二つのことを追加してみましょう。

最初に、型指定されている言語と必要な(明示的な)型宣言との間に違いがあります。いくつかの現代語は、特に機能キャンプから、洗練されたタイプのシステムを持っていますが、ほとんどの場合単一のタイプを書き留める必要はありません。すべての型はコンパイラによって推論されます。

第2に、型システムは基本的に論理です。コンパイラによってチェックされるプログラムの特定のプロパティを表現するロジック。原則として、このロジックがどれほど強力であるかに制限はありません。タイプシステムが強力な言語があります。ソートされたリストの型とソート関数の型を表現します。そのため、関数は実際にソートアルゴリズムの正しい実装であるかどうかをタイプチェックします。明らかに、コンパイラが実際にそのようなプログラムの正当性をチェックできれば、非常に便利です。しかし、タイプシステムの表現力と使いやすさにはトレードオフがあります。したがって、実際には、ほとんどの主流言語は単純化してしまいます。しかし、特別なドメインは、より洗練されたタイプのシステムの恩恵を受けることができます。

関連する問題