Компилятор ETH Zonnon для .NET Compiler Project

advertisement
Нижегородский государственный университет им. Н.И. Лобачевского
Компилятор ETH Zonnon
для .NET
Compiler Project
По материалам презентации Е.А. Зуева. Москва, 2003
1
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Язык Zonnon
 Авторы
 Jürg Gutknecht, ETH Zürich
 Евгений Зуев, ETH Zürich
 Первый компилятор с языка Zonnon
для платформы .NET реализован в
Швейцарском федеральном
технологическом институте
Евгением Зуевым
2
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
План
 Проблемы исследовательских
языков и компиляторов
 Компилятор ETH Zonnon
 Технология CCI
 Интеграция в VS
3
Нижегородский государственный университет им. Н.И. Лобачевского
Исследовательские языки
на платформе .NET
По материалам презентации Nick Benton, Microsoft Research, Cambridge UK
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Языки программирования
 C, C++, Visual Basic, Java, JScript, Perl,
Cobol,... подходят для большинства
коммерческих и индустриальных проектов
 Но содержат в себе только часть
существующих разработок в области языков
программирования
5
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Проблема
 Для разработчиков языков программирования
 Большой объем работы, которую нужно выполнить
для реализации компилятора для нового язык.
Большая часть которой не является специфичной
для него как:
 Сборка мусора
 Многопоточность
 Линковка
 Среда разработки
 Машинно-зависимые оптимизации
 И если вы хотите что-либо делать на новом языке,
то вам нужно реализовать богатую стандартную
библиотеку
6
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Проблема
 Для разработчиков
 Библиотеки и межъязыковое взаимодействие в
исследовательских компиляторах никогда не
бывают достаточно хороши. Склеивание нового
кода со старым приводит
 Созданию автоконвертаторов
 Общее низкоуровневое представление
 …
 В итоге считается что лучше всё писать на C++
 Среда разработки также редко бывает сильно
продвинутой.
7
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Решение
 .NET Common Language Runtime предоставляет
богатый набор сервисов для разработчиков
компиляторов
 Таким образом становится гораздо проще создать
работающую систему с хорошей производительностью
 Предоставляет естественную систему типов,
менеджер памяти, загрузчик, и т.д. упрощая
межъязыковое взаимодействие
 Вы можете обращаться к широко используемым
библиотекам и компонентам приложений написанным
на других языках напрямую
8
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Исследовательские языки
и платформа .NET
 Microsoft работает с ведущими
исследователями в области языков
программирования по всему миру
 Перенцацеливание их любимых языков
на платформу .NET
 Демонстрация межъязыкового
