回答:
この種の議論の問題は、たとえば「静的タイピング」、「動的タイピング」、「明示的なタイピング」、「暗黙的なタイピング」、「 「ダックタイピング」、「構造タイピング」または「名義タイピング」。ヘック、「マニフェストタイピング」や「潜在タイピング」という用語でさえ、研究や議論の分野でまだ未定義のままです。
ですから、あなたの友人が議論の基礎となるのに十分安定した「弱いタイピング」という用語の定義を提供するまで、この質問に答えることは意味がありません。
残念ながら、Nickの答えを除けば、回答者の誰も彼らの定義を提供することを気にせず、コメントのいくつかで生じる混乱を見ることができます。誰も実際に定義を提供していないので、わかりにくいですが、このページだけで、少なくとも3つの異なる定義を数えていると思います。
より一般的に使用される定義の一部は次のとおりです(そして、もちろん、それらのいずれもほとんど意味をなさないことがわかっていますが、実際に使用しているのはこれらの定義です)。
ただし、最も広く使用されていると思われる3つの定義は次のとおりです。
誰もが「弱い型付けは」でも、何の定義に同意しない限りで、それもその利点が何であるかを考えることには意味がありません。何の利点?何の定義が存在しない場合はさらに悪いことに、すべてのは、その後、誰もがちょうどその引数に合わせて、その定義をシフトすることができ、すべての議論はほとんどflamewarに委譲することが保証されます。
私自身、長年にわたって何度か自分自身の定義を個人的に変更してきましたが、今ではこの用語をもう有用とは考えないようになりました。また、(さまざまな定義の)弱い型付けがシェルスクリプトにあると考えていましたが、BashとPowerShellで同じ問題を解決しなければならないときはいつでも、自分がいかに間違っていたかを思い出します。
よく混同される2つの主要な概念があることに注意してください。
プログラミング言語は、その型チェックの大部分がコンパイル時ではなく実行時に実行されるときに動的に型付けされると言われています。動的型付けでは、値には型がありますが、変数にはありません。つまり、変数は任意の型の値を参照できます。
ここでの利点は、多くの場合、「新しい」プログラマのためだけに却下されますが、どのプログラマにとっても便利です。
if (!(arr is Array)) arr = [arr]; // is, instanceof, .constructor ==, whatever
新しい値をキャストまたは割り当てる必要がある場合は、コードを少なくします。
if (data is Array)) {
i = data.length; // no i = ((Array)data).length or Array myArr=(Array)data;
}
弱い型付けとは、言語が使用されたときに暗黙的に型を変換(またはキャスト)することを意味します。
利点:
暗黙的なブール評価。どの型もブール値として評価できます。これには||
、ブール値に変換せずに割り当ての一部を使用できるなどの副次的な利点もあります。
var a = param || defaultValue;
繰り返しますが、以下のコード:
var num = 5;
var str = "Hello";
input.innerHTML = input.value = num;
for (var i=0; i < input.value; i++) { ... }
Javaでさえ.toString()
、オブジェクトをString
; と結合するときの暗黙的な呼び出しにより、途中まで行かなければなりませんでした。そうしないと、Javaプログラマーは1日中呪いをかけます(ログステートメントは制御不能になります)。
両方の定義はhttp://en.wikipedia.org/wiki/Type_systemからのものです。それは私ができるよりも良いと言った。
if
ブロックが使用されているか、他のより複雑な(実行時または動的な)ロジックであっても、次の行は合法でエラーから安全であるという点で、動的型付けに関係しています。
主な引数のための弱い型付けは、性能の一つです。(これは、述べられているOPの質問に答えるためです)。動的と静的、暗黙的と明示的について、多くの良い議論があります。等
Cは最も有名な弱く型付けされた言語であり、変数型の実行時チェックやコンパイル時チェックを実行しません。本質的には、あなたはキャストすることができますchar *
にint *
し、言語は気にしないでしょう。なぜこれをするのですか?
Cプログラミングは、アセンブリを使用して行う方法に非常に近いため、アドレスのみを考慮する場合があります。そのvoid *
理由から、参照をキャストまたは渡すことは珍しくありません。メモリがどのように構成されているかがわかっている場合(Cとアセンブリの問題)、アドレスに基づいてかなりクールな計算を行い、void *
必要な情報を取得できます。これにより、たとえばJavaで行わなければならないプロセスを短絡させることができます。
実行時の型チェックには特別なオーバーヘッドはありませんが、クリティカルセクションの速度を低下させるのに十分な場合があります。私はこの場合、主に組み込みプログラミングとリアルタイムシステムについて考えています。
とはいえ、ほとんどの場合、コンパイル時チェックまたは実行時チェックのいずれかの強力な型システムを使用すると、痛むよりも頻繁に役立ちます。
通常、初心者は、Excel、javascript、vbscriptなどのように、弱いタイピングを簡単に把握できます。また、潜在的なエラーと開発速度の一部を交換します。
このテーマに関する良い記事:強力なタイピングvs強力なテスト