Относительно статической и динамической печати вы мертвы на деньги. Статическая типизация означает, что программы проверяются перед выполнением, и программа может быть отклонена до ее запуска. Динамическая типизация означает, что типы значений проверяются во время выполнения, а плохо напечатанная операция может привести к остановке программы или иным образом сигнализировать об ошибке во время выполнения. Основной причиной статической типизации является исключение программ, которые могут иметь такие «ошибки динамического типа».
Боб Харпер утверждает, что динамически типизированный язык может (и должен) рассматриваться как статически типизированный язык с одним типом, который Боб называет "значением". Это мнение справедливо, но оно полезно только в ограниченных контекстах, таких как попытка быть точным в теории типов языков.
Хотя я думаю, что вы поняли концепцию, ваши маркеры не дают понять, что вывод типа - это просто особый случай статической типизации . В большинстве языков с выводом типа аннотации типов являются необязательными, но не обязательно во всех контекстах. (Пример: подписи в ML.) Усовершенствованные системы статических типов часто дают вам компромисс между аннотациями и логическим выводом; например, в Haskell вы можете вводить полиморфные функции более высокого ранга (слева от стрелки), но только с аннотациями. Таким образом, если вы хотите добавить аннотацию, вы можете заставить компилятор принять программу, которая будет отклонена без аннотации. Я думаю, что это волна будущего в выводе типа.
Идеи «сильной» и «слабой» типизации я бы охарактеризовал как , бесполезные , потому что они не имеют общепризнанного технического значения. Строгая типизация обычно означает, что в системе типов нет лазеек, в то время как слабая типизация означает, что система типов может быть подорвана (аннулируя любые гарантии). Термины часто используются неправильно для обозначения статической и динамической типизации. Чтобы увидеть разницу, подумайте о C: язык проверяется на тип во время компиляции (статическая типизация), но существует множество лазеек; вы можете в значительной степени привести значение любого типа к другому типу того же размера - в частности, вы можете свободно приводить типы указателей. Паскаль был языком, который предназначался для строгой типизации, но, как известно, имел непредвиденную лазейку: вариант записи без тега.
Реализации строго типизированных языков часто приобретают лазейки со временем, обычно, так что часть системы времени выполнения может быть реализована на языке высокого уровня. Например, в Objective Caml есть функция с именем Obj.magic
, которая во время выполнения просто возвращает свой аргумент, но во время компиляции преобразует значение любого типа в значение любого другого типа. Мой любимый пример - это Modula-3, дизайнеры которого назвали свою конструкцию литья типов LOOPHOLE
.
Я призываю вас избегать терминов «сильный» и «слабый» в отношении систем типов и вместо этого точно сказать, что вы имеете в виду, например, «система типов гарантирует, что следующий класс ошибок не может возникнуть во время выполнения» (сильный), «система статического типа не защищает от определенных ошибок времени выполнения» (слабый) или «система типов имеет лазейку» (слабый). Просто называть систему типов «сильной» или «слабой» само по себе не очень-то много.