Вкратце: как системы типов классифицируются в академическом контексте; в частности, где я могу найти авторитетные источники, в которых четко различаются различные типы систем типов?
В некотором смысле, проблема в этом вопросе не в том, что я не могу найти ответ, а скорее в том, что я могу найти слишком много, и ни один не выделяется как правильный. Предпосылкой является то, что я пытаюсь улучшить статью на вики-странице Haskell о наборе текста , которая в настоящее время имеет следующие различия:
- Нет типизации: язык не имеет представления о типах, или с точки зрения типизации: в языке есть только один тип. Язык ассемблера имеет только тип «битовый шаблон», Rexx и Tk имеют только тип «текст», ядро MatLab имеет только тип «комплексная матрица».
- Слабая типизация: существует только несколько выделенных типов и, возможно, синонимов типов для нескольких типов. Например, C использует целые числа для логических, целых чисел, символов, наборов битов и перечислений.
- Строгая типизация: мелкозернистый набор типов, таких как языки ада, виртский язык (паскаль, модула-2), эйфелева
Это полностью противоречит моему личному восприятию, которое было больше похоже на:
- Слабая типизация: объекты имеют типы, но неявно преобразуются в другие типы, когда этого требует контекст. Например, Perl, PHP и JavaScript - это все языки, на которых
"1"
можно использовать более или менее любой контекст, который1
может. - Строгая типизация: у объектов есть типы, и не существует неявных преобразований (хотя для их имитации может использоваться перегрузка), поэтому использование объекта в неправильном контексте является ошибкой. В Python индексирование массива со строкой или с плавающей точкой вызывает исключение TypeError; в Haskell это не удастся во время компиляции.
Я спросил мнение об этом у других людей, более опытных в этой области, чем я, и один из них дал такую характеристику:
- Слабая типизация: выполнение недопустимых операций с данными не контролируется и не отклоняется, а просто приводит к неверным / произвольным результатам.
- Строгая типизация: операции над данными разрешены только в том случае, если данные совместимы с операцией.
Насколько я понимаю, первая и последняя характеристики будут называть C слабо типизированными, а вторая будет называть его строго типизированными. Первое и второе будут вызывать Perl и PHP со слабой типизацией, третье будет называть их строго типизированными. Все три описывают Python как строго типизированный.
Я думаю, что большинство людей скажут мне: «Ну, нет консенсуса, нет общепринятого значения терминов». Если эти люди не правы, я был бы рад услышать об этом, но если они правы, то как же исследователи CS описать и сравнить системы типов? Какую терминологию я могу использовать, что менее проблематично?
Как связанный вопрос, я чувствую, что динамическое / статическое различие часто дается в терминах «времени компиляции» и «времени выполнения», что я нахожу неудовлетворительным, учитывая, что то, является ли язык компилируемым, является не столько свойством этого языка как его реализации. Я чувствую, что должно быть чисто семантическое описание динамической и статической типизации; что-то вроде «статический язык - это язык, на котором можно напечатать каждое подвыражение». Я был бы признателен за любые мысли, особенно ссылки, которые вносят ясность в это понятие.