Интересно, почему слабо типизированные языки все еще активно развиваются. Например, какую пользу можно извлечь из возможности писать
$someVar = 1;
(...) // Some piece of code
$someVar = 'SomeText';
вместо того, чтобы использовать сильно отличающуюся версию
int someInt = 1;
(...)
string SomeString = 'SomeText';
Это правда, что вам нужно объявить дополнительную переменную во втором примере, но действительно ли это больно? Разве не все языки стремятся быть строго типизированными, поскольку они обеспечивают безопасность типов во время компиляции, таким образом избегая некоторых подводных камней при приведении типов?
weak-typing
DotNetStudent
источник
источник
Ответы:
Сильная / слабая типизация и статическая / динамическая типизация являются ортогональными.
Сильный / слабый - это вопрос о том, имеет ли значение тип значения с функциональной точки зрения. В слабо типизированном языке вы можете взять две строки, заполненные цифрами, и выполнить с ними целочисленное сложение; в строго типизированном языке это ошибка (если вы сначала не приведете значения или не преобразуете их в правильные типы). Сильная / слабая типизация - не черно-белая вещь; большинство языков не являются ни на 100% строгими, ни на 100% слабыми.
Статическая / динамическая типизация зависит от того, связаны ли типы со значениями или идентификаторами. В динамически типизированном языке вы можете назначить любое значение любой переменной независимо от ее типа; статическая типизация определяет тип для каждого идентификатора, а присвоение другого типа является либо ошибкой, либо приводит к неявному приведению. Некоторые языки используют гибридный подход, допускающий статически объявленные типы, а также нетипизированные идентификаторы («вариант»). Существует также вывод типа, механизм, в котором статическая типизация возможна без явного объявления типа всего, если компилятор выяснит типы (Haskell использует это широко, C # предоставляет его через
var
ключевое слово).Слабое динамическое программирование допускает прагматичный подход; язык не мешает вам в большинстве случаев, но он не вмешивается, когда вы стреляете себе в ногу. Напротив, строгая статическая типизация заставляет программиста явно выражать определенные ожидания относительно значений в коде таким образом, который позволяет компилятору или интерпретатору обнаруживать класс ошибок. С хорошей системой типов программист может точно определить, что можно и нельзя сделать со значением, и, если случайно кто-то попробует что-то нежелательное, система типов часто может предотвратить это и показать, где и почему что-то идет не так.
источник
&
для конкатенации) операции похожи"12"+3
или не45 & "6"
представляют двусмысленности (они вычисляют 15 и «456» соответственно). В более строго типизированном языке оператор «+» может быть безопасно перегружен как для объединения строк, так и для сложения чисел, не вызывая двусмысленности, поскольку операции со строками и числами будут запрещены. Проблемы возникают, когда язык не определяет ни типы, ни выполняемые операции.Слабая типизация больше вдоль линий
1 == "TRUE"
. Этот раздел википедии прекрасно иллюстрирует разницу.Обратите внимание, что ни один из примеров из википедии не является статически типизированным, что вы и упоминаете во втором примере.
Итак, если вопрос в том, почему люди используют динамически типизированные языки, тогда ответ таков: системы статических типов накладывают на вас ограничения. Многие люди просто никогда не работали с выразительной системой статических типов, что приводит их к выводу, что недостатки статической типизации перевешивают преимущества.
источник
Языки слабых типов все еще развиваются, потому что люди используют их и любят их. Если вам не нравится слабая типизация, не используйте языки со слабой типизацией. Объявление того, что что-то есть Единый Истинный Путь, и что каждый должен это делать Единый Истинный Путь, игнорирует сложность мира.
источник
Не обязательно. Цель обучения C: Учебник для начинающих обращается к этому вопросу непосредственно в контексте Objective C:
источник