これは友人との話し合いで出てきたものであり、私は自分が何か良い議論をすることを考えるのに苦労していた。弱い型付けはどのような利点をもたらしますか?
この種のディスカッションの問題は、たとえば「静的タイピング」、「動的タイピング」、「明示的タイピング」、「暗黙的タイピング」、「ダックタイピング」、「構造タイピング」または「ノミナルタイピング」。ヘック、「マニフェストタイピング」や「潜在タイピング」という用語でさえ、まだ研究と議論の未解決の領域ですが、おそらくより明確に定義されています。
したがって、あなたの友人が、議論の基礎として機能するのに十分安定した「弱いタイピング」という用語の定義を友人が提供するまで、この質問に答えることは意味がありません。
残念ながら、 Nickの回答 を除いて、回答者の誰も彼らの定義を提供することに悩まされていませんでした。コメントのいくつかに混乱が生じています。誰も実際にそれらの定義を提供していないので、言うのは難しいですが、私はこのページだけで、少なくとも3つの異なる定義を数えると思います。
より一般的に使用される定義の一部は次のとおりです(そして、はい、私はknowそれらのほとんどが意味をなさないことを意味しますが、それらは私が人々が実際に使用しているのを見た定義です):
使用されていると思われる3つの定義mostが広く使用されている
「弱いタイピング」の定義について誰もが同意しない限り、isであっても、その利点が何であるかについて考えることは意味がありません。何の利点?さらに悪いことに、定義がない場合すべての場合、誰もが定義をシフトして引数に合わせることができ、すべての議論が大いに盛り上がることが保証されます。
私自身、何年にもわたって自分自身の定義を数回変更してきましたが、今では、この用語はもう役に立たないとさえ考えるようになりました。私はまた、(さまざまな定義の)弱い型付けがシェルスクリプトにあると考えていましたが、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はオブジェクトをString
と組み合わせるときに.toString()
を暗黙的に呼び出して途中まで行かなければなりませんでした。それ以外の場合Java =プログラマーは1日中悪態をつくことになります(ログステートメントは制御不能になります)。
どちらの定義も http://en.wikipedia.org/wiki/Type_system からのものです。それは私ができるより良いと言った。
主な引数for弱い型付けはパフォーマンスの1つです。 (これは、述べられているようにOPの質問に答えることです)。動的vs静的、暗黙的vs明示的について多くの良い議論があります。等.
Cは最も有名な弱く型付けされた言語であり、変数の型の実行時チェックやコンパイル時チェックを実行しません。本質的には、char *
をint *
にキャストでき、言語は気にしません。では、なぜこれを行うのでしょうか。
Cプログラミングは、Assemblyで行う方法にかなり近いため、アドレスのみを気にする場合があります。そのため、void *
参照をキャストまたは渡すのは珍しいことではありません。メモリがどのように構成されているか(Cとアセンブリについても)がわかっている場合は、void *
のアドレスに基づいていくつかのすばらしい計算を行って、必要な情報を取得できます。これにより、たとえばJavaで実行する必要があるプロセスを短絡させることができます。
実行時の型チェックには特別なオーバーヘッドはありませんが、クリティカルセクションの速度を低下させるだけで十分な場合があります。この場合、私は主に組み込みプログラミングとリアルタイムシステムについて考えています。
とは言っても、ほとんどの場合、コンパイル時チェックまたはランタイムチェックのいずれかである強力な型システムを使用すると、問題が発生するよりも多くの場合に役立ちます。
弱いタイピングは、たとえばExcel、javascript、vbscriptなどの場合、初心者にとっては一般的に簡単です。また、開発速度を潜在的なエラーと交換します。
この件に関する良い記事: 強いタイピングvs強いテスト