Я вижу эти термины повсеместно в программировании, и у меня есть смутное представление о том, что они имеют в виду. Поиск показывает, что на самом деле такие вещи задавались по всему переполнению стека. Насколько я знаю, статическая / динамическая типизация в языках слегка отличается от строгой / слабой типизации, но в чем заключается это отличие, ускользает от меня. Различные источники, кажется, используют разные значения или даже взаимозаменяемо. Я не могу найти где-то, что говорит об обоих и на самом деле излагает разницу. Что было бы неплохо, если бы кто-то мог, пожалуйста, четко изложить это здесь для меня и остального мира.
319
Ответы:
Статический / Динамический Typing о когда информация о типе приобретенными (либо во время компиляции или во время выполнения)
Сильная / слабая типизация заключается в том, как строго различаются типы (например, пытается ли язык выполнить неявное преобразование из строк в числа).
Смотрите вики-страницу для более подробной информации.
источник
"12" + "34"
будет равен"46"
, но"12" + "34Q"
будет равен"1234Q"
[к счастью, можно написать,"12" & "34"
если захочется объединение]. Любопытно, что переменные, содержащие числа, сохраняли их как числа с плавающей запятой двойной точности, и математика для таких переменных использовала значения с плавающей запятой без вычисления строки, но не было никакого способа спросить, является ли переменная строкой или числом.Вы обнаружили слабое место в терминологии, которую любители используют для разговоров о языках программирования. Не используйте термины «сильная» и «слабая» типизация , потому что они не имеют общепризнанного технического значения. Напротив, статическая типизация означает, что программы проверяются перед выполнением , и программа может быть отклонена до ее запуска. Динамическая типизация означает, что типы значений проверяются во время выполнения , а плохо напечатанная операция может привести к остановке программы или иным образом сигнализировать об ошибке во время выполнения . Основной причиной статической типизации является исключение программ, которые могут иметь такие «ошибки динамического типа».
Строгая типизация обычно означает, что в системе типов нет лазеек, в то время как слабая типизация означает, что система типов может быть подорвана (аннулируя любые гарантии). Термины часто используются неправильно для обозначения статической и динамической типизации. Чтобы увидеть разницу, подумайте о C: язык проверяется на тип во время компиляции (статическая типизация), но существует множество лазеек; вы можете в значительной степени привести значение любого типа к другому типу того же размера - в частности, вы можете свободно приводить типы указателей. Паскаль был языком, который предназначался для строгой типизации, но, как известно, имел непредвиденную лазейку: вариант записи без тега.
Реализации строго типизированных языков часто приобретают лазейки со временем, обычно, так что часть системы времени выполнения может быть реализована на языке высокого уровня. Например, в Objective Caml есть функция с именем,
Obj.magic
которая во время выполнения просто возвращает свой аргумент, но во время компиляции преобразует значение любого типа в значение любого другого типа. Мой любимый пример - Modula-3, дизайнеры которого назвали свою конструкцию для литья типовLOOPHOLE
.Сказав это, вы не можете рассчитывать на то, что два человека будут использовать слова «сильный» и «слабый» одинаково. Так что избегай их.
источник
Проще говоря, так: в языке со статической типизацией тип является статическим , то есть, когда вы устанавливаете переменную для типа, вы НЕ МОЖЕТЕ изменить ее. Это связано с тем, что типизация связана с переменной, а не со значением, к которому она относится.
Например в Java:
В то время как в динамически типизированном языке тип является динамическим , то есть после того, как вы установите переменную для типа, вы МОЖЕТЕ изменить ее. Это связано с тем, что типизация связана со значением, а не с переменной.
Например в Python:
С другой стороны, строгая / слабая типизация в языке связана с неявным преобразованием типов (частично взято из ответа @ Dario):
Например в Python:
тогда как в PHP:
Статическая типизация позволяет проверять правильность типа во время компиляции. Статически типизированные языки обычно компилируются, а динамически типизированные языки интерпретируются. Следовательно, динамически типизированные языки могут проверять типизацию во время выполнения.
источник
Слабая типизация означает, что тип объекта может меняться в зависимости от контекста. Например, в слабо типизированном языке строка «123» может рассматриваться как число 123, если вы добавите к нему другое число. Примерами языков со слабой типизацией являются bash, awk и PHP.
Другой тип слабо типизированного языка - C, где данные по адресу памяти могут быть обработаны как другой тип путем приведения.
В строго типизированном языке тип объекта не изменяется - int всегда является int и попытка использовать его в качестве строки приведет к ошибке. И Java, и Python строго типизированы.
Разница между динамической и статической типизацией заключается в применении правил типа. В статически типизированном языке тип каждой переменной и параметра должен быть объявлен в источнике и применяется во время компиляции. В динамически типизированном языке типы проверяются только тогда, когда они используются во время выполнения. Таким образом, Java статически типизирован, а Python динамически типизирован.
Однако границы могут быть немного размытыми время от времени. Например, хотя Java является статически типизированной, каждый раз, когда вы используете отражение или приведение (например, при использовании контейнеров объектов), они откладывают проверку типа до времени выполнения.
Точно так же большинство строго типизированных языков все равно будут автоматически конвертировать между целыми числами и числами с плавающей точкой (и в некоторых языках с точностью до BigInts)
источник
f
принимает аргументx
(fun f(x)
) [**, поэтому типы не объявляются **], а тело функции -x+1
. Без объявленных типов компилятор выяснит, чтоx
должно быть int.- fun f x = x + 1;
val f = fn : int -> int
5 + 'c' // OK
Сегодня, исследуя эту тему, я наткнулся на эту замечательную статью http://blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html Она прояснила много вещи для меня, и я подумал, что это может добавить к некоторым из великих ответов выше.
Сильный и слабый набор текста:
Статический и Динамический Типы
Явные / неявные типы:
источник
Из Прагматики языка программирования Скотта , 3-е издание стр. 291, мы
Таким образом, простыми словами, статическая / динамическая типизация относится ко времени, когда происходит проверка типов: время компиляции для статической типизации и время выполнения для динамических языков. Аналогично, строгая / слабая типизация относится к тому, насколько агрессивно язык применяет свою систему типов.
Я попытался перевести описание Скотта в хорошую диаграмму, которую я разместил ниже.
источник
Я думаю, что другие коллеги сделали хорошую работу, особенно. объясняя разницу между статической и динамической типизацией. Но что касается сильной и слабой типизации, то следует сказать, что существуют разные понимания / взгляды.
Вот два примера:
Некоторые говорят, что Хаскель строго типизирован, потому что вам не разрешено делать какие-либо преобразования типов.
Другие (например, взгляд Дарио) говорят, что язык, который позволяет неявно конвертировать из строки в число специально, слабо типизирован, но даже другие называют это просто утиной типизацией.
Оба утверждения подчеркивают не противоположные крайности системы типов, а совершенно разные аспекты. Поэтому я присоединяюсь к мнению г-на Рэмси не использовать термины «сильный» и «слабый» для различения систем типов.
источник
Статически v / s динамически типизированные языки
Сильно v / s слабо типизированные языки
Хорошие дальнейшие чтения
источник
В статически типизированных языках обычно требуется объявлять типы переменных, которые затем проверяются во время компиляции, чтобы уменьшить количество ошибок. Слово «статический» в «статически типизированном» относится к «статическому анализу кода», который представляет собой процесс проверки кода перед его выполнением. Хотя для статически типизированного языка возможно вывести тип переменной из правой части выражения или фактических параметров, на практике большинство статически типизированных языков требуют, чтобы типы переменных были явно объявлены.
Динамически типизированные языки, как правило, не требуют, чтобы объявления переменных имели типы, и они выводят типы переменных на основе типа, вычисленного в результате оценки правой части каждого оператора присваивания или фактических параметров для вызова функции. Поскольку переменной может быть присвоено несколько назначений в течение срока ее службы, ее тип может меняться со временем, и именно поэтому она называется «динамически типизированной». Кроме того, среда выполнения должна отслеживать текущий тип для каждой переменной, поэтому тип связан со значением, а не с объявлением переменной. Это можно считать системой информации о типе среды выполнения (RTTI).
Элементы статически и динамически типизированных языков могут быть объединены. Например, C # поддерживает как статически, так и динамически типизированные переменные, а объектно-ориентированные языки обычно поддерживают понижающую иерархию типов. Языки со статической типизацией обычно предоставляют различные способы обойти проверку типов, например, используя приведение, отражение и динамический вызов.
Сильная и слабая типизация означает непрерывность того, насколько язык пытается предотвратить ошибки из-за использования переменной, как если бы это был один тип, тогда как на самом деле это другой тип. Например, и C, и Java являются статически типизированными языками, однако в Java используется гораздо более строгая проверка типов, чем в C. Следующий код C рад компилировать и запускать и помещает случайное значение в переменную b во время выполнения, скорее всего, вызывая ошибка:
Эквивалентный Java-код вызовет ошибку компиляции, которая обычно предпочтительнее:
источник