Почему слабо типизированные языки все еще активно развиваются?

17

Интересно, почему слабо типизированные языки все еще активно развиваются. Например, какую пользу можно извлечь из возможности писать

$someVar = 1;
(...)  // Some piece of code
$someVar = 'SomeText';

вместо того, чтобы использовать сильно отличающуюся версию

int someInt = 1;
(...)
string SomeString = 'SomeText';

Это правда, что вам нужно объявить дополнительную переменную во втором примере, но действительно ли это больно? Разве не все языки стремятся быть строго типизированными, поскольку они обеспечивают безопасность типов во время компиляции, таким образом избегая некоторых подводных камней при приведении типов?

DotNetStudent
источник
9
«Сильно типизированный» не является четко определенным термином. В основном это означает «вы не можете подорвать систему типов». Это ортогонально тому, что вы описываете выше, которое может быть латентной или манифестной типизацией или статической или динамической типизацией.
Фрэнк Ширар
10
Чего мне не хватает, что переносит это из пламенной приманки с несколькими тесно связанными, возможно, даже дублирующимися вопросами (просто ищите в SackOverflow вопросы, в которых упоминаются статическая и динамическая типизация в их тегах), к законному вопросу?
1
Существуют преимущества и недостатки как для статически типизированных, так и для динамически типизированных языков. Языки с динамической типизацией прекрасно подходят для быстрой разработки или создания прототипов (поэтому причина, по которой «языки сценариев» обычно динамически типизируются), тогда как языки со статической типизацией (возможно) легче поддерживать и расширять по мере их превращения в большие сложные проекты.
Чарльз Сальвия
6
Первый пример немного похож на Python, где переменные не имеют объявленного типа. Тем не менее, Python является очень строго типизированным языком, потому что сами объекты имеют тип, который почти невозможно изменить или вызвать. Я думаю, что неправильное использование терминологии делает этот вопрос очень трудным для ответа.
S.Lott
1
@delnan Помогает тот факт, что этот вопрос получил два разумных ответа и не превратился в пламенную войну.
Адам Лир

Ответы:

25

Сильная / слабая типизация и статическая / динамическая типизация являются ортогональными.

Сильный / слабый - это вопрос о том, имеет ли значение тип значения с функциональной точки зрения. В слабо типизированном языке вы можете взять две строки, заполненные цифрами, и выполнить с ними целочисленное сложение; в строго типизированном языке это ошибка (если вы сначала не приведете значения или не преобразуете их в правильные типы). Сильная / слабая типизация - не черно-белая вещь; большинство языков не являются ни на 100% строгими, ни на 100% слабыми.

Статическая / динамическая типизация зависит от того, связаны ли типы со значениями или идентификаторами. В динамически типизированном языке вы можете назначить любое значение любой переменной независимо от ее типа; статическая типизация определяет тип для каждого идентификатора, а присвоение другого типа является либо ошибкой, либо приводит к неявному приведению. Некоторые языки используют гибридный подход, допускающий статически объявленные типы, а также нетипизированные идентификаторы («вариант»). Существует также вывод типа, механизм, в котором статическая типизация возможна без явного объявления типа всего, если компилятор выяснит типы (Haskell использует это широко, C # предоставляет его через varключевое слово).

Слабое динамическое программирование допускает прагматичный подход; язык не мешает вам в большинстве случаев, но он не вмешивается, когда вы стреляете себе в ногу. Напротив, строгая статическая типизация заставляет программиста явно выражать определенные ожидания относительно значений в коде таким образом, который позволяет компилятору или интерпретатору обнаруживать класс ошибок. С хорошей системой типов программист может точно определить, что можно и нельзя сделать со значением, и, если случайно кто-то попробует что-то нежелательное, система типов часто может предотвратить это и показать, где и почему что-то идет не так.

tdammers
источник
В надлежащем слабо типизированном языке, таком как HyperTalk, с отдельными операторами для конкатенации и сложения строк (например, предполагается, что &для конкатенации) операции похожи "12"+3или не 45 & "6"представляют двусмысленности (они вычисляют 15 и «456» соответственно). В более строго типизированном языке оператор «+» может быть безопасно перегружен как для объединения строк, так и для сложения чисел, не вызывая двусмысленности, поскольку операции со строками и числами будут запрещены. Проблемы возникают, когда язык не определяет ни типы, ни выполняемые операции.
суперкат
4

Слабая типизация больше вдоль линий 1 == "TRUE". Этот раздел википедии прекрасно иллюстрирует разницу.

Обратите внимание, что ни один из примеров из википедии не является статически типизированным, что вы и упоминаете во втором примере.

Итак, если вопрос в том, почему люди используют динамически типизированные языки, тогда ответ таков: системы статических типов накладывают на вас ограничения. Многие люди просто никогда не работали с выразительной системой статических типов, что приводит их к выводу, что недостатки статической типизации перевешивают преимущества.

back2dos
источник
0

Языки слабых типов все еще развиваются, потому что люди используют их и любят их. Если вам не нравится слабая типизация, не используйте языки со слабой типизацией. Объявление того, что что-то есть Единый Истинный Путь, и что каждый должен это делать Единый Истинный Путь, игнорирует сложность мира.

mjfgates
источник
0

Разве не все языки стремятся быть строго типизированными, поскольку они обеспечивают безопасность типов во время компиляции, таким образом избегая некоторых подводных камней при приведении типов?

Не обязательно. Цель обучения C: Учебник для начинающих обращается к этому вопросу непосредственно в контексте Objective C:

Слабо типизированные переменные часто используются для таких вещей, как классы коллекций, где точный тип объектов в коллекции может быть неизвестен. Если вы привыкли использовать языки со строгой типизацией, вы можете подумать, что использование переменных со слабой типизацией вызовет проблемы, но на самом деле они обеспечивают огромную гибкость и допускают гораздо больший динамизм в программах Objective-C.

Калеб
источник