弱いタイピングを支持する議論は何ですか?


40

これは友人との話し合いの中で出てきたもので、良い議論を考え出すのは難しいと思いました。弱いタイピングはどのような利点をもたらしますか?


17
CooperとTorczonのEngineering a Compilerは、弱い型付けを、設計が不十分な型システムを採用していると定義しています。それは確かに誰にとっても有益だとは思えません。
コービン

@コービンマーチ:いいですね。リストに追加する必要があります。
ヨルグWミットタグ

5
最高の引数は、企業幹部によって与えられることができます:それは私が私のシステムを構築するために安価な人を雇うことができます
ベクトル

回答:


46

この種の議論の問題は、たとえば「静的タイピング」、「動的タイピング」、「明示的なタイピング」、「暗黙的なタイピング」、「 「ダックタイピング」、「構造タイピング」または「名義タイピング」。ヘック、「マニフェストタイピング」や「潜在タイピング」という用語でさえ、研究や議論の分野でまだ未定義のままです。

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

残念ながら、Nickの答えを除けば、回答者の誰も彼らの定義を提供することを気にせず、コメントのいくつかで生じる混乱を見ることができます。誰も実際に定義を提供していないので、わかりにくいですが、このページだけで、少なくとも3つの異なる定義を数えていると思います。

より一般的に使用される定義の一部は次のとおりです(そして、もちろん、それらのいずれもほとんど意味をなさないことがわかっていますが、実際に使用しているのはこれらの定義です)。

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

