SlideShare une entreprise Scribd logo
1  sur  45
С++ в России:
Стандарт языка
и его реализация
Евгений Зуев
Университет Иннополис
С++ 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
СПАСИБО!

Contenu connexe

Tendances

Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаSergey Platonov
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
 
хитрости выведения типов
хитрости выведения типовхитрости выведения типов
хитрости выведения типовcorehard_by
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковSergey Platonov
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Sergey Platonov
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksMikhail Kurnosov
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Yandex
 
C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and catscorehard_by
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castRoman Orlov
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Dima Dzuba
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекPython Meetup
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Yauheni Akhotnikau
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...Alexey Paznikov
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey TeplyakovAlex Tumanoff
 
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Roman Orlov
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IДмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IPlatonov Sergey
 

Tendances (20)

Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
 
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMДмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
 
хитрости выведения типов
хитрости выведения типовхитрости выведения типов
хитрости выведения типов
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кода
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
 
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
Алексей Куканов — Параллелизм в C++: управляйте приложением, а не потоками!
 
C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and cats
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_cast
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
 
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
ПВТ - весна 2015 - Лекция 5. Многопоточное программирование в С++. Синхрониза...
 
Deep Dive C# by Sergey Teplyakov
Deep Dive  C# by Sergey TeplyakovDeep Dive  C# by Sergey Teplyakov
Deep Dive C# by Sergey Teplyakov
 
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
Метапрограммирование в C++11/14 и C++17. Новые инструменты - новые проблемы.
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IДмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
 

En vedette

Jenkins vs GitLab CI
Jenkins vs GitLab CIJenkins vs GitLab CI
Jenkins vs GitLab CICEE-SEC(R)
 
Quality assurance of large c++ projects
Quality assurance of large c++ projectsQuality assurance of large c++ projects
Quality assurance of large c++ projectscorehard_by
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерSergey Platonov
 
Антон Бикинеев, Reflection in C++Next
Антон Бикинеев,  Reflection in C++NextАнтон Бикинеев,  Reflection in C++Next
Антон Бикинеев, Reflection in C++NextSergey Platonov
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3Platonov Sergey
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Mikhail Matrosov
 

En vedette (6)

Jenkins vs GitLab CI
Jenkins vs GitLab CIJenkins vs GitLab CI
Jenkins vs GitLab CI
 
Quality assurance of large c++ projects
Quality assurance of large c++ projectsQuality assurance of large c++ projects
Quality assurance of large c++ projects
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптер
 
Антон Бикинеев, Reflection in C++Next
Антон Бикинеев,  Reflection in C++NextАнтон Бикинеев,  Reflection in C++Next
Антон Бикинеев, Reflection in C++Next
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
 

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

[Data Science MeetUp] Neural Network - Константин Созыкин (RoadAR): Современн...
[Data Science MeetUp] Neural Network - Константин Созыкин (RoadAR): Современн...[Data Science MeetUp] Neural Network - Константин Созыкин (RoadAR): Современн...
[Data Science MeetUp] Neural Network - Константин Созыкин (RoadAR): Современн...Provectus
 
C++ теория
C++ теорияC++ теория
C++ теорияtank1975
 
C++ теория
C++ теорияC++ теория
C++ теорияtank1975
 
C++ теория
C++ теорияC++ теория
C++ теорияtank1975
 
Как и зачем можно создать DSL на Python
Как и зачем можно создать DSL на PythonКак и зачем можно создать DSL на Python
Как и зачем можно создать DSL на PythonPyNSK
 
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++Pavel Tsukanov
 
Функции в языке программирования QBasic
Функции в языке программирования QBasicФункции в языке программирования QBasic
Функции в языке программирования QBasickvlar
 
Основы программирования на C++
Основы программирования на C++Основы программирования на C++
Основы программирования на C++Olga Maksimenkova
 
Основы С++ (операторы, типы данных, функции)
Основы С++ (операторы, типы данных, функции)Основы С++ (операторы, типы данных, функции)
Основы С++ (операторы, типы данных, функции)Olga Maksimenkova
 
