O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

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

1.777 visualizações

Publicada em

Доклад посвящён различным аспектам компилятора С++, созданного с участием автора. В выступлении рассказывается о продвинутой архитектуре компилятора, основных проектных решениях, а также обсуждаются особенности входного языка, повлиявшие на реализацию компилятора.

Publicada em: Software

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

  1. 1. С++ в России: Стандарт языка и его реализация Евгений Зуев Университет Иннополис С++ in Russia Февраль 2017
  2. 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. 3. • История компилятора C++ • Как устроен компилятор: основные проектные решения • Фазы компиляции • Внутреннее представление: trees, tables, types • Продвинутая архитектура О чём я буду говорить © Copyright 2017, E.Zouev 3/35
  4. 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. 5. Компиляция C++: основные проектные решения • Только собственный код, без использования «free software» или какого-либо проприетарного кода: компилятор написан from scratch. • Один проход по исходному тексту. • Лексическая структура C++ переработана («суперлексемы» вместо обычных лексем). • Решение проблемы неоднозначности: разрешение имён на ранних фазах компиляции. • Высокий уровень внутреннего представления, с сохранением всей семантической информации. • Smart linking: связывание модулей на основе семантической информации. • Тестовый пакет создавался одновременно с компилятором. © Copyright 2017, E.Zouev 5/35
  6. 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. 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. 8. Лексический анализ (1) • Объединение фаз препроцессирования и собственно лексического анализа: Extended Lexan. • Разработан вручную: без использования lex или какого-либо средства автом. генерации. • Лексическая структура C++ была переработана («суперлексемы» вместо обычных лексем). • Разрешение имён на этапе лексического анализа. © Copyright 2017, E.Zouev 8/35
  9. 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. 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. 11. Лексический анализ (4) IfStatement : IF LPAREN Expression RPAREN ... IfStatement : xIF Expression RPAREN ... Лексемы vs «Суперлексемы» © Copyright 2017, E.Zouev 11/35
  12. 12. Синтаксический анализ (1) • Реализован на основе формального описания грамматики С++; генерация распознавателя инструментом bison. • В определении грамматики используется много трюков с целью преодоления синтаксических проблем (неоднозначности). • Некоторые грамматические неоднозначности разрешаются на ранних фазах: на этапе лексического анализа. • Рассматриваются перспективы переработки парсера: использовать рекурсивный спуск вместо генерации парсера из формальной грамматики. © Copyright 2017, E.Zouev 12/35
  13. 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. 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. 15. Синтаксический анализ (4) Синтаксические неоднозначности: что это? (в предположении, что A и B - идентификаторы) A * B - Declaration like C* c; - Expression like x*y © Copyright 2017, E.Zouev 15/35
  16. 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. 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. 18. Промежуточное представление Для чего: Представить всю семантическую информацию, извлеченную из исходного текста программы, в виде, удобном для анализа и обработки. © Copyright 2017, E.Zouev 16/35
  19. 19. Промежуточное представление Для чего: Представить всю семантическую информацию, извлеченную из исходного текста программы, в виде, удобном для анализа и обработки. Три категории языковых сущностей: • Объявления объектов • Выражения & операторы • Типы ТТТ © Copyright 2017, E.Zouev 16/35
  20. 20. ТТТ: Таблицы символов Block A Block B Block D Block C © Copyright 2017, E.Zouev 17/35
  21. 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. 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. 23. ТТТ: Дерево программы (1) Дерево строится из узлов с элементарной структурой: • Уникальный тег: для каждой языковой конструкции • Четыре указателя на «соседей»: «up», «down», «left», «right» • Узлы образуют (под)деревья; связи реализуются через специальные «пустые» узлы • У узла имеется набор атрибутов, специфичных для узла данного вида © Copyright 2017, E.Zouev 18/35
  24. 24. ТТТ: Дерево программы (2) © Copyright 2017, E.Zouev 19/35
  25. 25. ТТТ: Дерево программы (3) if (x < 0) x = y; © Copyright 2017, E.Zouev 20/35
  26. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 37. Побочный продукт производства  © Copyright 2017, E.Zouev 32/35
  38. 38. Compiler Compiler Data Structures Source program Code Generator Object code Conventional monolithic compiler Компилятор: будущая архитектура © Copyright 2017, E.Zouev 33/35
  39. 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. 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
  41. 41. Компилятор: будущая архитектура 34/35
  42. 42. Компилятор: будущая архитектура 34/35
  43. 43. Компилятор: будущая архитектура 34/35
  44. 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. 45. СПАСИБО!

×