взаимодействия
9
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Haskell
Oz
Caml
Mercury
Standard ML
Component Pascal
Lightning Oberon
Scheme
Eiffel
10
Нижегородский государственный университет им. Н.И. Лобачевского
Компилятор
Zonnon для .NET
По материалам презентации Е.А. Зуева. Москва, 2003
11
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Задачи проекта
ETH Zonnon Compiler
•
Реализовать базовую версию компилятора
для платформы Microsoft .NET:
- подмножество входного языка;
- генерация MSIL-кода в полном формате;
- режим командной строки.
•
Обеспечить полную интеграцию компилятора со средой
разработки MS Visual Studio .NET:
- текстовый редактор;
- фоновая компиляция;
- управление проектами;
- отладчик etc.
•
Выполнить “раскрутку” (bootstrapping) полного
компилятора на языке Zonnon.
12
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Компилятор Zonnon
•
•
•
•
•
Реализован для платформы .NET
Генерирует стандартную сборку (Assembly)
Реализован с использованием пакета CCI
Интегрирован в среду MS Visual Studio .NET
Создан в ETH Zürich, Switzerland
Source
Code
Zonnon Compiler
Assembly
CCI Framework
.NET Platform
Visual Studio
13
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Компиляторы для .NET:
возможные подходы
•
Непосредственная («ручная») компиляция
в MSIL/Metadata (нет примеров) или в язык
ассемблера MSIL («toy compilers»).
•
Использование «родного» для .NET языка
(напр. C#) в качестве промежуточного (Eiffel)
•
Генерация MSIL-кода средствами низкого уровня из
пространств имен System.Reflection и
System.Reflection.Emit (Component Pascal, авт. John
Gough; Oberon.NET)
•
Высокоуровневая поддержка - CCI:
построение дерева программы
с (полу)автоматической генерацией IL+MD
(ASML, Zonnon for .NET).
14
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Модель компиляции Zonnon
IL/MD
Writer
Source
IR
(AST)
Scanner
&
Parser
MSIL+MD
Output
Assembly
IL/MD
Reader
Visitors
Imported
Assemblies
Zonnon-часть:
Cпецифична для языка
CCI-часть:
Общая для всех языков
15
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Модель компиляции Zonnon
Scanner
&
Parser
Visitors
IR
(AST)
Проекции
Zonnon
AST
Реализуется семантическая специфика Zonnon;
Выполняется сериализация «интерфейсной»
части AST для последующей статической
комплексации в собственных терминах языка
CCI’s
AST
Проекции (mappings): отображение
специфических свойств Zonnon на
семантически эквивалентные
16
структуры .NET
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Проекции Zonnon -> .NET




DEFINITION
абстрактный интерфейс; interface
IMPLEMENTATION
реализация интерфейса по умолчанию;
единица агрегации; class
OBJECT
шаблон (класс), реализующий интерфейс;
возможно, «активный» объект;
sealed class
MODULE
контейнер ресурсов; класс, управляемый
системой; class with static members
17
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Проекции Zonnon->.NET:
Definitions & Implementations
Zonnon
DEFINITION D;
TYPE e = (a, b);
VAR x: T;
PROCEDURE f (t:T);
PROCEDURE g ():T;
END D;
IMPLEMENTATION D;
VAR y: T;
PROCEDURE f (t: T);
BEGIN x := t; y := t
END f;
END D;
C#
interface D_i {
T x { get; set; }
void f(T t); T g (); };
internal class D_b: D_i {
private T x_b;
public enum e = (a, b);
public T x {
get { return x_b };
set { x_b = ... }}};
public class D_c: D_b {
T y;
void f(T t)
{ x_b = t; y = t; } };
18
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Проекции Zonnon->.NET: Objects
Zonnon
OBJECT X IMPLEMENTS D;
IMPORT D;
VAR y : T;
PROCEDURE g (): T IMPLEMENTS D.g;
BEGIN y := D.x; RETURN D.y
C#
END g;
public sealed class X: D_I
END X;
{ D_c d; T y;
Проекция с отдельным
public override T g() {
helper-классом
y = d.x; return d.y; } }
Проекция
с базовым классом
public sealed class X: D_i, D_c d;
{ T y;
public override T g() {
y = x_b; return y_b }}
19
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Проекции Zonnon->.NET:
Active Objects
Zonnon
C#
Исходная конструкция Проекция на C#
ACTIVITY S END
Метод: void body() { S };
Поле: Thread thread;
Создание активного
объекта (неявный запуск
«активности»)
x.thread = new Thread(
new ThreadStart(body))
x.thread.Start()
AWAIT cond;
while ( !cond )
{ Monitor.Wait(this); }
BEGIN { LOCKED }
S
END
Monitor.Enter(this);
S;
Monitor.PulseAll(this);
Monitor.Exit(this);
20
Нижегородский государственный университет им. Н.И. Лобачевского
Технология: пакет CCI.
По материалам презентации Е.А. Зуева. Москва, 2003
21
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
CCI: Основа Zonnon-компилятора
 CCI = Common Compiler Infrastructure.
 CCI – набор ресурсов (классов), предоставляющих поддержку реализации компиляторов и
других языковых инструментов для .NET
 Реализация компиляторов;
 Интеграция компиляторов.
 Концептуально, CCI является частью
.NET Framework SDK.
 Спроектирован и реализован в Microsoft;
автор - Herman Venter.
22
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
CCI: сценарии использования
• Интеграция в VS.NET существующих
(“не-CCI”) компиляторов.
• Интеграция в VS.NET компиляторов, полностью
реализованных на основе CCI
• Расширение существующих .NET-языков и
компиляторов (C#, VB etc.).
• Создание процессоров для
посткомпиляционной обработки.
• Учебные компиляторы!
23
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
CCI: Три проблемы
• (Общая)
Разработка компилятора – непростая задача;
интеграция компилятора в среду
программирования – целый спектр
дополнительных проблем.
• (CCI)
CCI реализует существенно отличный от
традиционного подход к процессу компиляции.
• (Техническая)
CCI имеет объемный и нетривиальный
интерфейс, набор правил и «контрактов».
24
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Общие принципы
использования CCI



Все сервисы CCI представлены в виде классов. Чтобы
воспользоваться этими сервисами, необходимо
определить собственные классы, производные от
классов CCI.
В производных классах необходимо обеспечить
реализацию некоторых абстрактных методов
классов-прототипов (они образуют «унифици-рованный
интерфейс» с окружением).
Производные классы содержат функциональ-ность,
реализующую собственную семантику компилятора.
25
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Компоненты CCI
Intermediate Representation (IR) –
Развитая иерархия C#-классов, представляющих
наиболее общие и типичные понятия
System.Compiler.dll
современных ЯП
Преобразователи (“Visitors”) –
Набор классов, реализующих последовательные
преобразования
System.Compiler.Framework.dll
IR  MSIL
Поддержка интеграции –
Совокупность классов и методов,
обеспечивающих интеграцию в среду Visual
Studio (дополнительная функцио-нальность для
редактирования, отладки, фоновой компиляции
etc.)
26
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
IR: промежуточное представление
Node
Expression
UnaryExpression
BinaryExpression
NaryExpression
MethodCall
Indexer
AssignmentExpression
Literal
Parameter
This
Statement
AssignmentStatement
If
For
ForEach
Continue
ExpressionStatement
VariableDeclaration
Часть дерева
наследования IR
Node
Member
TypeNode
Class
DelegateNode
EnumNode
Interface
. . .
TypeParameter
Pointer
Reference
Event
Method
InstanceInitializer
StaticInitializer
Field
Property
Namespace
CompilationUnit
27
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
IR: промежуточное представление
Пример:
public class If : Statement
{
Expression condition;
Block
falseBlock;
Block
trueBlock;
. . .
}
Характеристики IR:
 Весьма прямолинейный подход.

IR почти полностью повторяет
иерархию понятий языка C#.

Включает поддержку некоторых
языковых черт, отсутствующих в
C#.
public class Block : Statement 
{
bool
hasLocals;

StatementList statements;
. . .
}
Поддерживает некоторые будущие
свойства C# (напр., generics).
Вывод: архитектура IR достаточна
для представления широкого
спектра языков с традиционной
парадигмой.
28
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
IR: промежуточное представление
Пример: класс C#
public class C
{
public int m1;
public void f ( ) { m1 = 0; }
}
Class
Identifier
Name
Members
...
Field
Name
Flags
Type
Identifier
Int32
AssignmentStatement
Block
…
…
Method
Identifier
Void
Name
Flags
Type
Statements
...
...
Body
...
29
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Система трансформаций IR в CCI
StandardVisitor
Looker
Declarer
Resolver
Checker
Normalizer
•
•
Каждый Visitor
обходит дерево IR…
…заменяя узлы Identifier ссылками
на сущности, которые обозначает
идентификатор;
…разрешая случаи совместного
использования (overloading) and
вычисляя типы выражений;
…выполняя семантические
проверки;
…готовя дерево к сериализации
(генерации IL+MD).
Можно модифицировать стандартные Visitor’ы и/или
Написать собственные
30
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Организация
синтаксического анализа
Прототип анализатора:
абстрактный класс CCI
using System.Compiler;
namespace ZLanguageCompiler
{
public sealed class ZParser : System.Compiler.Parser
{
public … ParseCompilationUnit(...)
public … ParseExpression(...)
public … ParseStatements(...)
. . .
private … ParseZModule(...)
private … ParseZStatements(...)
. . .
}
}
Собственная логика
Z-парсера
“Унифицированный интерфейс”
парсера: реализует интерфейс
между компилятором и
31
окружением
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Работа с IR: расширение Visitor’ов
Пример расширения Looker’а
using System.Compiler;
Visitor-прототип:
абстрактный класс CCI
namespace ZLanguageCompiler
{
public sealed class ZLooker : System.Compiler.Looker
{
public override Node Visit ( Node node )
{
Метод-“диспетчер”
switch ( node.NodeType ) {
case ZNodeType.NewStmt:
return this.VisitNewStmt((NewStmt)node);
default:
return base.Visit(node);
Семантическая
}
обработка узла
}
public Node VisitNewStmt ( NewStmt node )
{ /* Преобразование NewStmt в некоторый CCI-узел */ }
}
}
32
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Обработка IR:
Активация Visitor’ов
Общая схема работы с IR
Прототип компилятора:
абстрактный класс CCI
public class ZCompiler : System.Compiler.Compiler, ...
{
. . .
protected override void Compile ( CompilationUnit cu,
Class
globalScope,
ErrorNodeList
errors )
{
Типы узлов IR
// Разрешение имен
(new ZLooker(globalScope)).VisitCompilationUnit(cu);
// Разрешение совм.использования и вычисление типов
(new ZResolver()).VisitCompilationUnit(cu);
// Семантические проверки; «исправление» дерева
(new ZChecker(errors)).VisitCompilationUnit(cu);
// Редукция дерева до узлов с предопред.отображением в MD+IL
(new Normalizer().VisitCompilationUnit(cu);
}
. . .
}
33
Запуск Visitor’ов
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Архитектура компилятора:
традиционный подход
Имя исход. файла
Пар-ры компиляции
Compiler Start Up
Исход.
текст
Лексич.
анализ
Посл-ть
лексем
Синт. &
семантич.
анализ
Дерево
прогр.
Окружение
Компилятор
Генерация
кода
Объектный код
Compiler End Up
Компилятор
как “черный ящик”
Файл с объектным
кодом
Диагностические
сообщения 34
Нижегородский государственный университет им. Н.И. Лобачевского
Интеграция в VS.
По материалам презентации Е.А. Зуева. Москва, 2003
35
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Что подразумевается
под интеграцией?
Поведение, которое должен
Компоненты среды
Visual Studio
Менеджер
проектов
Текстовый
редактор
Семантическая
поддержка
(“Intellisense”)
Отладчик
поддерживать компилятор
• Запуск компиляции и сборка
проектов
• Синтаксическая подсветка
• Автоматическое форматирование;
структурн. проход по тексту {}
• Синтаксические проверки на фоне
ввода текста
• «Плавающая» диагностика
• Вывод «содержимого» составного
типа для переменной этого типа
• Вывод списка совместно-используемых методов
• Вывод списка параметров
• Вычисление выражений
• Условные точки останова
36
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Что подразумевается
под интеграцией?
Пример “Intellisense”
37
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Архитектура CCI-компилятора
Исходный текст
Атрибуты
Контекст
Контекст
Компилятор
как набор
объектов
Document
Token
Token
Лексема
Лексич.
анализ
Дерево программы
Синт. &
семантич.
анализ
Объектный код
(Assembly)
Генерация кода
Окружение
Редактор
Менеджер
проектов
“Intellisense”
Отладчик
38
28
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Архитектура CCI-компилятора
Фаза компляции
Прогр. модули
Получить лексему
Лексический анализ
Получить лексему
с доп. атрибутами
Компилировать
программный модуль
Синтаксический &
семантический
анализ
Компилировать
выражение
Компилировать
посл-ть операторов
...
39
Нижегородский государственный университет им. Н.И. Лобачевского
Резюме
40
По материалам NET Crash Course, MSR Cambridge UK, March 2002
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
CCI
•
•
•
•
•
•
•
•
•
•
•
•
Handling compiler
parameters & options
Source Code Reading
Lexical Analysis
Syntax Analysis
Symbol Table
Name Look-Up
Program Tree
Semantic Analysis
Code Optimization
Code Generation
Error Handling
Integration into an
Environment
supports
supports
--partially supports
-supports
--- (not necessary)
supports
supports
supports for VS
Lex&YACC
--supports
supports
--------41
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
CCI: текущее состояние и статус
• Реализован почти полностью;
не отлажен; не документирован.
• 12 июня 2003 CCI Toolkit был включен
в MSDN Academic Alliance.
• Компилятор Zonnon – первый опыт
использования CCI за пределами Microsoft.
42
ННГУ – ИТЛаб – Проект «Исследовательский компилятор»
Анонс
 Лабораторная работа
«программирование встраиваемых
систем»
Compiler Project
43
Download