この用語は、PHPなどのスクリプト言語で使用されていると聞きました。正確にはどういう意味ですか?
1 に答える
動的型付けは、言語の決定的な特性です。簡単な説明は次のとおりです。
値を特定の型に厳密に関連付けない場合、言語には動的な型付けがありますが、使用しようとしている方法に基づいて、実行時に値の型を「決定」するように設計されています。
たとえば、PHP では次のように記述できます。
$count = "5"; // defines a string variable
そして続けて言います
$count = $count * 2; // this is legal and has the obvious result¹
ここで何が起こったのですか?1 つには、コンパイラは、文字列に数値を掛けようとしていて、プログラムのコンパイルを拒否しようとしていることに文句を言いませんでした (C、C++、C#、Java などの言語で発生するような)。あなたが尋ねて先に進んだのと同じように、引数を転送して乗算演算子に転送するコードを生成し$count
ました。2
プログラムがコンパイルされると、実行時に動的型付けが有効になります。乗算演算子がそのオペランドを調べようとすると、各オペランドの現在の型が何であるかをチェックします。以前のように、これは string と int です。しかし、演算子は 2 つの整数しか乗算できないことを知っているため (簡単にするために浮動小数点数は無視します)、何らかの方法で文字列から整数値を生成する必要があります。すべての動的型付け言語には、そのような変換が値型のすべてのペア間でどのように機能するかを規定するルールがあります。この場合、PHPは文字列 "5" から整数 5 を生成します。
動的型付けのもう 1 つの側面として、ダック タイピングと呼ばれるものがあります。これは、クラス タイプの値にのみ適用されます (つまり、プリミティブではありません)。要するに、ダックタイピングは、あなたが書くときにそれを規定しています
$object->quack();
コンパイラは、が引数を取らない$object
という名前のメソッドを持つ型であるかどうかを確認しようとしません。quack
むしろ、$object
実際にそのようなメソッドがあるかどうかを実行時に確認しようとします。存在する場合、手元にあるオブジェクトのタイプに関係なく、メソッドが呼び出されます (アヒルかもしれないし、コンパイラが気にかけているすべての犬かもしれません)。
脚注:
¹ 文字列を整数で乗算することは、動的型付けのすべてです (乗算では整数が必要なため、文字列から整数を生成します)。ただし、ここでは緩い型付けも行われています (両方のオペランドが実際に int であることを証明できずに乗算をコンパイルできます)。