Created
February 6, 2017 19:57
-
-
Save h0tk3y/64ead847db3e217ffe30cafaef6e90c4 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Антон Подкопаев -- [email protected] | |
| Даниил Березун -- [email protected] | |
| Лекции и практики, в основном домашние работы и курсовая работа (написание компилятора к концу семестра). | |
| Компиляторы -- один из самых интересных типов языковых процессоров. | |
| Языковой процессор обрабатывает текст на каком-то языке. | |
| Другие варианты: | |
| * интерпретатор; | |
| * транслятор (старое слово для компилятора, но разница есть: транслятор -- что-то, что переводит программу из одного языка в другой, и компиляция -- частный случай, а вообще трансляция может идти и в обратную сторону); | |
| * декомпилятор; | |
| * статический анализатор; | |
| * составные части IDE. | |
| Фазы работы GCC: | |
| *.c -(preprocessing, compiling)->> *.s -(ASM)-> *.o -(linking)-> executable | |
| Мы будем писать компилятор в x86, и GCC нам пригодится, чтобы смотреть, какой ассемблерный код он генерирует. | |
| Для сборки и линковки мы будем использовать GCC. | |
| Лексический анализ: (source) -> (list of tokens) | |
| Синтаксический анализ: (list of tokens) -> (AST) | |
| Семантический анализ: (AST) -> (correct, typed AST | error) | |
| Оптимизация | |
| Трансляция в промежуточное представление: (AST) -> (linear assembly-like code) | |
| Оптимизация | |
| Трансляция в целевой язык | |
| Оптимизация | |
| Промежуточное представление нужно для для облегчения оптимизаций, кросплатформенности, а ещё чтобы для каждого входного языка не делать back-end'ы отдельно. | |
| Язык в формальной интрпретации состоит из: | |
| * синтаксис -- хорошо представляется в виде грамматики | |
| * семантика -- смысл, соответствующий программе (позже рассмотрим, как описать формально) | |
| * прагматика -- как, где и зачем язык обычно используют | |
| AST vs parse tree | |
| if (a > 5) { | |
| print(6); | |
| } else { | |
| print(7); | |
| } | |
| IF ----- condition --- comparison (>) ------ a | |
| \ \ | |
| \--- then ----- call (print) --- 6 5 | |
| \ | |
| -- else ----- call (print) --- 7 | |
| В CST в дополнение к этому есть все незначащие символы и начало-конец поддеревьев в потоке символов. | |
| gcc -Q test.cpp | |
| Выводит статистику по фазам и времени, потраченном в них. | |
| Середина XX века: все писали в машинных кодах. Потом появился ассемблер. Потом появился первый язык высокого уровня -- FORTRAN. | |
| Bootstrapping -- "раскрутка" компилятора, когда компилятор итеративно пишется на расширяющихся подмножествах своего исходного языка. | |
| Для написания компиляторов главным "академическим" языком считается OCaml. byterun -- его виртуальная машина, и это единственная часть кода, написанная не на OCaml. Соответственно, компилятором gcc для целевой платформы можно собрать byterun, а затем компилятором в виде байткода можно собрать его же аналог для целевой платформы. | |
| Считается, что серьёзные компиляторы для высокоуровневых general-purpose-языков должны быть написаны на своём исходном языке. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment