С++ в России:
Стандарт языка
и его реализация
Евгений Зуев
Университет Иннополис
С++ in Russia
Февраль 2017
Who Is This Guy? 
• Евгений Зуев
• Профессор в Университете Иннополис.
• Работал в МГУ, Swiss Fed Inst of Technology (ETH
Zürich), EPFL (Lausanne), Samsung R&D Institute; PhD
(1999, МГУ).
• Проф. интересы: compiler construction, language design,
PL semantics.
• Разработчик первого российского ISO-совместимого
компилятора C++ (Интерстрон, 1999-2000).
• Реализация языка Zonnon для .NET & Visual Studio
(ETHZ, 2005). Прототип компилятора Swift для ОС
Tizen (Samsung R&D, 2015)
• «Редкая профессия», ДМК Пресс, Москва 2014.
Комментированный перевод стандарта С++, 2016.
© Copyright 2017, E.Zouev
2/35
• История компилятора C++
• Как устроен компилятор:
основные проектные решения
• Фазы компиляции
• Внутреннее представление:
trees, tables, types
• Продвинутая архитектура
О чём я буду говорить
© Copyright 2017, E.Zouev
3/35
Версия 1:
C++ Front End (ISO 1996) for a multi-language SDK,
Unix-based SparcStations,
ACE company (the Netherlands)
Версия 2:
Portable C++ front end for Solaris & Windows
(версия 1 была практически полностью переписана)
Версия 3:
C++ Front End with API & C++ Virtual Machine (ISO
1998)
Версия 4:
Interstron C++ front end (ISO 2011) для нескольких
моделей российских микропроцессоров
История: от ACE к Интерстрону
© Copyright 2017, E.Zouev
4/35
Компиляция C++:
основные проектные решения
• Только собственный код, без использования «free
software» или какого-либо проприетарного кода:
компилятор написан from scratch.
• Один проход по исходному тексту.
• Лексическая структура C++ переработана («суперлексемы»
вместо обычных лексем).
• Решение проблемы неоднозначности: разрешение имён на
ранних фазах компиляции.
• Высокий уровень внутреннего представления, с
сохранением всей семантической информации.
• Smart linking: связывание модулей на основе
семантической информации.
• Тестовый пакет создавался одновременно с компилятором.
© Copyright 2017, E.Zouev
5/35
Архитектура компилятора
C++ Front End
Intermediate
Representation
(“TTT”)
IC Code Generator
Intermediate Code
Machine Code
Generator(s) Target Code 1
Target Code N
C++ Source Code
…
Front End
Middle End
Back End
© Copyright 2017, E.Zouev
6/35
C++: Фазы компиляции
Lexical
Analysis
&
Preprocessing
Syntax Analysis
Semantic
Analysis
Target code
generation
Smart
Linking
Source
Program
Target
code
010101110011101
010000110111101
010101100110011
010101111000110
111100110101011
111111010101010
000010101010011
Tokens
Trees, Tables,
Types (TTT)
IR
Common TTT
IR code
Generation
© Copyright 2017, E.Zouev
7/35
Лексический анализ (1)
• Объединение фаз препроцессирования и
собственно лексического анализа:
Extended Lexan.
• Разработан вручную: без использования lex
или какого-либо средства автом. генерации.
• Лексическая структура C++ была переработана
(«суперлексемы» вместо обычных лексем).
• Разрешение имён на этапе лексического
анализа.
© Copyright 2017, E.Zouev
8/35
Лексический анализ (2)
Source
code
Tokens
Extended
Lexical
Analizer
Macro-
processor
Source
code
Tokens
Source code
after
expansion
Lexical Analyzer
These components
perform
very similar job
© Copyright 2017, E.Zouev
9/35
Лексический анализ (3)
Лексемы vs «Суперлексемы»
if ( …
while ( …
goto L;
public:
~C() …
C::C …
...)
(...) …
(void) …
…
IF + LPAREN = xIF
TILDE + ID("C") + LPAREN
+ RPAREN = xDTOR("C")
GOTO + ID("L") + SEMICOLON
= xGOTO("L")
© Copyright 2017, E.Zouev
10/35
Лексический анализ (4)
IfStatement :
IF LPAREN Expression RPAREN ...
IfStatement :
xIF Expression RPAREN ...
Лексемы vs «Суперлексемы»
© Copyright 2017, E.Zouev
11/35
Синтаксический анализ (1)
• Реализован на основе формального описания
грамматики С++; генерация распознавателя
инструментом bison.
• В определении грамматики используется много
трюков с целью преодоления синтаксических
проблем (неоднозначности).
• Некоторые грамматические неоднозначности
разрешаются на ранних фазах: на этапе
лексического анализа.
• Рассматриваются перспективы переработки
парсера: использовать рекурсивный спуск вместо
генерации парсера из формальной грамматики.
© Copyright 2017, E.Zouev
12/35
Синтаксический анализ (2)
Синтаксические трюки
int a = 0;
class C {
public:
void f() { a = 7; }
int a;
};
int main() {
C c;
c.f();
cout << a; // 0 or 7?
}
Стандарт:
• Тела функций-членов
транслируются в контексте
всего класса
• Объявление класса
считается полным, когда
достигнута завершающая
лексема его тела: “}”
© Copyright 2017, E.Zouev
13/35
Синтаксический анализ (3)
class C {
Member1
Member function
Member2
};
class C {
Member1
Member function header
Member2
};
Member function body
Синтаксические трюки
© Copyright 2017, E.Zouev
14/35
Синтаксический анализ (4)
Синтаксические неоднозначности: что это?
(в предположении, что A и B - идентификаторы)
A * B
- Declaration like C* c;
- Expression like x*y
© Copyright 2017, E.Zouev
15/35
Синтаксический анализ (4)
Синтаксические неоднозначности: что это?
(в предположении, что A и B - идентификаторы)
A * B
A ( B )
- Variable declaration like C (c)
- Function declaration like f(C)
- Function call like f(x)
- Type conversion like C(x)
- Declaration like C* c;
- Expression like x*y
© Copyright 2017, E.Zouev
15/35
Синтаксический анализ (4)
Синтаксические неоднозначности: что это?
(в предположении, что A и B - идентификаторы)
A * B
A ( B )
- Variable declaration like C (c)
- Function declaration like f(C)
- Function call like f(x)
- Type conversion like C(x)
- Declaration like C* c;
- Expression like x*y
Как разрешить неоднозначности:
- На основе семантической идентификации имен
в процессе лексического анализа.
© Copyright 2017, E.Zouev
15/35
Промежуточное представление
Для чего:
Представить всю семантическую информацию,
извлеченную из исходного текста программы, в
виде, удобном для анализа и обработки.
© Copyright 2017, E.Zouev 16/35
Промежуточное представление
Для чего:
Представить всю семантическую информацию,
извлеченную из исходного текста программы, в
виде, удобном для анализа и обработки.
Три категории языковых сущностей:
• Объявления объектов
• Выражения & операторы
• Типы
ТТТ
© Copyright 2017, E.Zouev 16/35
ТТТ: Таблицы символов
Block A
Block B
Block D
Block C
© Copyright 2017, E.Zouev
17/35
ТТТ: Таблицы символов
Block A
Block B
Block D
Block C
ST for A
ST for B
ST for D
ST for C
© Copyright 2017, E.Zouev
17/35
ТТТ: Таблицы символов
Block A
Block B
Block D
Block C
ST for A
ST for B
ST for D
ST for C
© Copyright 2017, E.Zouev
17/35
...
Hash Table
ТТТ: Дерево программы (1)
Дерево строится из узлов
с элементарной структурой:
• Уникальный тег: для каждой
языковой конструкции
• Четыре указателя на «соседей»:
«up», «down», «left», «right»
• Узлы образуют (под)деревья;
связи реализуются через
специальные «пустые» узлы
• У узла имеется набор атрибутов,
специфичных для узла данного
вида
© Copyright 2017, E.Zouev
18/35
ТТТ: Дерево программы (2)
© Copyright 2017, E.Zouev
19/35
ТТТ: Дерево программы (3)
if (x < 0) x = y;
© Copyright 2017, E.Zouev
20/35
ТТТ: Типы (1)
Система типов C++:
• Fundamental types: integral, real, character, ...
• Class and enumeration types
• Type modifiers: constants, pointers, references,
pointers-to-class-members
• Functional types; array types
• Type families: templates
Гибкие и мощные правила конструирования новых
типов:
- Reference to pointer int*& rp = p;
- Pointer to function double& (*f)(const C*);
- Array of pointers to class members
C<int,float>::*char A[10];
Много нетривиальных правил преобразования типов.
© Copyright 2017, E.Zouev
21/35
ТТТ: Типы (2)
Решение:
• Представлять типы в виде цепочек
типовых «кодов»:
int tpInt
int* tpPtr, tpInt
long unsigned int** tpPtr, tpPtr, tpULI
const int tpConst, tpInt
const int* tpPtr, toConst, tpInt
const int *const tpConst, tpPtr, tpConst, tpInt
const C*[10] tpArr, 10, tpPtr, tpConst, tpClass, C
C::*int tpPtrMemb, C, tpInt
© Copyright 2017, E.Zouev
22/35
ТТТ: Типы (3)
typedef void (*pf)(int*, const float);
tpPtr tpFun tpVoid
tpPtr
pf
tpInt
tpConst tpFloat
Result type
Parameter types
© Copyright 2017, E.Zouev
23/35
ТТТ: Типы (4)
Примеры типичных операций над типами:
Взятие адреса:
int -> int*
tpInt
tpPtr
Разыменование:
int* -> int
tpInttpPtrType1
Type2
Type1
Type2
Доступ к типу элементов массива:
tpArr,10,tpPtr,tpConst,tpClass,C ->
tpPtr,tpConst,tpClass,C
tpArr 10 tpPtr tpConst tpClass CType1
Type2
© Copyright 2017, E.Zouev
24/35
Linking: a Problem
#include “T.h”
. . .
res = Max(x-1,y+2.5);
. . .
#include “T.h”
. . .
res = Max(1.0,res);
. . .
template<typename T>
T Max ( T a, T b )
{
return a>b?a:b;
}File1.cpp
File2.cpp
T.h
• Both compilations produce
the same function-by-template
• Executable contains two copies
of Maxdouble (“code bloat”)
Object code
with
Maxdouble
Object code
with
Maxdouble
File1.obj
File2.obj
Executable
with two copies
of Maxdouble
App.exe
25/35
Smart Linking
#include "T.h"
. . .
res = Max(x-1,y+2.5);
. . .
#include "T.h"
. . .
res = Max(1.0,res);
. . .
template<typename T>
T Max ( T a, T b )
{
return a>b?a:b;
}
File1.cpp
File2.cpp
T.h
TTT with
Maxdouble
TTT with
Maxdouble
File1.ir
File2.ir
TTT
with the single
copy of Maxdouble
App.ir
TTT for
template T
T.irh
26/35
Компилятор: продвинутая архитектура
C++ Front End
Semantic Representation (“TTT”)
C++ Source Code
C++ Semantic Interface
(API)
Static
Analyzer(s)
C++
Visualizer
C++ Virtual
Machine
Code
Generator(s) …
© Copyright 2017, E.Zouev
27/35
Компилятор: Summary
• The size:
– 58 MB, > 5400 files, > 460000 SLOC
• Backend approximately half
• Supported Standards:
– ANSI C89 , C99 (partial)
– C++ 2011
– GNU extensions (partial)
– Microsoft C++ (COM support)
– Borland C++ (VCL support)
• Hosted on Windows (2000, XP, 8/10), Linux
• Built with Visual Studio, GCC 4.x
© Copyright 2017, D.Bocharnikov
28/35
Компилятор: целевые платформы
Vendor Model Notes
Unicore UNC 320 32 bit / RISC
Unicore UNC 80xx 8 bit
Progress UNICON 16 bit / CISC
Elvees MultiCore 32 bit MIPS + DSP
Module NeuroMatrix 32 bit VLIW + Matrix
Progress KVARC 32 bit / RISC
© Copyright 2017, D.Bocharnikov
29/35
Компилятор: оптимизации
• Address Expression
Reduction
• Sparse Conditional
Constant Propagation
• Dead Code Elimination
• Copy Propagation
• Function inlining
• Global Register Allocation
• Integer Promotion
• Leaf Function
Optimization
• Local Value Numbering
• Partial Redundancy
Elimination
• Reassociation
• Variable Register
Promotion
• Basic Block Scheduling
• Tail Recursion Elimination
• Type Promotion
Elimination
• Peephole optimization
• Platform specific
optimizations
© Copyright 2017, D.Bocharnikov
30/35
Компилятор: Back End
• TTT – Semantic representation from Frontend
• HighCode – Abstract machine CFG
• LowCode – Target platform CFG
• ASM – Target platform assembler
HighCode
Generator
HighCode
Optimizations
Instruction
Selection
Register
Allocation
LowCode
Optimizations
Assembler
Generator
TTT HighCode LowCode ASM
© Copyright 2017, D.Bocharnikov
31/35
Побочный продукт производства 
© Copyright 2017, E.Zouev
32/35
Compiler
Compiler Data
Structures
Source
program Code
Generator
Object
code
Conventional
monolithic
compiler
Компилятор: будущая архитектура
© Copyright 2017, E.Zouev
33/35
Compiler
Compiler Data
Structures
Source
program Code
Generator
Object
code
Conventional
monolithic
compiler
Front end
compiler
Intermediate
Program
Representation
Source
program
Code generators
Visualizers
Static analyzers
Virtual machine
Multi-target
compilation
system
Компилятор: будущая архитектура
© Copyright 2017, E.Zouev
33/35
Compiler
Compiler Data
Structures
Source
program Code
Generator
Object
code
Conventional
monolithic
compiler
Front end
compiler
Intermediate
Program
Representation
Source
program
Code generators
Visualizers
Static analyzers
Virtual machine
Multi-target
compilation
system
Semantic Representation
SR Generator
Source
program
Program
snippet
UML
diagram
SR as a basis
for a set
of language-
oriented tools
Code generators
Visualizers
Static analyzers
Virtual machine
Компилятор: будущая архитектура
© Copyright 2017, E.Zouev
33/35
Компилятор: будущая архитектура
34/35
Компилятор: будущая архитектура
34/35
Компилятор: будущая архитектура
34/35
Program
Semantic
Representation
Source
Program
Program
Semantic
Representation
Another
SR
XML SR
. . .
iSource
Interface
Code
Generators
Static
Analyzers
Engineering
Tools (UML)
Visualizers
Custom
Verifiers
Interpreters:
C++ Virtual
Machines
Optimizers
Code
Snippet
Converters
Семантический интерфейс (API)
© Copyright 2017, E.Zouev
35/35
СПАСИБО!

