Якщо коротко: як класифікуються системи типів в академічному контексті; зокрема, де я можу знайти авторитетні джерела, які роблять чіткими відмінності між різними типами системи?
У певному сенсі складність цього питання полягає не в тому, що я не можу знайти відповідь, а в тому, що я можу знайти занадто багато, і жодне не виділяється як правильне. Фон полягає в тому, що я намагаюся вдосконалити статтю у вікі Haskell про введення тексту , яка наразі вимагає таких відмінностей:
- Немає введення тексту: Мова не має поняття типів або з введеної точки зору. У мові існує точно один тип. Мова складання має лише тип 'бітовий шаблон', у Rexx та Tk є лише тип 'текст', в ядрі MatLab є лише тип 'складнозначна матриця'.
- Слабке введення тексту: Є лише кілька виділених типів і, можливо, введіть синоніми для кількох типів. Напр. C використовує цілі числа для булевих, цілих чисел, символів, наборів бітів та перерахувань.
- Сильне введення тексту: Дрібнозернистий набір типів, таких як ада, віртська мова (Паскаль, Модула-2), Ейфелева
Це цілком суперечить моєму особистому сприйняттю, яке більше відповідало:
- Слабка типізація: Об'єкти мають типи, але неявно перетворюються на інші типи, коли цього вимагає контекст. Наприклад, Perl, PHP та JavaScript - це всі мови, на яких
"1"
можна використовувати більш-менш будь-який контекст1
. - Сильне введення тексту: Об'єкти мають типи, і немає неявних перетворень (хоча перевантаження може використовуватися для їх моделювання), тому використання об'єкта в неправильному контексті є помилкою. У Python індексація масиву з рядком або float кидає виняток TypeError; в Haskell це не вдасться під час компіляції.
Я попросив думки з цього приводу у інших людей більш досвідчених у цій галузі, ніж я, і хто дав цю характеристику:
- Слабка типізація: Виконання недійсних операцій над даними не контролюється та не відхиляється, а лише дає недійсні / довільні результати.
- Сильне введення тексту: Операції над даними дозволяються лише у випадку, якщо дані сумісні з операцією.
Як я розумію, перша і остання характеристики називали б C слабо типованою, друга - назвала б сильно типізованою. Перші та другі називають Perl та PHP слабко типізованими, треті називають їх сильно набраними. Усі троє описують Python як сильно типізований.
Я думаю, що більшість людей сказали б мені «добре, немає єдиної думки, немає прийнятого значення термінів». Якщо ці люди не праві, я був би радий почути про це, але якщо вони мають рацію, то як же дослідники CS описати і порівняти системи типів? Яку термінологію я можу використовувати, що менш проблематично?
Як пов'язане з цим питання, я вважаю, що динамічне / статичне розмежування часто дається у термінах "час компіляції" та "час запуску", що я вважаю незадовільним, враховуючи, що мова чи мова складена не стільки властивість цієї мови як його реалізації. Я вважаю, що має бути суто семантичний опис динамічної та статичної типізації; щось уздовж рядків "статична мова - це та, в якій може бути введено кожний підвираз". Буду вдячний за будь-які думки, зокрема посилання, які б пояснили це поняття.