WebCamp 2016: Python.Максим Климишин.Типизированный Python
WebCamp 2016: Python.Максим Климишин.Типизированный PythonWebCamp 2016: Python.Максим Климишин.Типизированный Python
WebCamp 2016: Python.Максим Климишин.Типизированный PythonWebCamp
 
Введение в Clojure (Margincon 2010)
Введение в Clojure (Margincon 2010)Введение в Clojure (Margincon 2010)
Введение в Clojure (Margincon 2010)Alex Ott
 
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...Mail.ru Group
 
2009 10-31 есть ли жизнь после mpi
2009 10-31 есть ли жизнь после mpi2009 10-31 есть ли жизнь после mpi
2009 10-31 есть ли жизнь после mpiMichael Karpov
 
закон иерархических компенсаций седова и C++ core guidelines
закон иерархических компенсаций седова и C++ core guidelinesзакон иерархических компенсаций седова и C++ core guidelines
закон иерархических компенсаций седова и C++ core guidelinescorehard_by
 
закон иерархических компенсаций седова и C++ core guidelines
закон иерархических компенсаций седова и C++ core guidelinesзакон иерархических компенсаций седова и C++ core guidelines
закон иерархических компенсаций седова и C++ core guidelinesCOMAQA.BY
 
История языка C++
История языка C++История языка C++
История языка C++DEVTYPE
 
Ферапонтов_Резюме
Ферапонтов_РезюмеФерапонтов_Резюме
Ферапонтов_РезюмеOleg Ferapontov
 
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)ScalaNsk
 
Machine learning c использованием нейронных сетей, Дмитрий Лапин
Machine learning c использованием нейронных сетей, Дмитрий ЛапинMachine learning c использованием нейронных сетей, Дмитрий Лапин
Machine learning c использованием нейронных сетей, Дмитрий ЛапинIT61
 

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

[Data Science MeetUp] Neural Network - Константин Созыкин (RoadAR): Современн...
[Data Science MeetUp] Neural Network - Константин Созыкин (RoadAR): Современн...[Data Science MeetUp] Neural Network - Константин Созыкин (RoadAR): Современн...
[Data Science MeetUp] Neural Network - Константин Созыкин (RoadAR): Современн...
 
C++ теория
C++ теорияC++ теория
C++ теория
 
C++ теория
C++ теорияC++ теория
C++ теория
 
C++ теория
C++ теорияC++ теория
C++ теория
 
Как и зачем можно создать DSL на Python
Как и зачем можно создать DSL на PythonКак и зачем можно создать DSL на Python
Как и зачем можно создать DSL на Python
 
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
 
Функции в языке программирования QBasic
Функции в языке программирования QBasicФункции в языке программирования QBasic
Функции в языке программирования QBasic
 
Основы программирования на C++
Основы программирования на C++Основы программирования на C++
Основы программирования на C++
 
Основы С++ (операторы, типы данных, функции)
Основы С++ (операторы, типы данных, функции)Основы С++ (операторы, типы данных, функции)
Основы С++ (операторы, типы данных, функции)
 
WebCamp 2016: Python.Максим Климишин.Типизированный Python
WebCamp 2016: Python.Максим Климишин.Типизированный PythonWebCamp 2016: Python.Максим Климишин.Типизированный Python
WebCamp 2016: Python.Максим Климишин.Типизированный Python
 
Введение в Clojure (Margincon 2010)
Введение в Clojure (Margincon 2010)Введение в Clojure (Margincon 2010)
Введение в Clojure (Margincon 2010)
 
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
«Статический анализ: гордость и предубеждения», Алексей Кузьменко, аналитик И...
 
2009 10-31 есть ли жизнь после mpi
2009 10-31 есть ли жизнь после mpi2009 10-31 есть ли жизнь после mpi
2009 10-31 есть ли жизнь после mpi
 
закон иерархических компенсаций седова и C++ core guidelines
закон иерархических компенсаций седова и C++ core guidelinesзакон иерархических компенсаций седова и C++ core guidelines
закон иерархических компенсаций седова и C++ core guidelines
 