Евгений Зуев, С++ в России: Стандарт языка и его реализация

  • 1.
    С++ в России: Стандартязыка и его реализация Евгений Зуев Университет Иннополис С++ in Russia Февраль 2017
  • 2.
    Who Is ThisGuy?  • Евгений Зуев • Профессор в Университете Иннополис. • Работал в МГУ, Swiss Fed Inst of Technology (ETH Zürich), EPFL (Lausanne), Samsung R&D Institute; PhD (1999, МГУ). • Проф. интересы: compiler construction, language design, PL semantics. • Разработчик первого российского ISO-совместимого компилятора C++ (Интерстрон, 1999-2000). • Реализация языка Zonnon для .NET & Visual Studio (ETHZ, 2005). Прототип компилятора Swift для ОС Tizen (Samsung R&D, 2015) • «Редкая профессия», ДМК Пресс, Москва 2014. Комментированный перевод стандарта С++, 2016. © Copyright 2017, E.Zouev 2/35
  • 3.
    • История компилятораC++ • Как устроен компилятор: основные проектные решения • Фазы компиляции • Внутреннее представление: trees, tables, types • Продвинутая архитектура О чём я буду говорить © Copyright 2017, E.Zouev 3/35
  • 4.
    Версия 1: C++ FrontEnd (ISO 1996) for a multi-language SDK, Unix-based SparcStations, ACE company (the Netherlands) Версия 2: Portable C++ front end for Solaris & Windows (версия 1 была практически полностью переписана) Версия 3: C++ Front End with API & C++ Virtual Machine (ISO 1998) Версия 4: Interstron C++ front end (ISO 2011) для нескольких моделей российских микропроцессоров История: от ACE к Интерстрону © Copyright 2017, E.Zouev 4/35
  • 5.
    Компиляция C++: основные проектныерешения • Только собственный код, без использования «free software» или какого-либо проприетарного кода: компилятор написан from scratch. • Один проход по исходному тексту. • Лексическая структура C++ переработана («суперлексемы» вместо обычных лексем). • Решение проблемы неоднозначности: разрешение имён на ранних фазах компиляции. • Высокий уровень внутреннего представления, с сохранением всей семантической информации. • Smart linking: связывание модулей на основе семантической информации. • Тестовый пакет создавался одновременно с компилятором. © Copyright 2017, E.Zouev 5/35
  • 6.
    Архитектура компилятора C++ FrontEnd Intermediate Representation (“TTT”) IC Code Generator Intermediate Code Machine Code Generator(s) Target Code 1 Target Code N C++ Source Code … Front End Middle End Back End © Copyright 2017, E.Zouev 6/35
  • 7.
    C++: Фазы компиляции Lexical Analysis & Preprocessing SyntaxAnalysis Semantic Analysis Target code generation Smart Linking Source Program Target code 010101110011101 010000110111101 010101100110011 010101111000110 111100110101011 111111010101010 000010101010011 Tokens Trees, Tables, Types (TTT) IR Common TTT IR code Generation © Copyright 2017, E.Zouev 7/35
  • 8.
    Лексический анализ (1) •Объединение фаз препроцессирования и собственно лексического анализа: Extended Lexan. • Разработан вручную: без использования lex или какого-либо средства автом. генерации. • Лексическая структура C++ была переработана («суперлексемы» вместо обычных лексем). • Разрешение имён на этапе лексического анализа. © Copyright 2017, E.Zouev 8/35
  • 9.
    Лексический анализ (2) Source code Tokens Extended Lexical Analizer Macro- processor Source code Tokens Sourcecode after expansion Lexical Analyzer These components perform very similar job © Copyright 2017, E.Zouev 9/35
  • 10.
    Лексический анализ (3) Лексемыvs «Суперлексемы» if ( … while ( … goto L; public: ~C() … C::C … ...) (...) … (void) … … IF + LPAREN = xIF TILDE + ID("C") + LPAREN + RPAREN = xDTOR("C") GOTO + ID("L") + SEMICOLON = xGOTO("L") © Copyright 2017, E.Zouev 10/35
  • 11.
    Лексический анализ (4) IfStatement: IF LPAREN Expression RPAREN ... IfStatement : xIF Expression RPAREN ... Лексемы vs «Суперлексемы» © Copyright 2017, E.Zouev 11/35
  • 12.
    Синтаксический анализ (1) •Реализован на основе формального описания грамматики С++; генерация распознавателя инструментом bison. • В определении грамматики используется много трюков с целью преодоления синтаксических проблем (неоднозначности). • Некоторые грамматические неоднозначности разрешаются на ранних фазах: на этапе лексического анализа. • Рассматриваются перспективы переработки парсера: использовать рекурсивный спуск вместо генерации парсера из формальной грамматики. © Copyright 2017, E.Zouev 12/35
  • 13.
    Синтаксический анализ (2) Синтаксическиетрюки int a = 0; class C { public: void f() { a = 7; } int a; }; int main() { C c; c.f(); cout << a; // 0 or 7? } Стандарт: • Тела функций-членов транслируются в контексте всего класса • Объявление класса считается полным, когда достигнута завершающая лексема его тела: “}” © Copyright 2017, E.Zouev 13/35
  • 14.
    Синтаксический анализ (3) classC { Member1 Member function Member2 }; class C { Member1 Member function header Member2 }; Member function body Синтаксические трюки © Copyright 2017, E.Zouev 14/35
  • 15.
    Синтаксический анализ (4) Синтаксическиенеоднозначности: что это? (в предположении, что A и B - идентификаторы) A * B - Declaration like C* c; - Expression like x*y © Copyright 2017, E.Zouev 15/35
  • 16.
    Синтаксический анализ (4) Синтаксическиенеоднозначности: что это? (в предположении, что A и B - идентификаторы) A * B A ( B ) - Variable declaration like C (c) - Function declaration like f(C) - Function call like f(x) - Type conversion like C(x) - Declaration like C* c; - Expression like x*y © Copyright 2017, E.Zouev 15/35
  • 17.
    Синтаксический анализ (4) Синтаксическиенеоднозначности: что это? (в предположении, что A и B - идентификаторы) A * B A ( B ) - Variable declaration like C (c) - Function declaration like f(C) - Function call like f(x) - Type conversion like C(x) - Declaration like C* c; - Expression like x*y Как разрешить неоднозначности: - На основе семантической идентификации имен в процессе лексического анализа. © Copyright 2017, E.Zouev 15/35
  • 18.
    Промежуточное представление Для чего: Представитьвсю семантическую информацию, извлеченную из исходного текста программы, в виде, удобном для анализа и обработки. © Copyright 2017, E.Zouev 16/35
  • 19.
    Промежуточное представление Для чего: Представитьвсю семантическую информацию, извлеченную из исходного текста программы, в виде, удобном для анализа и обработки. Три категории языковых сущностей: • Объявления объектов • Выражения & операторы • Типы ТТТ © Copyright 2017, E.Zouev 16/35
  • 20.
    ТТТ: Таблицы символов BlockA Block B Block D Block C © Copyright 2017, E.Zouev 17/35
  • 21.
    ТТТ: Таблицы символов BlockA Block B Block D Block C ST for A ST for B ST for D ST for C © Copyright 2017, E.Zouev 17/35
  • 22.
    ТТТ: Таблицы символов BlockA Block B Block D Block C ST for A ST for B ST for D ST for C © Copyright 2017, E.Zouev 17/35 ... Hash Table
  • 23.
    ТТТ: Дерево программы(1) Дерево строится из узлов с элементарной структурой: • Уникальный тег: для каждой языковой конструкции • Четыре указателя на «соседей»: «up», «down», «left», «right» • Узлы образуют (под)деревья; связи реализуются через специальные «пустые» узлы • У узла имеется набор атрибутов, специфичных для узла данного вида © Copyright 2017, E.Zouev 18/35
  • 24.
    ТТТ: Дерево программы(2) © Copyright 2017, E.Zouev 19/35
  • 25.
    ТТТ: Дерево программы(3) if (x < 0) x = y; © Copyright 2017, E.Zouev 20/35
  • 26.
    ТТТ: Типы (1) Систематипов C++: • Fundamental types: integral, real, character, ... • Class and enumeration types • Type modifiers: constants, pointers, references, pointers-to-class-members • Functional types; array types • Type families: templates Гибкие и мощные правила конструирования новых типов: - Reference to pointer int*& rp = p; - Pointer to function double& (*f)(const C*); - Array of pointers to class members C<int,float>::*char A[10]; Много нетривиальных правил преобразования типов. © Copyright 2017, E.Zouev 21/35
  • 27.
    ТТТ: Типы (2) Решение: •Представлять типы в виде цепочек типовых «кодов»: int tpInt int* tpPtr, tpInt long unsigned int** tpPtr, tpPtr, tpULI const int tpConst, tpInt const int* tpPtr, toConst, tpInt const int *const tpConst, tpPtr, tpConst, tpInt const C*[10] tpArr, 10, tpPtr, tpConst, tpClass, C C::*int tpPtrMemb, C, tpInt © Copyright 2017, E.Zouev 22/35
  • 28.
    ТТТ: Типы (3) typedefvoid (*pf)(int*, const float); tpPtr tpFun tpVoid tpPtr pf tpInt tpConst tpFloat Result type Parameter types © Copyright 2017, E.Zouev 23/35
  • 29.
    ТТТ: Типы (4) Примерытипичных операций над типами: Взятие адреса: int -> int* tpInt tpPtr Разыменование: int* -> int tpInttpPtrType1 Type2 Type1 Type2 Доступ к типу элементов массива: tpArr,10,tpPtr,tpConst,tpClass,C -> tpPtr,tpConst,tpClass,C tpArr 10 tpPtr tpConst tpClass CType1 Type2 © Copyright 2017, E.Zouev 24/35
  • 30.
    Linking: a Problem #include“T.h” . . . res = Max(x-1,y+2.5); . . . #include “T.h” . . . res = Max(1.0,res); . . . template<typename T> T Max ( T a, T b ) { return a>b?a:b; }File1.cpp File2.cpp T.h • Both compilations produce the same function-by-template • Executable contains two copies of Maxdouble (“code bloat”) Object code with Maxdouble Object code with Maxdouble File1.obj File2.obj Executable with two copies of Maxdouble App.exe 25/35
  • 31.
    Smart Linking #include "T.h" .. . res = Max(x-1,y+2.5); . . . #include "T.h" . . . res = Max(1.0,res); . . . template<typename T> T Max ( T a, T b ) { return a>b?a:b; } File1.cpp File2.cpp T.h TTT with Maxdouble TTT with Maxdouble File1.ir File2.ir TTT with the single copy of Maxdouble App.ir TTT for template T T.irh 26/35
  • 32.
    Компилятор: продвинутая архитектура C++Front End Semantic Representation (“TTT”) C++ Source Code C++ Semantic Interface (API) Static Analyzer(s) C++ Visualizer C++ Virtual Machine Code Generator(s) … © Copyright 2017, E.Zouev 27/35
  • 33.
    Компилятор: Summary • Thesize: – 58 MB, > 5400 files, > 460000 SLOC • Backend approximately half • Supported Standards: – ANSI C89 , C99 (partial) – C++ 2011 – GNU extensions (partial) – Microsoft C++ (COM support) – Borland C++ (VCL support) • Hosted on Windows (2000, XP, 8/10), Linux • Built with Visual Studio, GCC 4.x © Copyright 2017, D.Bocharnikov 28/35
  • 34.
    Компилятор: целевые платформы VendorModel Notes Unicore UNC 320 32 bit / RISC Unicore UNC 80xx 8 bit Progress UNICON 16 bit / CISC Elvees MultiCore 32 bit MIPS + DSP Module NeuroMatrix 32 bit VLIW + Matrix Progress KVARC 32 bit / RISC © Copyright 2017, D.Bocharnikov 29/35
  • 35.
    Компилятор: оптимизации • AddressExpression Reduction • Sparse Conditional Constant Propagation • Dead Code Elimination • Copy Propagation • Function inlining • Global Register Allocation • Integer Promotion • Leaf Function Optimization • Local Value Numbering • Partial Redundancy Elimination • Reassociation • Variable Register Promotion • Basic Block Scheduling • Tail Recursion Elimination • Type Promotion Elimination • Peephole optimization • Platform specific optimizations © Copyright 2017, D.Bocharnikov 30/35
  • 36.
    Компилятор: Back End •TTT – Semantic representation from Frontend • HighCode – Abstract machine CFG • LowCode – Target platform CFG • ASM – Target platform assembler HighCode Generator HighCode Optimizations Instruction Selection Register Allocation LowCode Optimizations Assembler Generator TTT HighCode LowCode ASM © Copyright 2017, D.Bocharnikov 31/35
  • 37.
  • 38.
  • 39.
    Compiler Compiler Data Structures Source program Code Generator Object code Conventional monolithic compiler Frontend compiler Intermediate Program Representation Source program Code generators Visualizers Static analyzers Virtual machine Multi-target compilation system Компилятор: будущая архитектура © Copyright 2017, E.Zouev 33/35
  • 40.
    Compiler Compiler Data Structures Source program Code Generator Object code Conventional monolithic compiler Frontend compiler Intermediate Program Representation Source program Code generators Visualizers Static analyzers Virtual machine Multi-target compilation system Semantic Representation SR Generator Source program Program snippet UML diagram SR as a basis for a set of language- oriented tools Code generators Visualizers Static analyzers Virtual machine Компилятор: будущая архитектура © Copyright 2017, E.Zouev 33/35
  • 41.
  • 42.
  • 43.
  • 44.
    Program Semantic Representation Source Program Program Semantic Representation Another SR XML SR . .. iSource Interface Code Generators Static Analyzers Engineering Tools (UML) Visualizers Custom Verifiers Interpreters: C++ Virtual Machines Optimizers Code Snippet Converters Семантический интерфейс (API) © Copyright 2017, E.Zouev 35/35
  • 45.