SlideShare uma empresa Scribd logo
1 de 55
Baixar para ler offline
Методы трансляции
ТЯП’2019
Старолетов Сергей Михайлович
Теория языков программирования и методы
трансляции
Компиляторы и интерпретаторы
- Компиляторы создают объектный код или внутреннее представление
- Интерпретаторы на лету выполняют исходный код или команды виртуальной
машины
-
Примеры компиляторов и компилируемых языков
- C (gcc)
- C++ (g++)
- C# (csc)
- javac (компилятор в class файлы)
- erlc (компилятор в beam платформы Erlang)
Примеры интерпретаторов и интерпретируемых языков
- Python
- PHP
- JS
- java (интерпретатор байт-кода.
Как правило, интерпретированные языки отличаются динамической типизацией
(тип вычисляется в процессе выполнения и заранее неизвестен)
В целях оптимизации часть кода может кешироваться
Как получить интерпретатор из
синтаксического и семантического анализатора
- Кроме типа для всех переменных нужно хранить значение в узле дерева
- Для грамматических правил с выражениями нужно также возвращать тип и
значение, которое будет считаться в правилах вида A+A | A*A и тд
- Там же нужно делать преобразование типов по заданным правилам, в
зависимости от типа операндов
- Циклы делаются в соответствии с блок-схемой работы цикла (while -
вычисление и переход, for (A;B;C) D - присваивание, проверка, выполнение
тела, выполнение тела с инкрементом и тд
- Функции возвращают значения в своем узле. Для рекурсии необходимо
копирование поддеревье с подчисткой и заменой на значение, иначе
значение затрётся
- См пособие для примеров!
Пример репозитория с исходным кодом интерпретатора Паскаля
(присваивания, функции, while)
https://github.com/SergeyStaroletov/PascalInterpreterMini
Схема транслятора
Кодогенерация
● Напрямую в ассемблерный или объектный код
● В промежуточный код (или последовательность
промежуточных)
Виды промежуточного кода
● Деревья
● ПОЛИЗ
● Триады/тетрады
Кодогенерация (далее наша цель)
Нужно всегда думать о том, что мы будем генерировать на
выходе
gcc -S 1.c
IL code : java
javap -c M.class
IL code: и даже C
clang -S -emit-llvm 1.c
Внутреннее представление
Если имеется промежуточное представление, по нему
можно проводить оптимизацию и делать статический
анализ ошибок
Примеры внутреннего представления
Деревья
Примеры внутреннего представления
ПОЛИЗ – стековая машина
Тетрады и Триады
Тетрада – это конструкция, содержащая:
- Операция
- Операнд 1
- Операнд 2
- Результат
Триада – это пронумерованная конструкция, содержащая
- Операция
- Операнд 1 (или ссылка)
- Операнд 2 (или ссылка)
Синтаксически-управляемый перевод
Мы добавляем в грамматику “Дельта-функции” для формирования множества триад
Пара примеров
Выражения
Добавляем в множество триад
триаду с присваиванием
на адрес триады с
результатом
выражения
Добавляем
в триады
+ <триаду выр1> <триаду выр 2>
Тесты для генератора триад
Тест для while (2 перехода)
Генерация триад для LL стратегии
Пример кода
https://github.com/SergeyStaroletov/PascalTriadGenLL
Исходники генератора триад для Паскаля с функциями и while на основе LL стратегии
Оптимизация
Сравните gcc -S 1.c gcc -O1 1.c
Виды оптимизаций
Оптимизация вместе с профилированием кода (опции gcc -pg, clang -fprofile-instr-generate)
позволяет улучшать и контролировать скорость критических строк кода, предоставляя
компилятору возможности делать предопределенные классы оптимизаций
Граф управления
Если мы имеем последовательность триад, то легко
построить граф управления по ней
Визуализация графов управления
Graphviz (dot). Описание графа на простом декларативном
языке приводит к хорошим, выровненным графам
https://dreampuf.github.io/GraphvizOnline
Простейшие алгоритмы оптимизации
Вычисление некоторых выражений на этапе компиляции:
найти триады, все операнды которых константы, заменить
на значения, триады удалить
Простейшие алгоритмы оптимизации
Удаление повторяющихся триад – 1.
Попарно сравниваем триады, при условии что между
Сравниваемыми триадами не изменяются их операнды
Простейшие алгоритмы оптимизации
Удаление повторяющихся триад – 2.
- Поиск поддеревьев в графе
- Передача операций вверх, формирование “хэша” -
агрегата сложных операций (с учетом коммуникативности)
Оптимизация ветвлений
- Поиск одинакового начала и конца веток if then и else
- Одинаковые начала надо вставить до цикла
- Одинаковые концы – после цикла
Оптимизация циклов
- Главное сначала определить, где цикл
- Поиск инвариантных триад (значений, которые не
меняются внутри цикла) – их нужно вычислить до цикла и
потом просто использовать
- Предсказание изменения счетчика цикла и более
эффективный пересчет выражений с ним
Оптимизация используемых регистров
- Оптимально вычислять выражения, когда операнды
загружены в регистры процессора
- Регистров мало
- Приходится подгружать из памяти
- Поэтому для последующей
генерации кода нужно
использовать минимум регистров
Вводим функцию reg(a) для каждой вершины, которая
будет хранить число регистров
Оптимизация используемых регистров
Другие алгоритмы
- Превращение малых функций в inline
- Поиск неиспользуемых переменных путем формирования
графа использования каждой переменной
- Векторизация, автоматическая параллелизация кода
Меня интересуют например
- Устранение рекурсии типа Факториал
- Устранение рекурсии типа Фибоначчи*
Задание
- Генератор триад
- Оптимизатор триад (минимум два алгоритма)
Генерация кода
Генерация - процесс
Парадигма генерации кода
Triads
Machine code
(assembler/intermediat
e)
Object code
stdlib
Linker
Binary
Процесс компиляции для gcc
Source.c source.s
Libs (.o .a .so)
stdlib
source.o
Linker bin/exe
gcc source1.c source2.c -lmylib -o result → ./result
gcc -S source.c → source.s
gcc source.s → ./a.out
Процесс кодогенерации
Будем проводить кодогенерацию asm кода по триадам
Принцип “обезьяна видит – обезьяна делает”
Monkey-driven developing :)
Нужно изучать, как ведет себя компилятор gcc (или другой) путем тестов
А именно:
- какие команды генерируются для арифметики
- команды регистр-регистр, регистр-память
- какие команды для переходов
- методы адресации (прямая, косвенная, относительно стека)
- вызов функций, передача параметров
- вызов методов стандартной библиотеки, если надо вывод
Пример
Платформенно-зависимый код
Эпилог main
Хранение строки
Загрузка строки
Загрузка рез (а) и помещение в esi
Вызов printf
Возврат и эпилог
Отсюда делаем вывод
Для печати значения можно применять
leaq L_.str(%rip), %rdi
movl <что>, %esi
movb $0, %al
callq _printf
xorl %esi, %esi
##
# в самом конце
.section __TEXT,__cstring,cstring_literals
L_.str: ## @.str
.asciz "%dn"
Данный код зависит от разрядности и платформы!
Особенности ассемблера
- Загрузка значений в другом порядке
- Константы с $
- Знаковые/беззнаковые операции
- Есть команды только регистр-регистр, есть регистр-
память. Нужно использовать movl предварительно в
некоторых случаях
- Зависит от платформы, для которой генерируем!
Для другой ОС генерация отличается в некоторых моментах
(пролог/эпилог/описания)
LLVM: решаем проблему зависимости от
платформы
Сегодня все чаще генерация идет через специальный
бэкэнд в виде промежуточного кода с возможностью
генерации под разные ОС/платформы/языки
gcc -S -emit-llvm 1.c
Приемы генерации
- Генерация описания (глобальные, не глобальные)
- Локальные переменные – генерируем по триаде начала
функции резервирование стека, далее адресуем переменные
относительно стека+смещение
- Для генерации арифметики храним, где значение
переменной/триады. Оптимально использовать регистры. Для
этого есть пул регистров, которые по очереди “занимаются”.
Для каждой триады известно, где сейчас ее значение. При
ссылке на нее оттуда его берем. Если нужен регистр, а все
заняты, нужно слить значение из него - генерируем выгрузку по
необходимости и загрузку в регистр нового перед операцией с
значением соответствующей триады
Отладка (тестирование)
- Генерация вызовов printf
- Отладчики GDB / LLDB https://lldb.llvm.org/lldb-gdb.html
Расчетное задание
Генерация анализаторов
автоматическими средствами
Проблемы
- Написание анализаторов, интерпретаторов,
компиляторов – достаточно стандартная задача
- Все зависит от входной грамматики; алгоритмы анализа,
интерпретации, компиляции стандартны и их можно
комбинировать
- Grammar-Driven Development
BNF и EBNF формы грамматик
Форма Бэкуса — Наура:
В РБНФ введены два новых синтаксических элемента:
условное вхождение (выражение в квадратных скобках) и
повторение (выражение в фигурных скобках)
Процесс разработки
Грамматика в виде БНФ/ЕБНФ
(свой язык описания)
Генератор
Внедренные конструкции
семантики на целевом языке
программирования
Код парсера,
интерпретатора,
компилятора
Генераторы, принятые в Community
- Java Compiler Compiler
- ANTLR (Java world)
- Yacc/Flex/Bison (GNU world)
Преимущества использования генераторов
- Нет изобретению велосипеда
- MDD-процесс (модель это грамматика), поддерживаемость
- Интегрируемость в IDE
- Визуализация синтаксических диаграмм
- Открытые грамматики для реальных языков
программирования
- Отладка по грамматике (дебаг не по коду, а по исходнику
грамматики)
Генераторы анализаторов и стратегии разбора
- ANTLR работает с LL(*) грамматиками
- YACC работает с LALR (LR) грамматиками (более
эффективно работает с обработкой ошибок в синтаксисе)
Примеры: грамматика + семантические вызовы
для yacc
Примеры: ANTLR плагин для IDEA
!! Имеется большое число доступных грамматик реальных языков (с расширением .g4)
Правила
грамматиики
Нетерминалы
Код для теста
Дерево
разбора
Сгенерированный код
парсера в проекте
Пример генератора с ANTLR
1. Добавляем в проект antlr-4.7.2-complete.jar
2. Ищем и качаем грамматику Java (в примере - java9.g4)
3. Правой кнопкой в грамматике “Generate ANTLR recognizer”
4. В проект добавлены Java9Parser, Java9Lexer, Java9Visitor
5. Пишем main(), нужно начать с корневого правила грамматики
6. И добавить свой Listener для обработки захода или выхода из узлов
синтаксического дерева
Пример генератора с ANTL
7. Теперь нужно написать актуальный код по обработке заходов в узлы - мы
будем считать размер методов
8. По грамматике это MethodDeclaration
9. Пишем код при выходе из описания метода
DSL языки
DSL (Domain-Specific Language) – миниязык, который
описывает понятия и взаимосвязи из некоторых предметных областей
Примеры: управление роботами*, персонажами,
умными домами переводом денег, …
Терминалы языка – понятия этой области + операции над ними
Современные языки позволяют доопределять синтаксис для создания подобных DSL языков
А также существуют готовые решения на основе текстового, графического языка и
генератора/интерпретатора по ним. XText+Xtend на основе Eclipse - готовое средство создание
своих DSL с метамоделью языка
* Никитин, Старолетов. ИСПОЛЬЗОВАНИЕ KOTLIN ДЛЯ ОПИСАНИЯ ДЕРЕВЬЕВ ПОВЕДЕНИЯ В ЦЕЛЯХ
МОДЕЛИРОВАНИЯ ИИ В ОБЛАСТИ ОБУЧАЮЩЕГО ПО
Задание (расчетка)
- Используя один из генераторов парсеров, использовать
его для создания парсера реальной грамматики языка
программирования.
- Создать свою мини-грамматику в нем
- Реализовать семантику - интерпретатор выражений + if/
while/case
- Вставить в отчет диаграммы разбора, генерируемые
средством

Mais conteúdo relacionado

Mais procurados

Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines Sergey Zubkov
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
 
C++ весна 2014 лекция 2
C++ весна 2014 лекция 2C++ весна 2014 лекция 2
C++ весна 2014 лекция 2Technopark
 
Эффективный C++
Эффективный C++Эффективный C++
Эффективный C++Andrey Karpov
 
Machine learning c использованием нейронных сетей, Дмитрий Лапин
Machine learning c использованием нейронных сетей, Дмитрий ЛапинMachine learning c использованием нейронных сетей, Дмитрий Лапин
Machine learning c использованием нейронных сетей, Дмитрий ЛапинIT61
 
язык програмирования
язык програмированияязык програмирования
язык програмированияOlegmingalev1997
 
C++ осень 2013 лекция 1
C++ осень 2013 лекция 1C++ осень 2013 лекция 1
C++ осень 2013 лекция 1Technopark
 
C++ осень 2013 лекция 8
C++ осень 2013 лекция 8C++ осень 2013 лекция 8
C++ осень 2013 лекция 8Technopark
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекPython Meetup
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальBadoo Development
 
C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7Technopark
 
Язык программирования Pascal
Язык программирования PascalЯзык программирования Pascal
Язык программирования PascalSchool 242
 
Построение компилятора на базе LLVM — Павел Сычев
 Построение компилятора на базе LLVM — Павел Сычев Построение компилятора на базе LLVM — Павел Сычев
Построение компилятора на базе LLVM — Павел СычевYandex
 
Архитектура компилятора Swift
Архитектура компилятора SwiftАрхитектура компилятора Swift
Архитектура компилятора SwiftAndrey Volobuev
 

Mais procurados (18)

Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кода
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
C++ весна 2014 лекция 2
C++ весна 2014 лекция 2C++ весна 2014 лекция 2
C++ весна 2014 лекция 2
 
Эффективный C++
Эффективный C++Эффективный C++
Эффективный C++
 
Machine learning c использованием нейронных сетей, Дмитрий Лапин
Machine learning c использованием нейронных сетей, Дмитрий ЛапинMachine learning c использованием нейронных сетей, Дмитрий Лапин
Machine learning c использованием нейронных сетей, Дмитрий Лапин
 
язык програмирования
язык програмированияязык програмирования
язык програмирования
 
C++ осень 2013 лекция 1
C++ осень 2013 лекция 1C++ осень 2013 лекция 1
C++ осень 2013 лекция 1
 
C++ осень 2013 лекция 8
C++ осень 2013 лекция 8C++ осень 2013 лекция 8
C++ осень 2013 лекция 8
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон ДовгальКак мы делаем модули PHP в Badoo – Антон Довгаль
Как мы делаем модули PHP в Badoo – Антон Довгаль
 
C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7
 
Язык программирования Pascal
Язык программирования PascalЯзык программирования Pascal
Язык программирования Pascal
 
лекция 4
лекция 4лекция 4
лекция 4
 
Построение компилятора на базе LLVM — Павел Сычев
 Построение компилятора на базе LLVM — Павел Сычев Построение компилятора на базе LLVM — Павел Сычев
Построение компилятора на базе LLVM — Павел Сычев
 
Архитектура компилятора Swift
Архитектура компилятора SwiftАрхитектура компилятора Swift
Архитектура компилятора Swift
 
Html лаб 2
Html лаб 2Html лаб 2
Html лаб 2
 

Semelhante a Теория языков программирования некоторые слайды к лекциям

C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.Igor Shkulipa
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.Igor Shkulipa
 
лекции спрг 6_семестр (1)
лекции спрг 6_семестр (1)лекции спрг 6_семестр (1)
лекции спрг 6_семестр (1)djbelyakk
 
Custom Language Plugin for JetBrains IDEA
Custom Language Plugin for JetBrains IDEACustom Language Plugin for JetBrains IDEA
Custom Language Plugin for JetBrains IDEAAlexander Zastashkov
 
Lecture1: Introduction to Parallel Computing
Lecture1: Introduction to  Parallel ComputingLecture1: Introduction to  Parallel Computing
Lecture1: Introduction to Parallel ComputingAndrii Rodionov
 
Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...a15464321646213
 
Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Alex Tutubalin
 
Ayan9r1 po(1)
Ayan9r1 po(1)Ayan9r1 po(1)
Ayan9r1 po(1)Ayan_R
 
C++ теория
C++ теорияC++ теория
C++ теорияtank1975
 
C++ теория
C++ теорияC++ теория
C++ теорияtank1975
 
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Mikhail Kurnosov
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Alex Ott
 
язык программирования Go
язык программирования Goязык программирования Go
язык программирования GoMac'Kensi Lord
 
Scripting languages
Scripting languagesScripting languages
Scripting languagesLev Panov
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Yandex
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Компьютерная графика. Введение в Processing
Компьютерная графика. Введение в ProcessingКомпьютерная графика. Введение в Processing
Компьютерная графика. Введение в ProcessingTatiana Volkova
 
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NETОпыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NETGoSharp
 

Semelhante a Теория языков программирования некоторые слайды к лекциям (20)

C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.
 
лекции спрг 6_семестр (1)
лекции спрг 6_семестр (1)лекции спрг 6_семестр (1)
лекции спрг 6_семестр (1)
 
Custom Language Plugin for JetBrains IDEA
Custom Language Plugin for JetBrains IDEACustom Language Plugin for JetBrains IDEA
Custom Language Plugin for JetBrains IDEA
 
Lecture1: Introduction to Parallel Computing
Lecture1: Introduction to  Parallel ComputingLecture1: Introduction to  Parallel Computing
Lecture1: Introduction to Parallel Computing
 
Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...
 
Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12
 
Ayan9r1 po(1)
Ayan9r1 po(1)Ayan9r1 po(1)
Ayan9r1 po(1)
 
C++ теория
C++ теорияC++ теория
C++ теория
 
C++ теория
C++ теорияC++ теория
C++ теория
 
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
 
язык программирования Go
язык программирования Goязык программирования Go
язык программирования Go
 
CUDA Best Practices (2-3)
CUDA Best Practices (2-3)CUDA Best Practices (2-3)
CUDA Best Practices (2-3)
 
Scripting languages
Scripting languagesScripting languages
Scripting languages
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Компьютерная графика. Введение в Processing
Компьютерная графика. Введение в ProcessingКомпьютерная графика. Введение в Processing
Компьютерная графика. Введение в Processing
 
php frameworks
php frameworksphp frameworks
php frameworks
 
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NETОпыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
 

Mais de Sergey Staroletov

Distributed Systems Presentation for Business informatics students (Staroletov)
Distributed Systems Presentation for Business informatics students (Staroletov)Distributed Systems Presentation for Business informatics students (Staroletov)
Distributed Systems Presentation for Business informatics students (Staroletov)Sergey Staroletov
 
Staroletov Design by Contract, verification of Cyber-physical systems
Staroletov Design by Contract, verification of Cyber-physical systemsStaroletov Design by Contract, verification of Cyber-physical systems
Staroletov Design by Contract, verification of Cyber-physical systemsSergey Staroletov
 
Staroletov MBC (Model Based Checking)
Staroletov MBC (Model Based Checking)Staroletov MBC (Model Based Checking)
Staroletov MBC (Model Based Checking)Sergey Staroletov
 
Staroletov testing TDD BDD MBT
Staroletov testing TDD BDD MBTStaroletov testing TDD BDD MBT
Staroletov testing TDD BDD MBTSergey Staroletov
 
An Application of Test-Driven Development Methodology into the Process of Ha...
 An Application of Test-Driven Development Methodology into the Process of Ha... An Application of Test-Driven Development Methodology into the Process of Ha...
An Application of Test-Driven Development Methodology into the Process of Ha...Sergey Staroletov
 
Towards a Probabilistic Extension to Non-Deterministic Transitions in Model-B...
Towards a Probabilistic Extension to Non-Deterministic Transitions in Model-B...Towards a Probabilistic Extension to Non-Deterministic Transitions in Model-B...
Towards a Probabilistic Extension to Non-Deterministic Transitions in Model-B...Sergey Staroletov
 
Applying Model Checking Approach with Floating Point Arithmetic for Verificat...
Applying Model Checking Approach with Floating Point Arithmetic for Verificat...Applying Model Checking Approach with Floating Point Arithmetic for Verificat...
Applying Model Checking Approach with Floating Point Arithmetic for Verificat...Sergey Staroletov
 

Mais de Sergey Staroletov (8)

Distributed Systems Presentation for Business informatics students (Staroletov)
Distributed Systems Presentation for Business informatics students (Staroletov)Distributed Systems Presentation for Business informatics students (Staroletov)
Distributed Systems Presentation for Business informatics students (Staroletov)
 
Staroletov Design by Contract, verification of Cyber-physical systems
Staroletov Design by Contract, verification of Cyber-physical systemsStaroletov Design by Contract, verification of Cyber-physical systems
Staroletov Design by Contract, verification of Cyber-physical systems
 
Staroletov MBC (Model Based Checking)
Staroletov MBC (Model Based Checking)Staroletov MBC (Model Based Checking)
Staroletov MBC (Model Based Checking)
 
Staroletov testing TDD BDD MBT
Staroletov testing TDD BDD MBTStaroletov testing TDD BDD MBT
Staroletov testing TDD BDD MBT
 
An Application of Test-Driven Development Methodology into the Process of Ha...
 An Application of Test-Driven Development Methodology into the Process of Ha... An Application of Test-Driven Development Methodology into the Process of Ha...
An Application of Test-Driven Development Methodology into the Process of Ha...
 
Towards a Probabilistic Extension to Non-Deterministic Transitions in Model-B...
Towards a Probabilistic Extension to Non-Deterministic Transitions in Model-B...Towards a Probabilistic Extension to Non-Deterministic Transitions in Model-B...
Towards a Probabilistic Extension to Non-Deterministic Transitions in Model-B...
 
Applying Model Checking Approach with Floating Point Arithmetic for Verificat...
Applying Model Checking Approach with Floating Point Arithmetic for Verificat...Applying Model Checking Approach with Floating Point Arithmetic for Verificat...
Applying Model Checking Approach with Floating Point Arithmetic for Verificat...
 
Cameroun (Francophone day)
Cameroun (Francophone day)Cameroun (Francophone day)
Cameroun (Francophone day)
 

Теория языков программирования некоторые слайды к лекциям

  • 2. Теория языков программирования и методы трансляции
  • 3. Компиляторы и интерпретаторы - Компиляторы создают объектный код или внутреннее представление - Интерпретаторы на лету выполняют исходный код или команды виртуальной машины - Примеры компиляторов и компилируемых языков - C (gcc) - C++ (g++) - C# (csc) - javac (компилятор в class файлы) - erlc (компилятор в beam платформы Erlang) Примеры интерпретаторов и интерпретируемых языков - Python - PHP - JS - java (интерпретатор байт-кода. Как правило, интерпретированные языки отличаются динамической типизацией (тип вычисляется в процессе выполнения и заранее неизвестен) В целях оптимизации часть кода может кешироваться
  • 4. Как получить интерпретатор из синтаксического и семантического анализатора - Кроме типа для всех переменных нужно хранить значение в узле дерева - Для грамматических правил с выражениями нужно также возвращать тип и значение, которое будет считаться в правилах вида A+A | A*A и тд - Там же нужно делать преобразование типов по заданным правилам, в зависимости от типа операндов - Циклы делаются в соответствии с блок-схемой работы цикла (while - вычисление и переход, for (A;B;C) D - присваивание, проверка, выполнение тела, выполнение тела с инкрементом и тд - Функции возвращают значения в своем узле. Для рекурсии необходимо копирование поддеревье с подчисткой и заменой на значение, иначе значение затрётся - См пособие для примеров! Пример репозитория с исходным кодом интерпретатора Паскаля (присваивания, функции, while) https://github.com/SergeyStaroletov/PascalInterpreterMini
  • 6. Кодогенерация ● Напрямую в ассемблерный или объектный код ● В промежуточный код (или последовательность промежуточных) Виды промежуточного кода ● Деревья ● ПОЛИЗ ● Триады/тетрады
  • 7. Кодогенерация (далее наша цель) Нужно всегда думать о том, что мы будем генерировать на выходе gcc -S 1.c
  • 8. IL code : java javap -c M.class
  • 9. IL code: и даже C clang -S -emit-llvm 1.c
  • 10. Внутреннее представление Если имеется промежуточное представление, по нему можно проводить оптимизацию и делать статический анализ ошибок
  • 13. Тетрады и Триады Тетрада – это конструкция, содержащая: - Операция - Операнд 1 - Операнд 2 - Результат Триада – это пронумерованная конструкция, содержащая - Операция - Операнд 1 (или ссылка) - Операнд 2 (или ссылка)
  • 14. Синтаксически-управляемый перевод Мы добавляем в грамматику “Дельта-функции” для формирования множества триад
  • 15. Пара примеров Выражения Добавляем в множество триад триаду с присваиванием на адрес триады с результатом выражения Добавляем в триады + <триаду выр1> <триаду выр 2>
  • 17. Тест для while (2 перехода)
  • 18. Генерация триад для LL стратегии
  • 19. Пример кода https://github.com/SergeyStaroletov/PascalTriadGenLL Исходники генератора триад для Паскаля с функциями и while на основе LL стратегии
  • 21. Виды оптимизаций Оптимизация вместе с профилированием кода (опции gcc -pg, clang -fprofile-instr-generate) позволяет улучшать и контролировать скорость критических строк кода, предоставляя компилятору возможности делать предопределенные классы оптимизаций
  • 22. Граф управления Если мы имеем последовательность триад, то легко построить граф управления по ней
  • 23. Визуализация графов управления Graphviz (dot). Описание графа на простом декларативном языке приводит к хорошим, выровненным графам https://dreampuf.github.io/GraphvizOnline
  • 24. Простейшие алгоритмы оптимизации Вычисление некоторых выражений на этапе компиляции: найти триады, все операнды которых константы, заменить на значения, триады удалить
  • 25. Простейшие алгоритмы оптимизации Удаление повторяющихся триад – 1. Попарно сравниваем триады, при условии что между Сравниваемыми триадами не изменяются их операнды
  • 26. Простейшие алгоритмы оптимизации Удаление повторяющихся триад – 2. - Поиск поддеревьев в графе - Передача операций вверх, формирование “хэша” - агрегата сложных операций (с учетом коммуникативности)
  • 27. Оптимизация ветвлений - Поиск одинакового начала и конца веток if then и else - Одинаковые начала надо вставить до цикла - Одинаковые концы – после цикла
  • 28. Оптимизация циклов - Главное сначала определить, где цикл - Поиск инвариантных триад (значений, которые не меняются внутри цикла) – их нужно вычислить до цикла и потом просто использовать - Предсказание изменения счетчика цикла и более эффективный пересчет выражений с ним
  • 29. Оптимизация используемых регистров - Оптимально вычислять выражения, когда операнды загружены в регистры процессора - Регистров мало - Приходится подгружать из памяти - Поэтому для последующей генерации кода нужно использовать минимум регистров Вводим функцию reg(a) для каждой вершины, которая будет хранить число регистров
  • 31. Другие алгоритмы - Превращение малых функций в inline - Поиск неиспользуемых переменных путем формирования графа использования каждой переменной - Векторизация, автоматическая параллелизация кода Меня интересуют например - Устранение рекурсии типа Факториал - Устранение рекурсии типа Фибоначчи*
  • 32. Задание - Генератор триад - Оптимизатор триад (минимум два алгоритма)
  • 34. Генерация - процесс Парадигма генерации кода Triads Machine code (assembler/intermediat e) Object code stdlib Linker Binary
  • 35. Процесс компиляции для gcc Source.c source.s Libs (.o .a .so) stdlib source.o Linker bin/exe gcc source1.c source2.c -lmylib -o result → ./result gcc -S source.c → source.s gcc source.s → ./a.out
  • 36. Процесс кодогенерации Будем проводить кодогенерацию asm кода по триадам Принцип “обезьяна видит – обезьяна делает” Monkey-driven developing :) Нужно изучать, как ведет себя компилятор gcc (или другой) путем тестов А именно: - какие команды генерируются для арифметики - команды регистр-регистр, регистр-память - какие команды для переходов - методы адресации (прямая, косвенная, относительно стека) - вызов функций, передача параметров - вызов методов стандартной библиотеки, если надо вывод
  • 37. Пример Платформенно-зависимый код Эпилог main Хранение строки Загрузка строки Загрузка рез (а) и помещение в esi Вызов printf Возврат и эпилог
  • 38. Отсюда делаем вывод Для печати значения можно применять leaq L_.str(%rip), %rdi movl <что>, %esi movb $0, %al callq _printf xorl %esi, %esi ## # в самом конце .section __TEXT,__cstring,cstring_literals L_.str: ## @.str .asciz "%dn" Данный код зависит от разрядности и платформы!
  • 39. Особенности ассемблера - Загрузка значений в другом порядке - Константы с $ - Знаковые/беззнаковые операции - Есть команды только регистр-регистр, есть регистр- память. Нужно использовать movl предварительно в некоторых случаях - Зависит от платформы, для которой генерируем! Для другой ОС генерация отличается в некоторых моментах (пролог/эпилог/описания)
  • 40. LLVM: решаем проблему зависимости от платформы Сегодня все чаще генерация идет через специальный бэкэнд в виде промежуточного кода с возможностью генерации под разные ОС/платформы/языки gcc -S -emit-llvm 1.c
  • 41. Приемы генерации - Генерация описания (глобальные, не глобальные) - Локальные переменные – генерируем по триаде начала функции резервирование стека, далее адресуем переменные относительно стека+смещение - Для генерации арифметики храним, где значение переменной/триады. Оптимально использовать регистры. Для этого есть пул регистров, которые по очереди “занимаются”. Для каждой триады известно, где сейчас ее значение. При ссылке на нее оттуда его берем. Если нужен регистр, а все заняты, нужно слить значение из него - генерируем выгрузку по необходимости и загрузку в регистр нового перед операцией с значением соответствующей триады
  • 42. Отладка (тестирование) - Генерация вызовов printf - Отладчики GDB / LLDB https://lldb.llvm.org/lldb-gdb.html
  • 44. Проблемы - Написание анализаторов, интерпретаторов, компиляторов – достаточно стандартная задача - Все зависит от входной грамматики; алгоритмы анализа, интерпретации, компиляции стандартны и их можно комбинировать - Grammar-Driven Development
  • 45. BNF и EBNF формы грамматик Форма Бэкуса — Наура: В РБНФ введены два новых синтаксических элемента: условное вхождение (выражение в квадратных скобках) и повторение (выражение в фигурных скобках)
  • 46. Процесс разработки Грамматика в виде БНФ/ЕБНФ (свой язык описания) Генератор Внедренные конструкции семантики на целевом языке программирования Код парсера, интерпретатора, компилятора
  • 47. Генераторы, принятые в Community - Java Compiler Compiler - ANTLR (Java world) - Yacc/Flex/Bison (GNU world)
  • 48. Преимущества использования генераторов - Нет изобретению велосипеда - MDD-процесс (модель это грамматика), поддерживаемость - Интегрируемость в IDE - Визуализация синтаксических диаграмм - Открытые грамматики для реальных языков программирования - Отладка по грамматике (дебаг не по коду, а по исходнику грамматики)
  • 49. Генераторы анализаторов и стратегии разбора - ANTLR работает с LL(*) грамматиками - YACC работает с LALR (LR) грамматиками (более эффективно работает с обработкой ошибок в синтаксисе)
  • 50. Примеры: грамматика + семантические вызовы для yacc
  • 51. Примеры: ANTLR плагин для IDEA !! Имеется большое число доступных грамматик реальных языков (с расширением .g4) Правила грамматиики Нетерминалы Код для теста Дерево разбора Сгенерированный код парсера в проекте
  • 52. Пример генератора с ANTLR 1. Добавляем в проект antlr-4.7.2-complete.jar 2. Ищем и качаем грамматику Java (в примере - java9.g4) 3. Правой кнопкой в грамматике “Generate ANTLR recognizer” 4. В проект добавлены Java9Parser, Java9Lexer, Java9Visitor 5. Пишем main(), нужно начать с корневого правила грамматики 6. И добавить свой Listener для обработки захода или выхода из узлов синтаксического дерева
  • 53. Пример генератора с ANTL 7. Теперь нужно написать актуальный код по обработке заходов в узлы - мы будем считать размер методов 8. По грамматике это MethodDeclaration 9. Пишем код при выходе из описания метода
  • 54. DSL языки DSL (Domain-Specific Language) – миниязык, который описывает понятия и взаимосвязи из некоторых предметных областей Примеры: управление роботами*, персонажами, умными домами переводом денег, … Терминалы языка – понятия этой области + операции над ними Современные языки позволяют доопределять синтаксис для создания подобных DSL языков А также существуют готовые решения на основе текстового, графического языка и генератора/интерпретатора по ним. XText+Xtend на основе Eclipse - готовое средство создание своих DSL с метамоделью языка * Никитин, Старолетов. ИСПОЛЬЗОВАНИЕ KOTLIN ДЛЯ ОПИСАНИЯ ДЕРЕВЬЕВ ПОВЕДЕНИЯ В ЦЕЛЯХ МОДЕЛИРОВАНИЯ ИИ В ОБЛАСТИ ОБУЧАЮЩЕГО ПО
  • 55. Задание (расчетка) - Используя один из генераторов парсеров, использовать его для создания парсера реальной грамматики языка программирования. - Создать свою мини-грамматику в нем - Реализовать семантику - интерпретатор выражений + if/ while/case - Вставить в отчет диаграммы разбора, генерируемые средством