web-dev-qa-db-ja.com

誰かが強いタイピングと弱いタイピングの意味を教えてくれますか、どちらが良いですか?

誰かが強いタイピングと弱いタイピングの意味を教えてくれますか、どちらが良いですか?

37
zamfir

それは答えが世話をする理論になるでしょう、しかし練習側は無視されたようです...

厳密な型指定とは、あるタイプの変数を別のタイプの変数が期待されている場所で使用できない(または制限がある)ことを意味します。弱い型付けとは、さまざまな型を混合できることを意味します。 PHPたとえば、数値と文字列を混在させることができます。また、PHPは、弱く型付けされた言語であるため、文句を言うことはありません。

$message = "You are visitor number ".$count;

強く型付けされている場合は、$ countを整数から文字列に変換する必要があります。

$message = "you are visitor number ".(string)$count;

...または関数:

$message = "you are visitor number ".strval($count);

どちらが良いかについては、それが主観的です。強い型付けの擁護者は、いくつかのバグやエラーを回避し、変数の目的などを伝えるのに役立つことを教えてくれます。また、弱い型付けの擁護者は強い型付けを呼び出すことになるでしょう "- 常識によって無意味にされる不要な言語の綿毛、または類似したもの。ウィークタイピンググループのカードを運ぶメンバーとして、私は彼らが私の番号を持っていると言わなければなりません...しかし、私も彼らの番号を持っています[〜#〜] i [〜#〜 ]は文字列に入れることができます:)

53
JoeBloggs

「強いタイピング」とその反対の「弱いタイピング」は、「強い」と見なされるものの概念が質問する人によって異なる場合があるため、その意味はかなり弱いです。例えば。 Cはさまざまな作者から「強く型付けされた」と「弱く型付けされた」の両方と呼ばれていますが、それは実際に比較する対象によって異なります。

一般に、型システムは、他のものと同じ制約を表現できる場合、より強力であると見なされます。ただし、2つのタイプのシステムは比較できないことがよくあります。一方には機能があり、もう一方には不足している可能性があり、その逆もあります。相対的な強みについての議論は、個人的な好み次第です。

より強力な型システムを持つことは、コンパイラまたはランタイムのいずれかがより多くのエラーを報告することを意味します。これは通常、良いことですが、より多くの型情報を手動で提供する必要があるという犠牲を払う可能性があります。私は「強いタイピング」が一般的にはより良いと主張します、しかしあなたはコストを見なければなりません。

また、「静的に入力された」または「マニフェストに入力された」ではなく、「強く入力された」が誤って使用されることが多いことを理解することも重要です。 「静的型付け」とは、コンパイル時に型チェックが行われることを意味し、「マニフェスト型付け」とは、型が明示的に宣言されることを意味します。マニフェスト型付けは、おそらく型システムを強化する最もよく知られている方法です(Javaと考えてください)が、型推論などの他の方法で強度を追加できます。

14
Peter Becker

弱い型付けは動的な型付けと同じではないことを繰り返し述べたいと思います。

これは主題についてかなりよく書かれた記事であり、強い、弱い、静的、動的の型システムの違いがわからない場合は、ぜひ読んでもらうことをお勧めします。短い答えで予想されるよりもはるかに優れた違いを詳しく説明し、いくつかの非常に啓発的な例があります。

http://en.wikipedia.org/wiki/Type_system

5
Greg Sexton

ストロングタイピングは、最新のプログラミング言語で最も一般的な型モデルです。これらの言語には、実行時に型の値を知るという1つの単純な機能があります。強い型付けの言語は、2つ以上の異なる種類の型の混合操作を防ぐと言えます。 Javaの例を次に示します。

String foo = "Hello, world!";
Object obj = foo;

String bar = (String) obj;
Date baz = (Date) obj; // This line will throw an error

Javaは厳密に型指定されたプログラミング言語であるため、プログラムがClassCastExceptionがスローされるコードの最後の行に到達するまで、前の例は完全にうまく機能します。

