Следующие утверждения представляют собой мое понимание систем типов (которые испытывают слишком мало практического опыта вне Java-мира); исправьте ошибки.
Статическое/динамическое различие кажется довольно четким:
- Статически типизированные langauges присваивают каждой переменной, полю и параметру тип, а компилятор предотвращает назначение между несовместимыми типами. Примеры: C, Java, Pascal.
- Динамически типизированные языки рассматривают переменные как универсальные бункеры, которые могут содержать все, что угодно - типы проверяются (если вообще) только во время выполнения, когда вы фактически выполняете операции над значениями, а не когда вы их назначаете, Примеры: Smalltalk, Python, JavaScript.
- Вывод типа позволяет статически типизированным языкам выглядеть (и иметь некоторые из преимуществ) динамически типизированных, вызывая типы из контекста, так что вам не нужно объявлять их больше всего время - но в отличие от динамических языков, вы не можете используйте переменную, чтобы сначала сохранить строку, а затем назначить ей целое число. Примеры: Haskell, Scala
Я гораздо менее уверен в сильном/слабом различии, и я подозреваю, что он не очень четко определен:
- Сильно типизированные языки присваивают каждому значению времени выполнения тип и разрешают только операции, которые определены для этого типа, в противном случае существует явная ошибка типа.
- На слабо типизированных языках нет проверок типа времени выполнения - если вы попытаетесь выполнить операцию над значением, которое оно не поддерживает, результаты непредсказуемы. Это может на самом деле сделать что-то полезное, но, скорее всего, вы получите поврежденные данные, сбой или некоторая недокопимая вторичная ошибка.
- Кажется, что существует как минимум два разных типа слабо типизированных языков (или, возможно, континуум):
- В C и ассемблере значения представляют собой в основном ведра бит, поэтому все возможно, и если вы получите компилятор для разыменования первых 4 байтов строки с нулевым завершением, вам лучше надеяться, что она приведет куда-нибудь, где не будет юридической машины код.
- PHP и JavaScript также обычно считаются слабо типизированными, но не считают значения непрозрачными ведрами; однако они будут выполнять неявные преобразования типов.
- Но эти неявные преобразования, по-видимому, применяются в основном к переменным string/integer/float - действительно ли это требует классификации как слабо типизированной? Или есть другие проблемы, когда эта система типов языков может обмануть ошибки?