2009-02-28 8 views
3

弱いタイプはいつ避けるべきですか?大きなプロジェクトでは弱いタイプが推奨されませんか?左辺が次のように厳密に型付けされている場合、それはルールの例外ですか?弱いタイプはいつ避けるべきですか?

int i = 5 
    string sz = i 
    sz = sz + "1" 
    i = sz 

いずれの言語も上記と似た構文をサポートしていますか?弱いタイプや状況に関連する賛否両論についてもっと教えてください。あなたが正確に何を行うには、マシンを教えていないので、

+0

この質問は意味をなさない。「弱いタイピング」および「強いタイピング」という用語は、定義された意味を持たない。あなたがそれらを定義しない限り、この質問に答えることは不可能です。 –

+2

OPが与えた例は、弱いタイプと強いタイプの違いを説明するのに十分だと思います。 –

答えて

16

「弱いタイピング」と「ダイナミックなタイピング」を混同していると思います。

「弱い型指定」という用語は、厳密に型指定されていないことを意味します。つまり、メモリ位置の値は、その型の値と異なることがあります。

Cは、弱く型付けされた言語の例です。なお、このようなコードを書くことを可能にする:

typedef struct 
{ 
    int x; 
    int y; 

} FooBar; 

FooBar foo; 
char * pStr = &foo; 
pStr[0] = 'H'; 
pStr[1] = 'i'; 
pStr[2] = '\0'; 

すなわち、それは文字の配列であったかのようにFooBarのインスタンスが処理されることを可能にします。

強く型付けされた言語では、許可されません。コンパイラエラーが生成されるか、実行時例外がスローされますが、いつでも、FooBarメモリアドレスには有効なFooBarではないデータが含まれます。 C#やJava、Lispの、Javaスクリプト、およびRubyの

は事のこのタイプは許可されません言語の例です。彼らは強く型付けされています。これらの言語の

一部は、変数の型は実行時まで知られていないことを意味し、変数の型はコンパイル時に割り当てられている、といくつかは、「動的型付け」されていることを意味し、「静的型付け」されています。 「静的対動的」および「弱対強」は直交問題です。例えば、Lispは "強力な動的型付け"言語であり、 "C"は "弱い静的型付け言語"である。他の人が指摘しているよう

また、プログラマによって指定された「推論されたタイプ」とタイプの間の区別があります。 C#の "var"キーワードは、型推論の例です。コンパイラではなく、実行時に比べて、コンパイル時に変数の型を推測しかし、それはまだ静的型付け構造です。

だから、何あなたの質問が本当に求めていることである。

相対的なメリットと静的型付けの 欠点、ダイナミック タイピング、弱い型付け、stongタイピング、 推論された静的な型、およびユーザー は何ですか指定された静的型。

静的を

静的型付けは3主要な利点がある入力:

  1. より良いツールのサポート
  2. 削減を、私は以下のこれらのすべてに答えを提供