weak typed言語について話すとき、Perlはその1つです。次の例は、Perlが2つの異なるタイプの混合で問題を起こさない方法を示しています。

$a = 10;
$b = "a";
$c = $a . $b;
print $c; # returns 10a

これがお役に立てば幸いです。

ありがとう。

4
miksiii

この記事は素晴らしい読み物です: http://blogs.Perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html 片付けました同様の質問に答えようとすることを研究しているとき、私にとって多くのことを望んでいます。

強くて弱いタイピング:

おそらく、タイプシステムが分類される最も一般的な方法は、「強い」または「弱い」です。これらの単語にはほとんど意味がないため、これは残念です。限られた範囲で、2つの言語を非常に類似した型システムと比較し、1つの言語をこれら2つのシステムのどちらが強いかを指定することができます。それを超えて、言葉はまったく何も意味しません。

静的型と動的型

これは、本当の意味を持つ型システムの唯一の一般的な分類です。実際のところ、その重要性はしばしば過小評価されています[...]動的型システムと静的型システムは2つのまったく異なるものであり、その目的はたまたま部分的に重複しています。

静的型システムとは、コンパイラがソースコードを調べて構文の一部にラベル(「型」と呼ばれる)を割り当て、それを使用してプログラムの動作について何かを推測するメカニズムです。動的型システムは、プログラムが使用するデータの種類(偶然に、その「型」とも呼ばれる)を追跡するコードをコンパイラが生成するメカニズムです。もちろん、これら2つのシステムのそれぞれで同じWordの「タイプ」を使用することは、完全に偶然ではありません。しかし、それはある種の弱い歴史的重要性を持っていると最もよく理解されています。 「タイプ」が両方のシステムで実際に同じことを意味する世界観を見つけようとすると、大きな混乱が生じます。そうではありません。

明示的/暗黙的なタイプ:

これらの用語が使用されている場合、それらは、コンパイラーがプログラムの部分の静的タイプについて推論する範囲を指します。すべてのプログラミング言語には、型に関する何らかの推論があります。いくつかは他のものよりも持っています。 MLとHaskellには暗黙の型があります。つまり、型宣言は必要ありません(使用する言語や拡張機能によってはごくわずかです)。 JavaおよびAdaには非常に明示的な型があり、1つは常に型を宣言しています。)上記すべてに(たとえば、CやC++と比較して)強力な静的型システムがあります。

2
gonz

言語での強い/弱いタイピングは、タイプ変換をどれほど簡単に行うことができるかに関連しています。

たとえばPythonの場合:

str = 5 + 'a' 
# would throw an error since it does not want to cast one type to the other implicitly.

C言語の場合:

int a = 5;
a = 5 + 'c';
/* is fine, because C treats 'c' as an integer in this case */

したがって、PythonはCよりも強く型付けされています(この観点から)。

1
mehmet

これは、強いタイピングと弱いタイピングを理解するのに役立ちます。.....

厳密なタイピング:通常はコンパイル時に、できるだけ早く変数の型をチェックします。不一致タイプ間の操作の混合を防ぎます。

厳密に型指定されたプログラミング言語は、次のようなものです。

  • すべての変数(またはデータ型)はコンパイル時に既知です
  • 入力規則が厳密に適用されます(整数が期待される場所では文字列を使用できません)
  • タイピング規則のすべての例外により、コンパイル時エラーが発生します

弱いタイピング:弱いタイピングは、システムのタイプのチェックを可能な限り遅く、通常は実行時まで遅らせます。これでは、明示的な変換なしでタイプを混合できます。

「弱い型付け」のプログラミング言語は、強い型付けではないプログラミング言語です。

推奨は、必要なものによって異なります。スクリプトや優れたものについては、できる限り少ないコードを記述したいため、通常は弱いタイピングが必要になります。大きなプログラムでは、強い型付けによりコンパイル時のエラーを減らすことができます。

0
Debiprasad