«динамический» - это одно из модных слов, но на самом деле оно означает немного больше, чем «Что I делает круто» ... у него нет точного определения.
Сказав это, я могу ответить на ваш вопрос о типах или, по крайней мере, попытаться объяснить разницу между типизированными и нетипизированными (то, что некоторые люди называют динамическими или динамически типизированными) языками лучше.
Типизированный язык проверяет, что вы никогда не в конечном итоге попытаетесь сделать что-то с переменной, которую вы не можете сделать до запуска программы. Нетипизированный язык не выполняет эту проверку - он просто надеется на лучшее и, если в какой-то момент у него есть значение, которое не подходит для того, что ему нужно, выдает ошибку.
Это две крайности. Как и все в жизни, на практике языки лежат где-то между двумя теоретическими крайностями. Поэтому иногда трудно сказать, что язык типизирован или нетипизирован - часто все, что вы можете сказать, это что-то вроде «язык X имеет лучшую проверку типов во время компиляции, чем язык Y, потому что эти ошибки обнаруживаются в X, но не в Y: ... . "
Учитывая это определение, вы можете беспокоиться о том, что (1) типизированный язык требует намного больше текста в программе (потому что вы должны сказать, какой тип у каждого значения) и (2) типизированный язык может ограничивать то, что вы можете делать излишне (потому что система типов не достаточно умна, чтобы работать с чем-то, что вы видите).
Обе эти проблемы могут быть. НО они обе проблемы, которые становятся менее важными, поскольку типизированные языки становятся лучше. Например, почему есть такой код:
String s = "hello"
когда это очевидно только с
s = "hello"
что "s" должно быть строкой? Такие «умные» языки, где нет необходимости говорить, что это за типы, но они все еще проверены, часто называют «Хиндли Милнер», потому что это люди, которые первыми придумали, как это сделать. подробно.
Поэтому, когда вы смотрите на программу, написанную для языка с системой типов Хиндли Милнера, может показаться, что у нее нет типов. Но это ошибка. До запуска программы все равно будет определено, какими должны быть все типы всех переменных, и убедитесь, что вы не можете получить никаких ошибок при попытке сделать что-то с неправильным типом (я думаю, это удивительно - это близко к своего рода искусственный интеллект ...)
Это означает, что иногда единственный способ узнать, типизирован ли язык или нет, это узнать, как он реализован. Это может быть неочевидно, если взглянуть на источник.
Редактировать: Я просто перечитал выше, и я мог бы быть немного яснее. Я пытался провести различие между языками, которые имеют тип system , и языками, которые этого не делают. Система типов включает в себя две вещи: сами типы и логику для проверки правильности типов.
Языки, которые я называл «нетипизированными» (или динамически типизированными), имеют типы. Например, в Python (который является нетипизированным динамическим языком) все еще существует разница между String и Integer. Но у них нет дополнительной логики, которая проверяет программу до ее запуска. Поэтому было бы точнее сказать, что они имеют типы, но не имеют типа system .
В отличие от "типизированных" языков, как я уже сказал, проверяйте до , когда программа запускается, и поэтому для ее работы должны быть не только типы, но и дополнительная логика.