Что такое динамический ввод?

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

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

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

Например, в 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. Но оператор знает, что он может только умножать два целых числа (давайте проигнорируем float для простоты), поэтому он должен каким-то образом получить целочисленное значение из строки. Все динамически типизированные языки имеют правила, которые определяют, как такое преобразование работает между всеми парами типов значений; в этом случае PHP выдает целое число 5 из строки «5».

Еще один аспект динамического набора текста, который вы можете встретить, называется утиным типом ; это относится только к значениям типов классов (т. е. не примитивов). Короче говоря, утиная печать указывает, что когда вы пишете

 $object->quack(); 

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

Примечания:

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