強い型付けと弱い型付けの意味と、どちらが優れているか教えてもらえますか?
8 に答える
それが理論の答えになりますが、実践面は無視されているようです...
強い型付けとは、あるタイプの変数を別のタイプの変数が予想される場所で使用できないことを意味します(または使用に制限があります)。弱いタイピングとは、さまざまなタイプを混在させることができることを意味します。たとえばPHPでは、数字と文字列を混在させることができますが、PHPは弱い型の言語であるため、文句を言うことはありません。
$message = "You are visitor number ".$count;
強く型付けされている場合は、$ countを整数から文字列に変換する必要があります。通常は、次のいずれかを使用してキャストします。
$message = "you are visitor number ".(string)$count;
...または関数:
$message = "you are visitor number ".strval($count);
どちらが良いかは主観的です。強い型付けの支持者は、いくつかのバグやエラーを回避し、変数の目的などを伝えるのに役立つことを教えてくれます。また、弱い型付けの支持者は強い型付けを「不要」と呼ぶことも教えてくれます。常識によって無意味にされる言語の綿毛」、または同様のもの。弱いタイプのグループのカードを持っているメンバーとして、私は彼らが私の番号を持っていると言わなければならないでしょう...しかし私も彼らを持っています、そして私はそれを文字列に入れることができます:)
「強いタイピング」とその反対の「弱いタイピング」は、意味がやや弱いです。これは、「強い」と見なされるものの概念が、尋ねる人によって異なる可能性があるためです。たとえば、C はさまざまな作成者によって「強く型付けされた」と「弱く型付けされた」の両方と呼ばれてきましたが、実際には何と比較するかによって異なります。
一般に、型システムが別の型システムと同じ制約を表現できる場合、その型システムはより強力であると見なされます。ただし、2 つの型システムを比較できないことはよくあります。一方の型システムに欠けている機能がある場合もあれば、その逆の場合もあります。相対的な強みについての議論は、個人の好み次第です。
より強力な型システムを持つことは、コンパイラまたはランタイムのいずれかがより多くのエラーを報告することを意味します。これは通常は良いことですが、より多くの型情報を手動で提供しなければならないという犠牲を払うことになるかもしれません。一般的には「強力な型付け」の方が優れていると思いますが、コストを考慮する必要があります。
「静的に型付けされた」または「マニフェスト型付けされた」の代わりに、「強く型付けされた」がしばしば誤って使用されることを認識することも重要です。「静的に型付けされた」とは、コンパイル時に型チェックがあることを意味し、「マニフェスト型付けされた」とは、型が明示的に宣言されていることを意味します。マニフェスト型付けはおそらく、型システムをより強力にする最もよく知られている方法ですが (Java を考えてください)、型推論などの他の方法で強度を追加することもできます。
繰り返しますが、弱い型付けは動的型付けと同じではありません。
これは、このテーマについてかなりよく書かれた記事であり、強い型システム、弱い型システム、静的型システム、および動的型システムの違いがよくわからない場合は、一読することをお勧めします。短い回答で予想されるよりもはるかに優れた違いを詳しく説明しており、非常に啓発的な例がいくつかあります。
強い型付けは、最新のプログラミング言語で最も一般的な型モデルです。これらの言語には、実行時に型の値を認識するという単純な機能が 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 がスローされる最後のコード行にプログラムが到達するまで、前の例は完全に機能します。
弱い型付け言語について話すとき、Perl はその 1 つです。次の例は、Perl が 2 つの異なる型を混在させても問題がないことを示しています。
$a = 10;
$b = "a";
$c = $a . $b;
print $c; # returns 10a
これがお役に立てば幸いです。
ありがとう。
この記事は素晴らしい読み物です: http://blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html同様の質問に答えようとしていますが、他の人もそれが役立つことを願っています.
強い型付けと弱い型付け:
型システムを分類する最も一般的な方法は、おそらく「強い」または「弱い」です。これらの言葉にはほとんど意味がないため、これは残念なことです。限られた範囲で、非常に類似した型システムを持つ 2 つの言語を比較し、その 2 つのシステムのうち強い方を指定することができます。それを超えて、言葉はまったく何の意味もありません。
静的型と動的型
これは、真の意味を持つ型システムのほぼ唯一の一般的な分類です。実際のところ、その重要性はしばしば過小評価されています [...] 動的型システムと静的型システムは 2 つの完全に異なるものであり、その目標はたまたま部分的に重複しています。
静的型システムは、コンパイラがソース コードを調べてラベル (「型」と呼ばれる) を構文の一部に割り当て、それらを使用してプログラムの動作について何かを推測するメカニズムです。動的型システムは、コンパイラがコードを生成して、プログラムで使用されるデータの種類 (偶然にも、「型」とも呼ばれます) を追跡するためのメカニズムです。もちろん、これら 2 つのシステムのそれぞれで同じ「タイプ」という単語が使用されているのは、まったくの偶然ではありません。しかし、それは一種の弱い歴史的意義を持っていると最もよく理解されています. 両方のシステムで「タイプ」が実際に同じものを意味する世界観を見つけようとすると、大きな混乱が生じます。そうではありません。
明示的/暗黙的な型:
これらの用語が使用される場合、それらはコンパイラーがプログラムの部分の静的タイプについて推論する範囲を指します。すべてのプログラミング言語には、型に関する何らかの形式の推論があります。いくつかは他よりも多く持っています。ML と Haskell には暗黙的な型があり、型宣言は必要ありません (使用する言語と拡張機能によっては、ほとんど必要ありません)。Java と Ada には非常に明示的な型があり、常に型を宣言しています。上記のすべては (たとえば、C や C++ と比較して) 強力な静的型システムを備えています。
言語の強い/弱い型付けは、型変換の容易さに関連しています。
たとえば、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 よりも強く型付けされています (この観点から)。
これは、Strong Typing と Weak Typing を理解するのに役立つかもしれません........
強力な型付け:通常はコンパイル時に、できるだけ早く変数の型をチェックします。一致しないタイプ間で操作が混在するのを防ぎます。
厳密に型指定されたプログラミング言語とは、次のような言語です。
- すべての変数 (またはデータ型) はコンパイル時に認識されます
- 型付け規則が厳密に適用されます (整数が期待される場所で文字列を使用することはできません)。
- 入力規則に対するすべての例外は、コンパイル時エラーになります
弱い型付け:弱い型付けは、システムの型のチェックをできるだけ遅く (通常は実行時まで) 遅らせます。これでは、明示的な変換なしで型を混在させることができます。
「弱い型付け」プログラミング言語は、単純に強い型付けされていない言語です。
どちらが好ましいかは、あなたが望むものによって異なります。スクリプトや優れたものについては、できるだけ少ないコードを記述したいため、通常は弱い型付けが必要です。大きなプログラムでは、強力な型付けによってコンパイル時のエラーを減らすことができます。
弱い型付けとは、変数の型を指定しないことを意味し、強い型付けとは、各変数に厳密な型を与えることを意味します。
それぞれに利点があり、弱い型付け (または動的型付けと呼ばれることが多い) があり、柔軟性が高く、プログラマーが必要とするコードが少なくて済みます。一方、強力な型付けは、開発者に多くの作業を要求しますが、その代わりに、コードを実行する前に、コードのコンパイル時に多くの間違いを警告することができます。動的型付けは、コードが実行されるまで、これらの単純な問題の発見を遅らせる可能性があります。
目の前のタスクによっては、弱い型付けが強い型付けよりも優れている場合もあれば、その逆の場合もありますが、ほとんどは好みの問題です。弱い型付けはスクリプト言語で一般的に使用されますが、強い型付けはほとんどのコンパイル済み言語で使用されます。