言語がタイプセーフである場合、コンパイル時にタイプをチェックする必要があるため、静的に型付けされていると自動的に想定できるということですか?
2 に答える
たとえば、C は静的に型付けされ、タイプ セーフではありませんが、Haskell は静的に型付けされ、タイプ セーフです。ほとんどの (すべて?) 動的に型付けされた言語は、実行時に型をチェックして正しいことを確認する手段を備えているため、型安全です。さらに、これらの言語は、実行時の型情報を含めることでパフォーマンスが低下することを選択したため、その情報をできるだけ効果的に使用することを想定しているため、通常、メモリのチャンクを間違った型として解釈することはできません。
動的に型付けされた言語には、強制型という追加の型安全性手段があります。たとえば[] + []
、javascript を入力すると、オペランド+
が配列であり、直接追加できないことがわかります。そのため、両方を文字列に変換し、""
(空の文字列) の結果を返します。
JavaScript などの一部の言語は通常、他のものを文字列に変換しますが、たとえば PHP は文字列を数値に変換して比較します。
編集: タイプ セーフとは、タイプ A の何かを保持するメモリのチャンクをタイプ B の何かとして解釈することを許可しないことを意味します。タイプ アンセーフの例として、C++ にはreinterpret_cast
operatorがあります。そうする意味はありません。」例えば、
float a = 6.2;
int b = reinterpret_cast<int>(a);
//b now contains some form of garbage
型安全性のより完全な説明については、この回答を参照してください。
動的型付け言語をタイプ セーフと呼ぶのは躊躇しますが、実行時に型を厳密にチェックします。
そのような言語を厳密に型指定されていると呼ぶことは正当にできますが、私はそれを型安全とは呼びません。
コンパイル時にエラーをキャッチすると、修正する機会が得られます...
型安全な言語の良い例として、SPARK を見てください。
SPARK では、配列の最後にインデックスを付けることは型エラーです (各配列にはそのインデックスの新しい型があり、その型と互換性のない値があります)。
通常、プログラムをコンパイルする前に、そのようなエラーがないことを証明します...