Что такое динамическая типизация? - PullRequest
9 голосов
/ 13 сентября 2011

Я слышал этот термин, используемый в таких языках сценариев, как PHP.Что именно это значит?

1 Ответ

19 голосов
/ 13 сентября 2011

Динамическая типизация является определяющей характеристикой языка.Краткое объяснение может быть следующим:

Язык имеет динамическую типизацию, когда он не связывает значения строго с конкретным типом, но он предназначен для «решения», каким должен быть тип значения во время выполненияв зависимости от того, как вы пытаетесь его использовать.

Например, в PHP вы можете написать

$count = "5"; // defines a string variable

, а затем сказать

$count = $count * 2; // this is legal and has the obvious result¹

Что здесь произошло?С одной стороны, компилятор не жаловался, что вы пытаетесь умножить строку на число и отказываетесь компилировать программу (как это происходит в таких языках, как C, C ++, C # и Java).Он создал код для пересылки аргументов $count и 2 оператору умножения, как вы и просили.

После компиляции программы динамическая типизация вступает в силу во время выполнения .Когда оператор умножения просматривает свои операнды, он проверяет, является ли текущий тип, если хотите, типом каждого из них.Как и прежде, это строка и int.Но оператор знает, что он может умножить только два целых числа (давайте для простоты проигнорируем числа с плавающей запятой), поэтому он должен каким-то образом получить целое значение из строки.Все динамически типизированные языки имеют правила , которые определяют, как такое преобразование работает между всеми парами типов значений;в этом случае PHP выдает целое число 5 из строки "5".

Другой аспект динамической типизации, с которым вы можете столкнуться, называется duck typing ;это относится только к значениям типов классов (т.е. не к примитивам).Короче говоря, при утилитарной типизации при написании

$object->quack();

компилятор не будет пытаться определить, относится ли $object к типу, который имеет метод с именем quack, который не принимает аргументов.Скорее, он попытается во время выполнения проверить, есть ли у $object такой метод;если это произойдет, метод будет вызван независимо от того, какой тип объекта у нас под рукой (может быть утка, может быть собака для всех забот компилятора).

Сноски:

¹ Умножение строки на целое число - вот что такое динамическая типизация - это все (создание целого числа из строки, потому что умножение требует его);тем не менее, здесь также работает свободный ввод (что позволяет умножению компилироваться без возможности доказать, что оба операнда действительно являются целыми числами).

...