Создание компилятора языка для .NET Framework

ОГЛАВЛЕНИЕ

Эксперты по компиляторам являются знаменитостями в компьютерном мире. Я видел, как Андерс Хейльсберг (Anders Hejlsberg) представлял презентацию на конференции разработчиков Professional Developers Conference и когда он сошел со сцены, его встретила целая орда мужчин и женщин, просящих поставить автограф на книгу, или сняться на фотографии вместе с ними. Люди, посвящающие свое время изучению и пониманию всех тонкостей лямбда-выражений, систем типов и языков сборки, кажутся своего рода носителями тайных знаний. Теперь и читатели этой статьи могут разделить их славу, написав собственный компилятор для Microsoft .NET Framework.

Существуют сотни компиляторов для десятков языков, предназначенные для .NET Framework. .NET CLR сгоняет эти языки в одну песочницу, где они могут играть и мирно взаимодействовать. Крутой разработчик может воспользоваться этим, при создании крупных программных систем, добавляя кусочек C# и каплю Python. Конечно, мастерство этих разработчиков впечатляет, он они и рядом не стоят с истинными мастерами – экспертами по компиляторам, ибо именно эти эксперты обладают глубоким пониманием виртуальных машин, структуры языков и составляющих компонентов этих языков с компиляторами.

В этой статье, я разберу код для компилятора, написанного на C# (метко названного компилятором Good for Nothing («Бесполезным»)), а попутно представлю читателям высокоуровневую архитектуру, теорию и API-интерфейсы .NET Framework, необходимые для создания собственного компилятора .NET. Я начну с определения языка, исследую архитектуру компилятора и затем продемонстрирую подсистему создания кода, которая выдает сборку .NET. Цель здесь заключается в том, чтобы помочь читателям понять основы разработки компиляторов и дать твердое, высокоуровневое понимание того, как языки эффективно ориентируются на CLR. Я не буду здесь разрабатывать эквивалент C# 4.0 или IronRuby, но мой рассказ все же содержит достаточно конкретики, чтобы разжечь в заинтересованных читателях страсть к искусству разработки компиляторов.