Skip to content

Instantly share code, notes, and snippets.

@h0tk3y
Created February 6, 2017 19:57
Show Gist options
  • Select an option

  • Save h0tk3y/64ead847db3e217ffe30cafaef6e90c4 to your computer and use it in GitHub Desktop.

Select an option

Save h0tk3y/64ead847db3e217ffe30cafaef6e90c4 to your computer and use it in GitHub Desktop.
Антон Подкопаев -- [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