Nemerle 2 - этапы проекта
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.12.10 01:13
Оценка: 2 (1)
Для начала что планируется реализовать в 2.0:
1. Макросы нового поколения основанные на динамически расширяемом PEG-е.
2. Чистовое переписывание компилятора.
3. Смена бэкэнда на один из следующих API: CCI Metadata, AbsIL из F#, Mono Cecil или на все сразу (если не возникнет противопоказаний).
4. Доработка API и причесывание названий. Так основная работа по типизации будет производиться на расширенном PExpr. В него будут добавлены описания типов и другая информация необходимая для типизированной работы с ним.
5. Разбиение компилятора на компоненты/модули.

Этапы

1. Реализация чтения метаданных и наполнения ими типов абстрагирующих типы от платформы и нижележащих API (CCI Metadata, AbsIL из F#, Mono Cecil, ...).
2. Реализация новой подсистемы макросов. Она должна позволить задавать полноценные грамматические правила в описании синтаксических макросов.
3. Рефакторинг и доработка PExpr.
4. Реализация на базе макросов нового парсера. На выходе он должен выдавать PExpr.
5. Переписывание типизатора. На выходе он будет получать PExpr, а на выходе возвращать PExpr же, но с расставленными типами. Логика работы типизатора так же изменится. Оригинальный алгоритм Москаля предпологал откладывать типизацию частей АСТ тип которых нельзя вывести при прямом проходе. Но это не всегда работодателе (есть проблемы с вложенными вызовами), работает медленно, и создает проблемы, так как некоторый код типизации повторяется сначала в рамках процесса прямой типизации, а затем в процессе отложенной типизации. Алгоритм Москаля был мною доработан. Теперь он пытается разрешать вложенные объекты отложенной типизации при разрешении перегрузок. Это с одной стороны позволило устранить ограничения оригинального алгоритма, но с другой привело к еще большему его замедлению. В новой версии планируется заменить этот алгоритм на многопроходный. Информация о типах будет помещаться прямо в PExpr. Если ее нельзя вычислить будут помещаться свободные типы. После первого прохода типизация будет запускаться снова пока все типы помещенные в PExpr не будут выведены (замещены FixedType-ами), или пока на одном из проходов не удастся вывести новых типов.
6. Переписывание трансформатора PExpr в TExpr. TExpr теперь не будет требоваться для работы макросов. Однако появится возможность вмешаться в процесс трансформации PExpr -> TExpr, что позволит реализовывать ложные DSL-и и даже новые языки.
7. Переписывание оптимизатора, точнее трансформатора TExpr -> TExpr. Планируется сделать так, чтобы можно был добавлять любое количество таких трансформаторов, что позволит подключать собственные оптимизаторы и т.п.
8. Переписывание генератора IL-а. Опять же планируется предоставить возможность вмешиваться в этот процесс. Кроме того планируется сделать квази-цитирование для IL-а или встроенный IL а-ля встроенный ассемблер.

Некоторые из этапов можно реализовывать параллельно. Например, 1 и 2.

Модули

Планируется выделить из компилятора следующие модули:
* Core — будет содержать фабрики требующиеся для создания других типов, загрузки других модулей и подключения цепочек перехвата. В этом модуле будут находиться основные типы используемые другими модулями. Первые комиты этого модуля уже сделаны. Так что можно посмотреть на ряд базовых типов (относящихся пока что только к системе типов).
* MetadataHelper — отвечает за чтение метаданных из внешних сборок и их перепаковку во внутренне представление компилятора. В этом модуле будут находится реализации типов объявленных в Core. Можно сделать несколько таких модулей, по одному на каждый из поддерживаемых API работы с IL-ом. Кроме того этот модуль должен обеспечивать преобразование типов созданных в компиляторе в типы нижележащего IL-API.
* Parser — этот модуль будет отвечать за парсинг исходников и построение по ним AST. Он так же будет ссылаться на Core, так как AST описано именно в нем. На самом деле Parser будет всего лишь менеджером макросов которые и будут производить основную работу по парсингу. В этом модуле и будут располагаться стандартные макросы. В прочем, возможно их будет болше (для разных языков и стилей, например, можно выделить модуль IndentParserExtensions).
* Typer — этот модуль отвечает за типизацию AST. На входе он будет получать типизированное AST и набивать его типами (в несколько проходов). В процессе типизации будут раскрываться не синтаксические макросы.
* Transformer — в его задачи будет входить преобразование TExpr (и другого типизированного AST). В нем будут производиться оптимизации и такие вещи как генерация кода замыканий, инлайнинг, оптимизация и т.п.
* ILGenarator — как следует из названия этого модуля он будет отвечать за генерацию IL-а. Возможно он будет единым целым с модулем MetadataHelper, или связан с ним "братскими узами". Это нужно так как этому модулю нужна скрытая информация хранящаяся в типах и которая добывается из внешних сборок.

Последние два модуля скорее всего не будут нужны для работы в режиме IDE. Остальные же модули будут использоваться как в консольном компиляторе, так и в классах поддержки IDE. Кроме того будет доступна и компонентная версия компилятора с помощью которой можно будет компилировать код "на лету" или реализовать REPL.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.