web-dev-qa-db-ja.com

弱い型付けを支持する議論は何ですか?

これは友人との話し合いで出てきたものであり、私は自分が何か良い議論をすることを考えるのに苦労していた。弱い型付けはどのような利点をもたらしますか?

41
Fishtoaster

この種のディスカッションの問題は、たとえば「静的タイピング」、「動的タイピング」、「明示的タイピング」、「暗黙的タイピング」、「ダックタイピング」、「構造タイピング」または「ノミナルタイピング」。ヘック、「マニフェストタイピング」や「潜在タイピング」という用語でさえ、まだ研究と議論の未解決の領域ですが、おそらくより明確に定義されています。

したがって、あなたの友人が、議論の基礎として機能するのに十分安定した「弱いタイピング」という用語の定義を友人が提供するまで、この質問に答えることは意味がありません。

残念ながら、 Nickの回答 を除いて、回答者の誰も彼らの定義を提供することに悩まされていませんでした。コメントのいくつかに混乱が生じています。誰も実際にそれらの定義を提供していないので、言うのは難しいですが、私はこのページだけで、少なくとも3つの異なる定義を数えると思います。

より一般的に使用される定義の一部は次のとおりです(そして、はい、私はknowそれらのほとんどが意味をなさないことを意味しますが、それらは私が人々が実際に使用しているのを見た定義です):

  • 弱い型付け=安全でない型付け/強い型付け=安全な型付け
  • 弱い型付け=動的型付け/強い型付け=静的型付け
  • 弱いタイピング=ダックタイピング/強いタイピング=名目タイピング
  • 弱い型=構造型/強い型=名義型
  • 弱い型付け=暗黙の型付け/強い型付け=明示的な型付け
  • 弱い型=潜在型/強い型=マニフェスト型
  • 弱いタイピング=タイピングなし/強いタイピング=タイピング
  • 弱い型付け=暗黙のキャスト/強い型付け=明示的なキャストのみ
  • 弱い型付け=暗黙的または明示的なキャスト/強い型付け=キャストなし
  • 弱い型付け=暗黙的な変換/強い型付け=明示的な変換のみ
  • 弱い型付け=暗黙的または明示的な変換/強い型付け=変換なし
  • 弱い型付け=解釈/強い型付け=コンパイル
  • 弱いタイピング=遅い/強いタイピング=速い
  • 弱い型付け=ガベージコレクション/強い型付け=手動のメモリ管理
  • 弱い型付け=手動メモリ管理/強い型付け=ガベージコレクション
  • …その他多数

使用されていると思われる3つの定義mostが広く使用されている

  • 弱いタイピング=あなたの愚かなくだらないプログラミング言語/強いタイピング=私の超素晴らしいプログラミング言語
  • 弱い型付け=他のすべてのプログラミング言語/強い型付け=私がこれまで気になっていた唯一のプログラミング言語(通常はJava、C#またはC++;奇妙なことに、最初の唯一の言語としてHaskellやSchemeを学ぶ人々は共有していないようですこの世界観)
  • 弱いタイピング=理解できないすべての言語/強いタイピング= Java(自由にC#またはC++で置き換えます)

「弱いタイピング」の定義について誰もが同意しない限り、isであっても、その利点が何であるかについて考えることは意味がありません。何の利点?さらに悪いことに、定義がない場合すべての場合、誰もが定義をシフトして引数に合わせることができ、すべての議論が大いに盛り上がることが保証されます。

私自身、何年にもわたって自分自身の定義を数回変更してきましたが、今では、この用語はもう役に立たないとさえ考えるようになりました。私はまた、(さまざまな定義の)弱い型付けがシェルスクリプトにあると考えていましたが、BashとPowerShellで同じ問題を解決する必要があるときはいつでも、自分がいかに間違っているかを痛感します。

46
Jörg W Mittag

一般に混乱する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;
}
_

タイピングが緩いか弱い

弱い型付けとは、言語が使用されたときに暗黙的に型を変換(またはキャスト)することを意味します。

利点:

  • 任意の型の値をパラメーターとして関数に渡します。コールバック、柔軟なAPIに役立ち、クロージャーの実装を単純化します。
  • 暗黙のブール評価。任意のタイプをブール値として評価できます。これには、_||_の一部をブール値に変換せずに代入で使用できるなどの副次的な利点もあります。

    _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 からのものです。それは私ができるより良いと言った。

25
Nicole

主な引数for弱い型付けはパフォーマンスの1つです。 (これは、述べられているようにOPの質問に答えることです)。動的vs静的、暗黙的vs明示的について多くの良い議論があります。等.

Cは最も有名な弱く型付けされた言語であり、変数の型の実行時チェックやコンパイル時チェックを実行しません。本質的には、char *int *にキャストでき、言語は気にしません。では、なぜこれを行うのでしょうか。

Cプログラミングは、Assemblyで行う方法にかなり近いため、アドレスのみを気にする場合があります。そのため、void *参照をキャストまたは渡すのは珍しいことではありません。メモリがどのように構成されているか(Cとアセンブリについても)がわかっている場合は、void *のアドレスに基づいていくつかのすばらしい計算を行って、必要な情報を取得できます。これにより、たとえばJavaで実行する必要があるプロセスを短絡させることができます。

実行時の型チェックには特別なオーバーヘッドはありませんが、クリティカルセクションの速度を低下させるだけで十分な場合があります。この場合、私は主に組み込みプログラミングとリアルタイムシステムについて考えています。

とは言っても、ほとんどの場合、コンパイル時チェックまたはランタイムチェックのいずれかである強力な型システムを使用すると、問題が発生するよりも多くの場合に役立ちます。

7
Berin Loritsch

弱いタイピングは、たとえばExcel、javascript、vbscriptなどの場合、初心者にとっては一般的に簡単です。また、開発速度を潜在的なエラーと交換します。

この件に関する良い記事: 強いタイピングvs強いテスト

2
Homde