特定の種類のバグの可能性が高いフード

  • パフォーマンス
  • ユーザーエクスペリエンスとintellisenceのようなものの正確性、およびリファクタリングが原因静的な型が提供する追加情報の静的型付け言語で大幅に改善されています。 「a。コードエディタで "a"が静的型の場合、コンパイラは "。"の後ろに合法的に来る可能性のあるものをすべて知っているので、正確な補完リストを表示することができます。彼らははるかに限られている。

    また、プログラムにコンパイルエラーなしでリファクタリングツールは、特定のメソッド、変数、またはタイプが使用されているすべての場所を特定することができます。これは、動的型付け言語でそれを行うことはできません。

    静的に型付けされた言語の賛成主義者は、そのような主張をするのが好きです。しかし、静的型付けされた言語の敵対者は、彼らが捉えるバグは些細なものであり、テストによって捕らえられると主張します。通知を得るスペルミスのある変数やメソッドの名前のようなものが表示されています。

    静的な型指定された言語は、MicrosoftのSAL(または同様のツール)などと組み合わせると、潜在的なセキュリティ問題を見つけるのに役立つ、より優れた「データフロー分析」も可能にします。

    最後に、静的型付けを使用すると、コンパイラはさらに多くの最適化を行うことができ、より高速なコードを生成することができます。

    欠点:

    静的型付けのための主な欠点は、それはあなたができることを制限していることです。動的に型指定された言語でプログラムを記述することができ、静的に型指定された言語で記述することはできません。 Ruby on Railsはこれの良い例です。

    動的型付け

    動的型付けの大きな利点は、それがはるかに強力静的型付けよりもあるということです。あなたはそれで本当にクールなものをたくさんすることができます。

    もう1つは、タイピングが少なくて済むということです。あなたはどこにでも型を指定する必要はありません。

    欠点:

    動的型付け2つのメインドローバックを持っています

    1. あなたは、コンパイラやIDEそれは重要に適していないのです
    2. からできるだけ多く「手の保持」を得ることはありませんパフォーマンスシナリオたとえば、RubyにOSカーネルを書き込む人はいません。

    強い型付け:

    強い型付けの最大の利点は、セキュリティです。強力な型付けを強制するには、通常、何らかのタイプの実行時サポートが必要です。プログラムが型安全性を保証することができれば、バッファオーバーランのような多くのセキュリティ問題がなくなります。

    弱い型付け:強い型付けの

    大きな欠点、および弱い型付けの大きな利点は、パフォーマンスです。

    好きなようにメモリにアクセスできる場合は、より高速なコードを書くことができます。例えば、データベースは、生のバイトを書き出すだけで、 "ISerializable"インターフェースのようなものに頼らずに、オブジェクトをディスクにスワップできます。ビデオゲームは、多くの小さなオブジェクトのデストラクタを実行するのではなく、大きなバッファで1つの空きを実行するだけで、1つのレベルに関連するすべてのデータを捨てることができます。

    これらのことを実行できることは弱いタイピングが必要です。

    型推論

    型推論は、できるだけ多くのタイピングを必要とせずに、静的型付けの利点の多くを可能にします。

    ユーザー指定の種類

    彼らは明示的になりたいので、一部の人々はちょうど型推論が好きではありません。これはもっとスタイルのことです。

    +0

    ++、C#とjavaと同じカテゴリのjavascript? – dkretz

    +1

    Javascriptは動的に型付けされていますが、C#とJavaは静的に型付けされています。 しかし、3つはすべて厳密に型指定されています。 –

    +0

    技術的には、C#では弱い型指定が可能ですが、プロジェクトオプションの変更と組み合わせて、「安全でない」キーワードを使用して非常に具体的に要求する必要があります。 – Qwertie

    1

    弱い種類は、その性質上、強いタイプよりも少ない丈夫である - 代わりにマシンは、あなたが何を意味するかを理解する必要があります。これはしばしばかなり適切に機能しますが、一般的に結果がどうなるべきかは不明です。たとえば、浮動小数点数にfloatを掛けたものは何ですか?

    +2

    それは明らかに戦略です。ロックオン! \ m/ –

    +0

    あなたが覚えておかなければならないことの1つは、機械語が弱く型付けされていることです。 (あなたは、マシンコードよりもコンピュータにしたいことについて、もっと具体的にすることはできません)。 これは静的に型指定されています(命令はオペランド型を示します)。ただし、強制は行われないため、型が弱いです。 –

    3

    弱いタイピングは、言語簡略化の試みです。これは価値ある目標ですが、弱いタイピングは貧弱な解決策です。 COMバリアントで使用されているような

    弱い型付けは、この問題を解決するための初期の試みだったが、それは危険をはらんでいると率直に言って、それは価値があるよりも多くのトラブルを引き起こします。あらゆる種類のゴミを取り除くVisual Basicプログラマーでさえ、これを悪い考えとして正しく固定し、MicrosoftのETC(拡張型変換)をEvil Type Castに逆戻りさせました。

    弱いタイピングと推測されたタイピングを混同しないでください。推論された型は、コンパイル時にコンテキストから推測される強い型付けです。良い例は、varキーワードです。これは、C#でLINQ式の値を受け取るのに適した変数を宣言するために使用されます。一方

    は、弱いタイプは、発現が評価され、毎回が推測されます。これは質問のサンプルコードに示されています。もう1つの例は、Cで型なしポインタを使用することです。

    弱い型指定と同じ問題に対処すると、は、弱い型付けに関連する問題を導入するがありません。したがって、ホスト言語が利用可能になるたびに、これは好ましい代替手段です。

    +1

    +1は同じ文章で 'ごみ'と '後ろ向き'(それ以前は見たことがない)です。確かな答え。 – bernie

    +0

    -1動的型定義と型推論を混同しています。 http://herbsutter.wordpress.com/2008/06/20/type-in​​ference-vs-staticdynamic-typing/ –

    +0

    を参照してください。LINQは動的な型指定を使用しません。実際には、LINQはタイプすることとまったく関係がありません。ちょうどa)興味深いいくつかのプロパティを持つAPIと、b)APIの使用を簡素化する内部DSLの構文的な砂糖です。 –

    0

    私は、ASP/VBScriptのコーディングを行なったし、弱い型付けすることができます「strictオプション」なしでレガシーコードで動作します。

    多くの場合、特に経験の少ないプログラマーの手には、たいてい地獄でした。我々は、すべての愚かなエラーには年を取って診断することができます。愚かな例の

    一つは、このようなものだった:

    'Config 
        Dim pass 
        pass = "asdasd" 
    
    
    If NOT pass = Request("p") Then 
    Response.Write "login failed" 
    REsponse.End() 
    End If 
    

    これまでのところは良いが、ユーザーの変更は、整数パスワードを渡す場合、intは=文字列のパスを渡すので、それはもう動作しません、どうなったと思います! (クエスチングから)。私はそれが動作するはずだと思ったが、それはなかった私はコードの正確な部分を覚えていない

    私の代わりに愚かなデバッグセッションの私は、変数のタイプを正確に入力するための余分な秒を過ごすことができ、弱い型付けを憎みます。

    だけで、特に大規模なプロジェクトに私の経験では、入れて、特に未経験の開発者とそれだけでトラブルです。

    +0

    問題はパスがパスの代わりにNOT'''d == Request( "p")でしたか?暗黙的な変換を行っている質問の例では、これはまだ私の状況で起こるでしょうか?私が誤解しない限り、私はそれがwouldntと確信しています。 –

    +0

    問題は、ASPが文字列として整数と他の文字列の一方を入力して比較しようとしましたが、明らかに失敗しました。開発者として、私はいつもそれを文字列にキャストすることを期待していました。 –

    2

    ほとんどの場合、これらは避けてください。必要とされる場所を考えることができる唯一のコードの種類は、いくつかのポインタを必要とする低レベルのコードです。

    あなたの質問に答えるために、Cはそのようなコードをサポートしています(もちろん文字列型を持たないものを除く)、PHPやPerlのようなものです。

    1

    いずれの言語も上記と似た構文をサポートしていますか?

    Perlでは、いくつかの数字と文字列を同じ意味で扱うことができます。例えば、 "5" + "1"は6を与えます。一般的に、この種の問題は、あいまいさを避けるのが難しいことです。 "5" + 1は "51"か "6"でしょうか? Perlは、文字列連結のための別の演算子を持ち、数値加算のために+を予約することでこれを回避します。

    他の言語では、連結や追加を行うかどうか、結果がどのようなタイプや表現になるか(該当する場合)を並べ替える必要があります。弱いタイプは落胆しなければならない

    2

    は? 大規模なプロジェクトに落胆弱い種類はありますか?左側が強く、次の のように型付けされた場合には、規則の例外だろうか?

    int i = 5 string sz = i sz = sz + "1" i = sz

    任意の言語が上記に似た構文をサポートしていますか?関連の弱い種類や状況に私の長所と短所についての詳細 に知らせる。

    おそらく、あなたはそれを行うために、独自のライブラリをプログラムすることができます。

    C++では、「演算子オーバーロード」と呼ばれるものを使用できます。つまり、あるタイプの変数を別のタイプの変数として初期化することができます。 (変数の型がTであり、Bは、あなたのようにそれを設定したいタイプです)

    仕事を

    [std::string str = "Hello World";][1] 
    

    は、特にあなたも、任意のテキストの間にかかわらず、関数を定義します:それは声明を作るものですquotesはcharの配列として解釈されます。

    T& T::operator= (const B s); 
    

    これは、クラスのメンバ関数 であるが、また、あなたはおそらく、あなたが自由にそれを使用する場合は、この操作を反転させる機能のいくつかの並べ替えがしたいということに注意していることに注意してください -

    B& T::operator= (const T s); 
    
    のようなものを

    C++は、オブジェクトを一般的に弱く型付けするのに十分強力ですが、純粋に弱く型付けされたものを扱う場合は、任意のプリミティブとして使用できる単一の変数型を作成し、 voidへのポインタを取る。 私が信じていれば、強く型付けされたプログラミングがあればそれを使う方がはるかに簡単です。

    個人的には、変数の意味がわからないときに発生するエラーを心配する必要がないので、個人的には厳密に型指定することをお勧めします。例えば、私が人と話すための関数を書こうとしていて、その関数が身長、体重、名前、子供の数などを使用していたとしても、私に色を与えた場合、非常にシンプルなアルゴリズムを使って色のほとんどを決定しています。

    弱い型の賛成派である限り、プログラム(つまり、WebブラウザやUNIXシェル)内で実行するプログラムをプログラミングする場合は、慣れ親しんだタイプのプログラミングに慣れたいと思うかもしれません。 JavaScriptとシェルスクリプトは弱く型付けされています。

    アセンブリ言語のようなプログラミング言語はハーウェアレベルの弱い型指定言語の1つであることをお勧めしますが、私が見たAssembly言語の魅力は、割り当てられたサイズ、dword、qword。

    私はあなたに良い説明をし、あなたの口に何も言わなかったと思います。

    関連する問題