Алгоритми перевірки типу


19

Я починаю особисте бібліографічне дослідження алгоритмів перевірки типу та хочу поради. Які найчастіше використовуються алгоритми, стратегії та загальні методи перевірки типу?

Мені особливо цікаві складні алгоритми перевірки типу, які були реалізовані у широко відомих сильно статичних мовах типу, наприклад, C ++, Java 5+, Scala та інших. IE, алгоритми перевірки типу, які не дуже прості через дуже просте введення основної мови (наприклад, Java 1.4 і нижче).

Мене не цікавить конкретна мова X, Y або Z. Мене цікавлять алгоритми перевірки типу незалежно від мови, на яку вони націлені. Якщо ви надаєте відповідь типу "мова L, про яку ви ніколи не чули, яка сильно набрана, а введення складне, має алгоритм перевірки типу, який робить A, B і C, перевіряючи X і Y за допомогою алгоритму Z", або "the Стратегія X і Y, використовувана для Scala, а варіант Z з A, який використовується для C #, є здоровим через особливості R, S і T, що працює таким чином ", тоді відповіді хороші.


3
Можливо, ви повинні відредагувати це запитання, щоб запитати про перевірку типу для певної мови. Питання в стилі списків відкритого типу, як правило, не відштовхуються від SE (хоча на цьому конкретному веб-сайті поки немає політики щодо цього). Також: <type-system-elitist> Система типу Java не є складною </type-system-elitist>.
sepp2k

3
Можливо, питання може бути переосмислене як більш конкретне, але я не думаю, що його слід закривати.
Дейв Кларк

1
@ sepp2k: Я знаю, що вона трохи широка, але закінчилася так, тому що я не хочу обмежувати корисність відповідей. До речі, я не зрозумів, що ви хочете сказати з "<type-system-elitist> Система типу Java не є складною </type-system-elitist>". Система типу Java 1.4 і нижче насправді була простою, але загальна версія Java 3 стала набагато складнішою.
Віктор Стафуса

2
Запит на одну конкретну мову зробив би питання непридатнішим для цього сайту, imho. Питання, можливо, може задати загальні методи.
Рафаель

1
@Victor Основним інструментом є граматики атрибутів . Ви, можливо, не зможете зробити будь-яку нечестиву річ, яку можете собі уявити, але вони є гарною відправною точкою.
Рафаель

Відповіді:


13

Більшість досліджень фактично не публікують алгоритми перевірки типів для повномасштабних мов програмування. Ви знайдете деякі формалізації значної частини систем типу для повноцінних мов програмування, такі як робота, виконана Дросопулу та Айзенбахом для роботи Java або Ніпкова та ін над C ++ . Однак частіше ви знайдете лише системи типів для якоїсь основної частини мови (легкий Java - один приклад) або для основних концепцій мови, таких як локальний тип підходу шкали .

На таких конференціях, як POPL та ICFP, ви знайдете багато алгоритмів перевірки типів для конкретних типів типних систем, а також нові підходи, такі як двостороння та трибічна перевірка типу.

Більш загально, вам, мабуть, потрібно знати про алгоритм Дамаса-Мілнера , локальне виведення типу, перевірку двостороннього та тринаправленого типу, а також розширитись звідти, дотримуючись посилань у статтях та за допомогою вченого google, щоб знайти, які документи цитують їх та надалі будувати описані підходи. Також, як було запропоновано вище, конференції, такі як POPL, ICPF, ESOP і навіть ECOOP та OOPSLA, матимуть документи, що відповідають вашим квестам.


Афаїк, система типу Scala, була розроблена в дослідницьких проектах і тому публікується. Компілятор також є відкритим джерелом. Хоч і не заглянули в жодне.
Рафаель

Не потрібно мені робити висновок; Я знаю, що є опубліковані статті про систему типу Scala. Ця претензія легко перевіряється шляхом пошуку . Крім того, я вважаю вихідний код компілятора як достатню публікацію в алгоритмі (за умови, що він включений у джерела; я припускаю, що не перевіряв). Моє початкове твердження було неоднозначним, правдивим, але ваша реакція видається необґрунтованою.
Рафаель

2

Основним інструментом є граматики атрибутів . Ви, можливо, не зможете зробити будь-яку нечестиву річ, яку можете собі уявити, але вони є гарною відправною точкою.

По суті, ви можете переходити абстрактне синтаксичне дерево програми зверху вниз та / або знизу вгору та передавати інформацію навколо. Так, наприклад, ви можете передати інформацію про тип глобального діапазону (наприклад, класи та їх члени) вниз і визначити тип виразів рекурсивно, тобто знизу вгору, передаючи отримані типи вгору.

Знайдіть пояснення та приклади на слайдах тут (глава 5).


Хтось має кращу довідку? Я думаю, мені потрібно придбати книгу "Драконів" або "Вільгельм / Маурер" днями ...
Рафаель

1
Інструмент JastAdd - це відмінна, сучасна компіляторна система компілятора, заснована на граматиках еталонних атрибутів. Ми використовували його в ряді проектів.
Дейв Кларк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.