ただし、最も広く使用されていると思われる3つの定義は次のとおりです。

  • 弱い型付け=あなたの愚かなくだらないプログラミング言語/強い型付け=私の素晴らしいプログラミング言語
  • 弱いタイピング=他のすべてのプログラミング言語/強いタイピング=習得するのに苦労した唯一のプログラミング言語(通常はJava、C#またはC ++。この世界観)
  • 弱い型付け=私が理解できないすべての言語/強い型付け= Java(C#またはC ++を自由に代用)

誰もが「弱い型付けは」でも、何の定義に同意しない限り、それもその利点が何であるかを考えることには意味がありません。何の利点?何の定義が存在しない場合はさらに悪いことに、すべてのは、その後、誰もがちょうどその引数に合わせて、その定義をシフトすることができ、すべての議論はほとんどflamewarに委譲することが保証されます。

私自身、長年にわたって何度か自分自身の定義を個人的に変更してきましたが、今ではこの用語をもう有用とは考えないようになりました。また、(さまざまな定義の)弱い型付けがシェルスクリプトにあると考えていましたが、BashとPowerShellで同じ問題を解決しなければならないときはいつでも、自分がいかに間違っていたかを思い出します。


5
かなり皮肉な答えです!私はあなたがどこから来たのかを知っていますが、定義を提供していない人が「弱いおよび/または動的なタイピング」を参照していると推測するのに「十分」だと思います。私はそれが完璧ではないことを知っていますが、ほとんどの人は型システムを定義することになると調整するようです。
ニコール

7
@Renesis:私はそれを「リアリズム」と呼んでいます:-)半分の人は完全に異なることについて話していることに気づかず、他の人は彼らが話していることを知らないことを理解するのに十分な型システムについての議論を見てきましたすべての。数か月前、名前を付けない言語のコア開発リストで、パフォーマンスを改善するためのオプションの型システムの追加について議論がありました。その議論は一週間続き、何十人もの人々と何百ものメールが関係しました。ない1オプションの型システムと認識定義によっては、パフォーマンスを向上させることはできません。...
イェルクWミッターク

8
シニズムの+1!「強いタイピング= IDEが変数のタイプ(Intellisenseなど)を知っている場合、弱いタイピング=
知ら

1
型付けシステムのより明確に定義された名前には、弱点点の暗黙の価値判断が欠けています。
エヴァ

1
ゴージャスで、楽しく、正確。型システムについて学べば学ぶほど、ある言語がまったく違うという幻想の下でどれだけ苦しんでいるのかを実感しました。この概念がどれほど混乱を招くかは驚くべきことであり、弱点/強点が本物ではないということを認めるだけなら必要ないと思うので、実際にあるものについて話しましょう。おそらく何かを学ぶでしょう。
ブライアン

25

よく混同される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でさえ.toString()、オブジェクトをString; と結合するときの暗黙的な呼び出しにより、途中まで行かなければなりませんでした。そうしないと、Javaプログラマーは1日中呪いをかけます(ログステートメントは制御不能になります)。


両方の定義はhttp://en.wikipedia.org/wiki/Type_systemからのものです。それは私ができるよりも良いと言った。


1
動的型付けは、静的に型付けされた言語で大量のコード生成が必要な場合にも有益です。たとえば、C#のEntity Frameworkに必要なコード生成の量を、動的に型指定された言語(PHP、Pythonなど)のORMライブラリと比較します。いくつかは、IDEのIntelliSenseの面でメリットが...すべてがコード生成のコストを上回ると主張するかもしれないが
ディーン・ハーディング

3
あなたのコメント「// no i =((Array)data).length or Array myArr =(Array)data;」データの配列性はコンパイル時に証明できるため、実際には動的型付けとは関係ありません。静的に型付けされた言語は、instanceofから取得した知識を伝播できます。
ピーターテイラー

@ピーターテイラー、私はそれが単純なケースで本当だと思う、あなたはそうすることを知っていますか?ifブロックが使用されているか、他のより複雑な(実行時または動的な)ロジックであっても、次の行は合法でエラーから安全であるという点で、動的型付けに関係しています。
ニコール

@Renesis、私はしません、いいえ。しかし、MLファミリの言語は静的に型付けされ、型推論を使用するため、変数の型を明示的に記述する必要はほとんどありません。
ピーターテイラー

1
@Peter Taylorは正しいです。動的型付けの利点の多くは、Haskell、Scala、場合によってはC#など、より優れた静的型付けシステムを備えた言語で利用できます。動的型付けの主な利点は、HTML DOMのような本質的に型のないものを扱うことです。node.attrの代わりにnode ["attr"]を書くのはなぜですか?とにかく、実行時に常に解決されます。
マットオレニック

7

主な引数のための弱い型付けは、性能の一つです。(これは、述べられているOPの質問に答えるためです)。動的と静的、暗黙的と明示的について、多くの良い議論があります。等

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

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

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

とはいえ、ほとんどの場合、コンパイル時チェックまたは実行時チェックのいずれかの強力な型システムを使用すると、痛むよりも頻繁に役立ちます。


2
厳密に型指定された言語がCほど効率的にコンパイルできない理由はわかりません。しかし、コンパイラは非常に複雑でなければなりません。
9000

2
C ++は、そのような言語の1つの例です。C ++では、すべての型チェックはコンパイル時に行われ、実行時には何も行われません... RTTIが有効になっていない限り。
ベリンロリチュ

2
このパフォーマンスの議論に同意するかどうかはわかりません、興味深い見解です。
マーティンBa

2

通常、初心者は、Excel、javascript、vbscriptなどのように、弱いタイピングを簡単に把握できます。また、潜在的なエラーと開発速度の一部を交換します。

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


1
弱い型付けの言語と初心者に優しい言語の間に強い対応があるとは思いません。Rubyとpythonは強く型付けされており、一般に初心者に優しいと考えられています。Cは型付けが弱く、一般的に初心者の敵対的と見なされます。
sepp2k

いいえ、一般的な言語ではなく、タイピングについて話していました
-Homde

2
ダイナミックで強く型付けされたものが初心者に優しい組み合わせです。私は、人々が静的に型付けされた言語から動的に型付けされた言語に移行するとき、彼らも本当に混乱することを見てきました。しかし、ほとんどの場合、学校が最初にCまたはJavaを教えることになるので、動的に入力することから始めた人を見たことはありません。
jsternberg

3
@Mchl:静的/動的または強い/弱いタイピングとは関係ありません。型を宣言する必要があるのは、明示的/暗黙的な型指定です。
ヨルグWミットタグ

1
同様にそうかもしれません;)それで、私はまた明示的に暗黙の型付けされた言語に移動しました。私が間違っている場合は修正してくださいPascalは静的、強く、明示的に型付けされていますが、PHPは動的、弱く、暗黙的に型付けされていますか?
-Mchl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.