закон иерархических компенсаций седова и C++ core guidelines
закон иерархических компенсаций седова и C++ core guidelinesзакон иерархических компенсаций седова и C++ core guidelines
закон иерархических компенсаций седова и C++ core guidelines
 
История языка C++
История языка C++История языка C++
История языка C++
 
Transpile it.pdf
Transpile it.pdfTranspile it.pdf
Transpile it.pdf
 
Ферапонтов_Резюме
Ферапонтов_РезюмеФерапонтов_Резюме
Ферапонтов_Резюме
 
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
 
Machine learning c использованием нейронных сетей, Дмитрий Лапин
Machine learning c использованием нейронных сетей, Дмитрий ЛапинMachine learning c использованием нейронных сетей, Дмитрий Лапин
Machine learning c использованием нейронных сетей, Дмитрий Лапин
 

Plus de Platonov Sergey

Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.Platonov Sergey
 
Тененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговлеТененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговлеPlatonov Sergey
 
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на LinuxПавел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на LinuxPlatonov Sergey
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках II
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IIДмитрий Кашицын, Вывод типов в динамических и не очень языках II
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IIPlatonov Sergey
 
QML\Qt Quick на практике
QML\Qt Quick на практикеQML\Qt Quick на практике
QML\Qt Quick на практикеPlatonov Sergey
 
Визуализация автомобильных маршрутов
Визуализация автомобильных маршрутовВизуализация автомобильных маршрутов
Визуализация автомобильных маршрутовPlatonov Sergey
 
Функциональный микроскоп: линзы в C++
Функциональный микроскоп: линзы в C++Функциональный микроскоп: линзы в C++
Функциональный микроскоп: линзы в C++Platonov Sergey
 
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...Platonov Sergey
 
HPX: C++11 runtime система для параллельных и распределённых вычислений
HPX: C++11 runtime система для параллельных и распределённых вычисленийHPX: C++11 runtime система для параллельных и распределённых вычислений
HPX: C++11 runtime система для параллельных и распределённых вычисленийPlatonov Sergey
 
Ranges calendar-novosibirsk-2015-08
Ranges calendar-novosibirsk-2015-08Ranges calendar-novosibirsk-2015-08
Ranges calendar-novosibirsk-2015-08Platonov Sergey
 
Использование maven для сборки больших модульных c++ проектов на примере Odin...
Использование maven для сборки больших модульных c++ проектов на примере Odin...Использование maven для сборки больших модульных c++ проектов на примере Odin...
Использование maven для сборки больших модульных c++ проектов на примере Odin...Platonov Sergey
 
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияДракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияPlatonov Sergey
 
One definition rule - что это такое, и как с этим жить
One definition rule - что это такое, и как с этим житьOne definition rule - что это такое, и как с этим жить
One definition rule - что это такое, и как с этим житьPlatonov Sergey
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыPlatonov Sergey
 
Аскетичная разработка браузера
Аскетичная разработка браузераАскетичная разработка браузера
Аскетичная разработка браузераPlatonov Sergey
 
Денис Кормалев Метаобъектная система Qt
Денис Кормалев Метаобъектная система QtДенис Кормалев Метаобъектная система Qt
Денис Кормалев Метаобъектная система QtPlatonov Sergey
 
Максим Хижинский Lock-free maps
Максим Хижинский Lock-free mapsМаксим Хижинский Lock-free maps
Максим Хижинский Lock-free mapsPlatonov Sergey
 
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...Platonov Sergey
 

Plus de Platonov Sergey (20)

Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.Евгений Крутько, Многопоточные вычисления, современный подход.
Евгений Крутько, Многопоточные вычисления, современный подход.
 
Тененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговлеТененёв Анатолий, Boost.Asio в алгоритмической торговле
Тененёв Анатолий, Boost.Asio в алгоритмической торговле
 
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на LinuxПавел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
Павел Беликов, Опыт мигрирования крупного проекта с Windows-only на Linux
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках II
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IIДмитрий Кашицын, Вывод типов в динамических и не очень языках II
Дмитрий Кашицын, Вывод типов в динамических и не очень языках II
 
