У вас есть абсолютно правильная точка зрения, языки, которые не отслеживают тип переменной, существуют и называются «динамически типизированными». В эту категорию входят такие языки, как JavaScript, Perl, Lisp и Python.
Преимущество, которое мы получаем от статически типизированного языка, заключается в дополнительной проверке ошибок во время компиляции.
Предположим, например, что у вас есть следующий метод:
public addCustomerContact(Customer client, Employee contact) {
...
}
Было бы возможно, если у вас есть клиент bob
и сотрудник james
в вашем коде, чтобы по ошибке позвонить addCustomerContact(james, bob)
, что является недействительным. Но если компилятор не знает типы переменных, он не может предупредить вас о том, что вы сделали неверный вызов, вместо этого возникает ошибка во время выполнения ... и поскольку языки с динамической типизацией не проверяют Тип параметров, передаваемых в методы, эта проблема возникает всякий раз, когда ваш код пытается использовать свойства james
объекта только для клиента или свойства объекта только для сотрудника bob
. Это может занять много времени после того, как пара (james, bob) была добавлена в список контактов с клиентами.
Теперь вы можете задаться вопросом, почему компилятор не может определить тип james
и bob
, и при этом предупредить нас? Иногда это возможно, но если переменные действительно не имеют типа, то мы можем сделать следующее:
var james;
var bob;
if (getRandomNumber() > 0.5) {
james = new Customer();
bob = new Employee();
} else {
james = new Employee();
bob = new Customer();
}
Вполне допустимо присваивать любое значение любой переменной, поскольку мы сказали, что переменные не имеют типа. Это также означает, что мы не всегда можем знать тип переменной, потому что это могут быть разные типы, основанные на разных путях выполнения.
В целом, языки с динамической типизацией используются для языков сценариев, где нет этапа компиляции, и поэтому ошибок компиляции не существует, а это означает, что дополнительные нажатия клавиш, необходимые для задания типа переменных, не будут очень полезными.
У динамически типизированных языков также есть некоторые явные преимущества, в основном с точки зрения меньшего количества кода, необходимого для реализации одного и того же проекта: интерфейсы не должны быть написаны, потому что все «типизировано по типу утки» (нас интересует только то, какие методы / свойства у объекта есть). , а не к какому классу принадлежит объект), переменным не нужно задавать явный тип ... с компромиссом, который мы узнаем о несколько меньшем количестве ошибок, прежде чем мы начнем запускать наш код.