Существует множество определений статической / динамической типизации и строгой / слабой типизации, поэтому трудно ответить на любой общий вопрос очень конкретно.Тем не менее, определение (очень высокого уровня), которое я использую для них, имеет тенденцию довольно хорошо передать общую идею (по крайней мере, я так думаю).
Статическая и динамическая типизация
Статически типизированный язык применяет типы к переменным .Переменная count
может быть определена как целое число.Он может содержать только целочисленные значения.
Динамически типизированный язык применяет типы к значениям , но не к переменным.Значение 123 является целым числом, а «abc» - строкой, но переменная result
может быть назначена одному или обоим в разные моменты времени.
Сильный против слабого набора
В строго типизированном языке значение имеет тип, и это только этот тип.Например, "123"
- это строка, где 123
- это целое число.Вы не можете рассматривать строку как целое число и наоборот.Вы можете конвертировать между ними (то есть «123» .toint () или тому подобное), но вы не можете просто рассматривать один тип как другой (то есть следующее не будет допустимым: «123» + 456 == 579)
В слабо типизированном языке значение - это просто значение, и вы можете рассматривать его как различные типы в зависимости от его использования.Например, вы МОЖЕТЕ сказать "123" + 234
и получить полезный результат (357 или 123234 в зависимости от языка).
МНОГО серых областей между статической и динамической, а также между сильной и слабой, ноприведенные выше определения дают общее представление.
В смежной теме также есть явная или неявная типизация (программист определяет типы, а компилятор не определяет типы), что само по себе является действительно интересной темой.