Статический/Динамичный по сравнению с Сильным/слабым

Я вижу эти условия, распространенные повсеместно в программировании, и у меня есть неопределенное понятие того, что они имеют в виду. Поиск показывает мне, что такие вещи спросили на всем протяжении переполнения стека на самом деле. Насколько я - осведомленный Статический / Динамический контроль типов на языках, тонко отличается от Сильного / Слабого контроля типов, но что то различие, ускользает от меня. Другие источники, кажется, используют различные значения или даже используют термины попеременно. Я не могу найти где-нибудь, что переговоры об обоих и на самом деле обстоятельно объясняют различие. То, что было бы хорошо, - то, если кто-то мог бы обстоятельно объяснить это ясно здесь для меня и остальной части мира.

302
задан stoft 28 November 2016 в 03:45
поделиться

3 ответа

  • Статическая / динамическая типизация касается , когда информация о типе получена (либо во время компиляции, либо во время выполнения).

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

См. вики-страницу для получения более подробной информации.

396
ответ дан 23 November 2019 в 01:25
поделиться

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

Строгая типизация обычно означает, что в системе типов нет лазеек , тогда как слабая типизация означает, что система типов может быть нарушена (аннулируя любые гарантии). Эти термины часто используются неправильно для обозначения статической и динамической типизации. Чтобы увидеть разницу, подумайте о C: язык проверяется на тип во время компиляции (статическая типизация), но есть много лазеек; вы можете в значительной степени преобразовать значение любого типа в другой тип того же размера - в частности, вы можете свободно преобразовывать типы указателей. Паскаль был языком, который должен был быть строго типизированным, но, как известно, имел непредвиденную лазейку: вариантную запись без тега.

Реализации строго типизированных языков часто со временем приобретают лазейки, обычно для того, чтобы часть системы времени выполнения могла быть реализована на языке высокого уровня. Например, в Objective Caml есть функция Obj.magic , которая во время выполнения просто возвращает свой аргумент, но во время компиляции преобразует значение любого типа в значение любого другого типа. Мой любимый пример - Modula-3, разработчики которого назвали свою конструкцию приведения типов LOOPHOLE .

Сказав это, вы не можете рассчитывать на то, что какие-то два человека будут одинаково использовать слова «сильный» и «слабый». Так что избегайте их.

204
ответ дан 23 November 2019 в 01:25
поделиться

Слабая типизация означает, что тип объекта может меняться в зависимости от контекста. Например, в языке со слабой типизацией строка "123" может рассматриваться как число 123, если вы добавите к ней другое число. Примерами языков со слабой типизацией являются bash, awk и PHP.

Другой разновидностью слабо типизированного языка является язык C, в котором данные по адресу памяти могут быть отнесены к другому типу путем приведения.

В языке с сильной типизацией тип объекта не меняется - int всегда остается int, и попытка использовать его в качестве строки приведет к ошибке. И Java, и Python являются сильно типизированными.

Разница между динамической и статической типизацией заключается в том, как применяются правила типов. В статически типизированном языке тип каждой переменной и параметра должен быть объявлен в исходном тексте и выполняется во время компиляции. В динамически типизированном языке типы проверяются только при использовании во время выполнения. Таким образом, Java является статически типизированным, а Python - динамически типизированным.

Однако иногда границы могут быть немного размытыми. Например, хотя Java статически типизирована, каждый раз, когда вы используете отражение или приведение (например, при использовании контейнеров объектов), вы откладываете проверку типов до времени выполнения.

Точно так же большинство сильно типизированных языков все еще автоматически конвертируют между целыми и плавающими числами (а в некоторых языках и BigInts произвольной точности).

19
ответ дан 23 November 2019 в 01:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: