Я часто слышу, что новые языки программирования динамически типизированы, но что это на самом деле означает, когда мы говорим, что язык динамически типизирован или статически типизирован?
948
Я часто слышу, что новые языки программирования динамически типизированы, но что это на самом деле означает, когда мы говорим, что язык динамически типизирован или статически типизирован?
Ответы:
Статически типизированные языки
Язык статически типизирован, если тип переменной известен во время компиляции. Для некоторых языков это означает, что вы как программист должны указать тип каждой переменной (например, Java, C, C ++); другие языки предлагают некоторую форму вывода типов , способность системы типов определять тип переменной (например, OCaml, Haskell, Scala, Kotlin)
Основным преимуществом здесь является то, что компилятор может выполнять все виды проверок, и поэтому многие тривиальные ошибки обнаруживаются на очень ранней стадии.
Примеры: C, C ++, Java, Rust, Go, Scala
Динамически типизированные языки
Язык динамически типизируется, если тип связан со значениями времени выполнения, а не с именованными переменными / полями / и т. Д. Это означает, что вы, как программист, можете писать немного быстрее, потому что вам не нужно каждый раз указывать типы (если только не используется статически типизированный язык с выводом типа ).
Примеры: Perl, Ruby, Python, PHP, JavaScript
У большинства языков сценариев есть эта возможность, так как в любом случае нет никакого компилятора, который бы выполнял статическую проверку типов, но вы можете найти ошибку, вызванную неверным толкованием интерпретатором типа переменной. К счастью, сценарии имеют тенденцию быть маленькими, поэтому ошибки не так много мест, чтобы скрыть.
Большинство динамически типизированных языков позволяют предоставлять информацию о типах, но не требуют ее. Один язык, который в настоящее время разрабатывается, Rascal , использует гибридный подход, позволяющий динамическую типизацию внутри функций, но обеспечивающий статическую типизацию для сигнатуры функции.
источник
Статически типизированные языки программирования выполняют проверку типов (то есть процесс проверки и применения ограничений типов) во время компиляции, а не во время выполнения .
Динамически типизированные языки программирования выполняют проверку типов во время выполнения, а не во время компиляции .
Примеры статически типизированных языков: - Java, C, C ++
Примеры динамически типизированных языков: - Perl, Ruby, Python, PHP, JavaScript
источник
Вот пример, показывающий, как Python (динамически типизированный) и Go (статически типизированный) обрабатывают ошибку типа:
Python выполняет проверку типов во время выполнения, и поэтому:
Работает отлично и выдает ожидаемый результат
Hi
. Ошибка возникает только в случае попадания в проблемную строку:Производит
потому что соответствующая строка была фактически выполнена.
Go с другой стороны выполняет проверку типов во время компиляции:
Выше не скомпилируется, со следующей ошибкой:
источник
runhaskell
Например, Haskell можно интерпретировать какПроще говоря, так: в статически типизированном языке типы переменных являются статическими , то есть, если вы установите переменную для типа, вы не сможете ее изменить. Это связано с тем, что типизация связана с переменной, а не со значением, к которому она относится.
Например в Java:
Где, с другой стороны: в динамически типизированном языке типы переменных являются динамическими , то есть после того, как вы установите переменную в тип, вы МОЖЕТЕ изменить ее. Это связано с тем, что типизация связана со значением, которое она принимает, а не с самой переменной.
Например в Python:
Таким образом, лучше всего рассматривать переменные в динамически типизированных языках как просто общие указатели на типизированные значения.
Подводя итог, тип описывает (или должен был описать) переменные в языке, а не сам язык. Он мог бы быть лучше использован в качестве языка со статически типизированными переменными по сравнению с языком с динамически типизированными переменными IMHO.
Языки со статической типизацией, как правило, являются компилируемыми языками, поэтому компиляторы проверяют типы (правильно понимаете, так как типы не могут быть изменены позднее во время выполнения).
Динамически типизированные языки обычно интерпретируются, поэтому проверка типов (если есть) происходит во время выполнения, когда они используются. Это, конечно, приводит к некоторому снижению производительности и является одной из причин, по которой динамические языки (например, python, ruby, php) не так хорошо масштабируются, как типизированные (java, c # и т. Д.). С другой стороны, статически типизированные языки имеют большую начальную стоимость: обычно вы пишете больше кода, а код сложнее. Но это окупается позже.
Хорошо, что обе стороны заимствуют черты у другой стороны. Типизированные языки включают в себя больше динамических функций, например, универсальные и динамические библиотеки в c #, а динамические языки включают в себя больше проверки типов, например, аннотации типов в python или вариант HACK PHP, которые обычно не являются ядром языка и могут использоваться на требование.
Когда дело доходит до выбора технологии, ни одна из сторон не имеет внутреннего превосходства над другой. Это просто вопрос предпочтения, хотите ли вы получить больше контроля или гибкость. просто выберите правильный инструмент для работы и убедитесь, что вы видите, что доступно с точки зрения противоположности, прежде чем рассматривать вопрос о переключателе.
источник
http://en.wikipedia.org/wiki/Type_system
источник
myObject[remoteDataName]
. Тогда нет никакого способа узнать, какое свойство он выберет, или даже если это вообще допустимое свойство.Терминология «динамически типизированная», к сожалению, вводит в заблуждение. Все языки статически типизированы, а типы являются свойствами выражений (а не значений, как некоторые думают). Однако некоторые языки имеют только один тип. Это так называемые однотипные языки. Одним из примеров такого языка является нетипизированное лямбда-исчисление.
В нетипизированном лямбда-исчислении все термины являются лямбда-терминами, и единственная операция, которая может быть выполнена над одним термином, - это применение его к другому термину. Следовательно, все операции всегда приводят либо к бесконечной рекурсии, либо к лямбда-члену, но никогда не сигнализируют об ошибке.
Тем не менее, мы были для усиления нетипизированной лямбды - исчисления с примитивными числами и арифметическими операциями, то мы могли бы выполнить бессмысленные операции, например , добавив два члена лямбды вместе:
(λx.x) + (λy.y)
. Можно утверждать, что единственная разумная вещь, которую нужно сделать - это сообщить об ошибке, когда это происходит, но чтобы это можно было сделать, каждое значение должно быть помечено индикатором, который указывает, является ли термин лямбда-термином или числом. Затем оператор сложения проверит, что оба аргумента действительно помечены как числа, и, если это не так, сигнализирует об ошибке. Обратите внимание, что эти теги не являются типами, потому что типы - это свойства программ, а не значений, создаваемых этими программами.Однотипированный язык, который делает это, называется динамически типизированным.
Такие языки, как JavaScript, Python и Ruby, являются однотипными. Опять же,
typeof
оператор в JavaScript иtype
функция в Python имеют вводящие в заблуждение имена; они возвращают теги, связанные с операндами, а не их типы. Точно так жеdynamic_cast
в C ++ иinstanceof
в Java не делайте проверки типов.источник
Скомпилировано и интерпретировано
«Когда исходный код переведен»
Typing
«Когда типы проверяются»
5 + '3'
является примером ошибки типа в строго типизированных языках, таких как Go и Python, потому что они не допускают «приведение типов» -> возможность значения менять тип в определенных контекстах, таких как объединение двух типов. Языки со слабой типизацией , такие как JavaScript, не будут вызывать ошибку типа (приводит к'53'
).Определения «Static & Compiled» и «Dynamic & Interpreted» очень похожи ... но помните, что это «когда проверяются типы» и «когда переводится исходный код».
Вы получите одинаковые ошибки типа независимо от того, скомпилирован или интерпретирован язык ! Вы должны разделить эти термины концептуально.
Пример Python
Динамический, Интерпретированный
Поскольку Python интерпретируется и динамически типизируется, он только переводит и проверяет код, на котором он выполняется.
else
Блок никогда не выполняется, поэтому5 + '3'
никогда даже не смотрел на!Что, если он был статически напечатан?
Ошибка типа будет выдана еще до запуска кода. Он по-прежнему выполняет проверку типов перед выполнением, даже если он интерпретируется.
Что если он был скомпилирован?
else
Блок будет переведен / посмотрел на перед во время выполнения, а потому , что это динамически типизированных он не выдаст ошибку! Динамически типизированные языки не проверяют типы до выполнения, и эта строка никогда не выполняется.Go Example
Статический, скомпилированный
Типы проверяются перед запуском (статические), и ошибка типа немедленно обнаруживается! Типы будут по-прежнему проверяться перед выполнением, если это будет интерпретировано, с тем же результатом. Если бы он был динамическим, он не выдавал бы никаких ошибок, даже если код был бы просмотрен во время компиляции.
Представление
Скомпилированный язык будет иметь лучшую производительность во время выполнения, если он статически типизирован (по сравнению с динамическим); знание типов позволяет оптимизировать машинный код.
Языки со статической типизацией имеют лучшую производительность во время выполнения по своей природе из-за того, что нет необходимости динамически проверять типы во время выполнения (проверяется перед запуском).
Точно так же скомпилированные языки быстрее во время выполнения, поскольку код уже был переведен, вместо того, чтобы нуждаться в «интерпретации» / переводе на лету.
Обратите внимание, что как скомпилированный, так и статически типизированный языки будут иметь задержку перед запуском для перевода и проверки типов, соответственно.
Больше различий
Статическая типизация отлавливает ошибки на ранних этапах, а не обнаруживает их во время выполнения (особенно полезно для длинных программ). Он более «строгий» в том смысле, что он не допускает ошибок типов в вашей программе и часто предотвращает изменение типов переменных, что дополнительно защищает от непреднамеренных ошибок.
Динамическая типизация более гибкая, что некоторые ценят. Обычно это позволяет переменным изменять типы, что может привести к непредвиденным ошибкам.
источник
Статически типизированные языки : каждая переменная и выражение уже известны во время компиляции.
(во
int a;
время выполнения может принимать только целочисленные значения)Примеры: C, C ++, Java
Динамически типизированные языки : переменные могут получать различные значения во время выполнения, и их тип определяется во время выполнения.
(
var a;
может принимать любые значения во время выполнения)Примеры: Ruby, Python.
источник
Статически типизированные языки проверяют тип во время компиляции, и тип НЕ может измениться. (Не будьте милыми с комментариями приведения типов, создается новая переменная / ссылка).
Динамически типизированные языки проверяют тип во время выполнения и тип переменной МОЖЕТ быть изменен во время выполнения.
источник
Простые и понятные определения, но соответствующие потребности: языки со статической типизацией связывают тип с переменной для всей своей области (Seg: SCALA) Языки с динамической типизацией связывают тип с фактическим значением, на которое ссылается переменная.
источник
источник
Языки со статической типизацией, такие как C ++, Java, и языки с динамической типизацией, такие как Python, отличаются только с точки зрения исполнения типа переменной. Статически типизированные языки имеют статический тип данных для переменной, здесь тип данных проверяется во время компиляции, поэтому отладка намного проще ... тогда как динамически типизированные языки не делают того же, проверяется тип данных, который выполняет программу и, следовательно, отладка немного сложна.
Более того, они имеют очень небольшую разницу и могут быть связаны со строго типизированными и слабо типизированными языками. Строго типизированный язык не позволяет использовать один тип в качестве другого, например. C и C ++ ... тогда как слабо типизированные языки позволяют eg.python
источник
Статически Типизированный
Типы проверяются перед выполнением, поэтому ошибки могут быть обнаружены ранее.
Примеры = с ++
Динамически Типизированный
Типы проверяются во время выполнения.
Примеры = Питон
источник
Языки со статической типизацией (компилятор разрешает вызовы методов и компилирует ссылки):
Динамически типизированные языки (решения, принимаемые в запущенной программе):
источник
динамически типизированный язык помогает быстро создавать прототипы концепций алгоритма, не задумываясь о том, какие типы переменных необходимо использовать (что необходимо в статически типизированных языках ).
источник
Статическая типизация: языки, такие как Java и Scala, имеют статическую типизацию.
Переменные должны быть определены и инициализированы, прежде чем они будут использованы в коде.
например int x; х = 10;
System.out.println (х);
Динамическая типизация: Perl - язык динамической типизации.
Переменные не нужно инициализировать перед использованием в коде.
у = 10; используйте эту переменную в более поздней части кода
источник
$
), array (@
) и hash (%
). Тип переменной в Perl известен во время компиляции и остается неизменным до конца жизни переменных.