По мотивам вот этого поста:
Re[3]: А не залудить ли нам свой язык для дотнета?Автор: Воронков Василий
Дата: 09.12.03
ВВ>Ты бы лучше объяснил нам, ламерам, как ты все это себе представляешь.. И на чем писать? На С++ или что по-круче?
Итак. Сначала о средствах разработки...
В качестве языка программирования для этой разработки я однозначно выбираю C#.

На нем намного проще писать. Он порождает относительно шустрый код. Он позволяет избежать многомесячной отладки. Модель кода (о ней чуть позже) просто идеально подходит для GC (не нужно следить за ссылками и освобождать их). Ну, и в конце концов конечную версию компилятора можно будет скомпилировать на самом же новом компиляторе.
В проект будет включен только компилятор в MSIL, т.е. генерация кода для конкретного процессора, оптимизация и множество других низкоуровневых проблем.
А теперь об этапах...
1. Первым этапом должно быть воспроизведение фич имеющихся в компиляторе C# версии 2.0 (спецификации которого можно посмотреть здесь:
http://msdn.microsoft.com/vcsharp/team/language/default.aspx)
1.1. Как первый подэтап нужно создать парсер C# 2.0 который будет читать исходные файлы C# и воздавать дерево разбора (объектную модель схожую с CodeDom, но более полную и удобную). Назавем это RsdnCodeModel.
1.2. Второй подэтап — нужно создать генератор кода. На вход ему будет подаваться дерево RsdnCodeModel, а на входе получаться MSIL (сборки).
2. Второй этап как раз продумывание и добавление нужных фич. (до этого еще нужно дожить).
В качестве теории всем кто хочет принять участие в данном проекте нужно будет изучить литературу по теории построении компиляторов. Например, вот эту книгу:
Компиляторы: принципы, технологии и инструментарий. Так же можно просто поискать по книжным сайтам по слову
компиляторов.
Теперь по подробнее... Разберем п. 1.1.
Писать парсер вручную очень и очень
Для создания парсеров используются клоны знаменитейшей программы
yacc (переводится как еще один компилятор компиляторов). Я провел некоторые исследования и вывил два лучше всего подходящих для этого проекта клона:
1. Порт на .NET довольно известного клона yacc-а — Jey-я. Данный порт сделан разработчиками моно (
http://go-mono.org). Имеется кривенькая (не соответствует стандарту) но все же рабочая реализация компилятора.
2. ANTLR (
http://www.antlr.org) нечто самостийное. Честно говоря не разбирался (увлекся ждеем). Но многие хвалят. Говорят круто.

Как я понимаю эта штука поддерживает шаблоны (впрочем как и Jey) что позволяет генерировать на нем в том числе и исходники на C#-е.
Преимущества Jey-я:
1. Написан на С (быстро работает, в качестве runtime-а нужна одна DLL-ка).
2. Парсер генерируется по шаблоне, который легко меняется (просто файл).
3. Для него есть две грамматики. Одна из них просто из проекта Моно (т.е. хотя и кривая, но проверенно рабочая). Другая из книжки которую я привел выше.
4. Я с ним вроде как разобрался.

5. Классический yacc (много документации).
Недостатки Jey-я:
1. Похоже что он менее гибок по сравнению с ANTLR.
2. Генерируемый код тяжело поддается отладке.
3. Довольно тяжело обеспечить качественную обработку ошибок возникающих при прасинге.
О ANTLR-е... (Честно говоря я мало о нем знаю, но все же)
Достоинства ANTLR-а:
1. Генерирует читабельный код разбора (использует LL(k) грамматику — т.е. последовательный разбор хорошо укладывающийся в голову людей).
2. Вроде как гибок и крут, но так как я в нем ничерта не понимаю все это слова авторов...
Недостатки ANTLR-а:
1. Использует Яву 1.1. (собственно на ней написан).
2. Я его почти не знаю.
3. Имеющаяся грамматика для C# явно не соответствует стандарту.
4. Нет реальных реализаций компиляторов C# сделанных на ANTLR.
5. Судя по всему он медленнее чем Jey, но это не главное. Главное насколько быстр получаемый парсер. В Jey-е вроде как получается ДКА (детерминированный конечный автомат), т.е. шустрее уже некуда. С другой стороны может и ANTLR тоже генерит приличный код.
На счет копирайтов не разбирался. Но похоже сгенерированный код на обоих можно использовать без каких бы то ни было отчислений.
PS
Задачи на ближайшее будующее
1. Определиться в выборе генератора парсера.
У меня уже есть лексер совместимый с Jey-ем. ANTLR сам имеет в себе средства лексического разбора.
2. Взять за основу имеющуюся грамматику и создать на ее основе дерево разбора. В принципе на Jey-е у меня уже есть кое какие наработки. Могу выложить на сайт.
Если выберем Jey, то в принципе можно воспользоваться Моновскими наработками. У них уже есть готовый компилятор. Проблема только в копирайтах. Кому ни будь нужно провентилировать вопрос "насколько можно использовать код Моно" в такой разработке. Если можно. То задача упрощается до нельзя. Правда там есть некоторые кривости которые следовало бы исправить. Ну, да это куда проще, чем делать свой компилятор с нуля.
Самой большой проблемой в Моно является то, что их генератор кода намертво сросся с парсером. А парсер было бы очень полезно иметь отдельно, так как его можно использовать для разбора кода (например, для конвертации C# в VB).
... << RSDN@Home 1.1.2 beta 1 >>
16.12.03 19:18: Перенесено модератором из '.NET' — TK
18.12.03 06:12: Перенесено модератором из 'Философия программирования' — IT