Система типов и вывод типов
От: metadeus  
Дата: 27.11.12 10:43
Оценка: 1 (1)
Добрый день!

Не могу найти не большого и внятного описания проектирования и создания статической системы типов и реализации вывода типов. Читаю TAPL, но он достаточно сложен для понимания неподготовленному читателю, без хорошего мат. бекграунда. Может вы встречали описание решения подобной задачи или решали/знаете как решать?

Задача простая: есть язык (для простоты возьмем диалект Лиспа, чтобы не заморачиваться синтаксисом), есть примерное понимание системы типов, которая должна быть реализована в языке -- Система F (лямбда-исчисление с полиморфизмом). Для простоты можно взять только простые варианты типов: примитивные типы (действительное — целое — знаковое/беззнаковое целое), структура, объединение (с тегом типа и без тега типа (C-style)).

Как я сейчас вижу себе решение этой задачи:
— Тип включает ссылки на базовые типы и ссылки на типы наследники, любой тип может быть приведен к базовому, то есть отношение наследования в типах реализует отношение "является": беззнаковое целое является целым, целое является действительным и т.д.
— Вывод типов для выражения происходит следующим образом, на примере:
Дано:
— результат парсинга входной строки -- '(+ (to_str 10) abc)
— лисп-система содержащая символы:
— + имеет тип (generic-function a b) со следующими реализациями (+ a:int b:int):int и (+ a:string b:string):string к примеру
— to_str имеет тип (generic-function a) со следующими реализациями (to_str a:int):string и (to_str a:uint):string
— abc имеет тип string

Нужно: проставить типы всему выражению и всем подвыражениям

Алгоритм решения:
1) Нужно составить систему уравнений для всех ограничений типов выводимых из использования выражений
1.1) Каждому выражению присваиваем уникальное имя: + = A, 10 = B, abc = C, to_str = D, (to_str 10) = E, (+ (to_str 10) abc) = F
1.2) Добавляем все ограничения типов последовательно
1.2.1) Список F типизируем по первому элементу, подтипам в нем тоже присваиваем уникальные имена (G H I):



1.2.2) Далее список E (J K):



1.2.3) Типизируем B по значению, выбираем наиболее узкий тип (в реальном применении тут может быть правило -- наиболее узкий, но не уже машинно-специфичного, то есть не ubyte, а uint например, для эффективности)



1.2.3) Второй параметр в F -- С:



1.3) Полученная система уравнений:



2) Нужно эту систему уравнений решить, решать её можно по идее хоть в лоб прямым перебором в ширину или глубину, это уже вопрос скорости процесса компиляции, здесь же решим её аналитически:



3) Здесь по идее мы получили ошибку вывода типа, т.к. 10 может быть как int, так и uint и требуется дополнительная декларация типа. Если такую декларацию добавить:


(+ (to_str (: 10 uint)) abc)



То выражение будет типизироваться корректно.

--

Правильное или не правильное понимание сути решения задачи? Каким образом лучше/проще реализовать систему записи и решения таких уравнений? Есть ли уже какие-то готовые системы вывода типов на Си++?
Re: Система типов и вывод типов
От: marat321  
Дата: 27.11.12 11:31
Оценка:
Здравствуйте, metadeus, Вы писали:

M>Не могу найти не большого и внятного описания проектирования и создания статической системы типов и реализации вывода типов. Читаю TAPL, но он достаточно сложен для понимания неподготовленному читателю, без хорошего мат. бекграунда. Может вы встречали описание решения подобной задачи или решали/знаете как решать?


Вот эту статью читали на тему Хиндли-Милнера?
http://www.fprog.ru/2010/issue5/roman-dushkin-hindley-milner/
Re[2]: Система типов и вывод типов
От: metadeus  
Дата: 27.11.12 12:04
Оценка:
Здравствуйте, marat321, Вы писали:

M>Вот эту статью читали на тему Хиндли-Милнера?

M>http://www.fprog.ru/2010/issue5/roman-dushkin-hindley-milner/

Нет ещё, спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.