QML\Qt Quick на практике
QML\Qt Quick на практикеQML\Qt Quick на практике
QML\Qt Quick на практике
 
Визуализация автомобильных маршрутов
Визуализация автомобильных маршрутовВизуализация автомобильных маршрутов
Визуализация автомобильных маршрутов
 
Функциональный микроскоп: линзы в C++
Функциональный микроскоп: линзы в C++Функциональный микроскоп: линзы в C++
Функциональный микроскоп: линзы в C++
 
C++ exceptions
C++ exceptionsC++ exceptions
C++ exceptions
 
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
Как мы уменьшили количество ошибок в Unreal Engine с помощью статического ана...
 
HPX: C++11 runtime система для параллельных и распределённых вычислений
HPX: C++11 runtime система для параллельных и распределённых вычисленийHPX: C++11 runtime система для параллельных и распределённых вычислений
HPX: C++11 runtime система для параллельных и распределённых вычислений
 
Ranges calendar-novosibirsk-2015-08
Ranges calendar-novosibirsk-2015-08Ranges calendar-novosibirsk-2015-08
Ranges calendar-novosibirsk-2015-08
 
Использование maven для сборки больших модульных c++ проектов на примере Odin...
Использование maven для сборки больших модульных c++ проектов на примере Odin...Использование maven для сборки больших модульных c++ проектов на примере Odin...
Использование maven для сборки больших модульных c++ проектов на примере Odin...
 
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияДракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
 
One definition rule - что это такое, и как с этим жить
One definition rule - что это такое, и как с этим житьOne definition rule - что это такое, и как с этим жить
One definition rule - что это такое, и как с этим жить
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансы
 
Аскетичная разработка браузера
Аскетичная разработка браузераАскетичная разработка браузера
Аскетичная разработка браузера
 
Concepts lite
Concepts liteConcepts lite
Concepts lite
 
Денис Кормалев Метаобъектная система Qt
Денис Кормалев Метаобъектная система QtДенис Кормалев Метаобъектная система Qt
Денис Кормалев Метаобъектная система Qt
 
Максим Хижинский Lock-free maps
Максим Хижинский Lock-free mapsМаксим Хижинский Lock-free maps
Максим Хижинский Lock-free maps
 
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...
Владислав Шаклеин. Смешивание управляемого и неуправляемого C++ кода в Micros...
 

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

  • 1. С++ в России: Стандарт языка и его реализация Евгений Зуев Университет Иннополис С++ in Russia Февраль 2017
  • 2. 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
  • 3. • История компилятора C++ • Как устроен компилятор: основные проектные решения • Фазы компиляции • Внутреннее представление: trees, tables, types • Продвинутая архитектура О чём я буду говорить © Copyright 2017, E.Zouev 3/35
  • 4. Версия 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
  • 5. Компиляция C++: основные проектные решения • Только собственный код, без использования «free software» или какого-либо проприетарного кода: компилятор написан from scratch. • Один проход по исходному тексту. • Лексическая структура C++ переработана («суперлексемы» вместо обычных лексем). • Решение проблемы неоднозначности: разрешение имён на ранних фазах компиляции. • Высокий уровень внутреннего представления, с сохранением всей семантической информации. • Smart linking: связывание модулей на основе семантической информации. • Тестовый пакет создавался одновременно с компилятором. © Copyright 2017, E.Zouev 5/35
  • 6. Архитектура компилятора 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
  • 7. 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
  • 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 Source code 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) class C { 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. ТТТ: Таблицы символов Block A Block B Block D Block C © Copyright 2017, E.Zouev 17/35
  • 21. ТТТ: Таблицы символов 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
  • 22. ТТТ: Таблицы символов 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
  • 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) typedef void (*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 • 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
  • 34. Компилятор: целевые платформы 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
  • 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
  • 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. Побочный продукт производства  © Copyright 2017, E.Zouev 32/35
  • 39. 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
  • 40. 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
  • 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