Компиляторы, 3 курс, 5 семестр, 2016/17
Материал из SEWiki
Лектор: Булычев Дмитрий Юрьевич.
https://github.com/dboulytchev/sample-compiler
Образ с настроенным софтом для виртуальной машины: OVA (логин внутри: me
, пароль: me
).
Вся информация на этой странице сдублирована из почты!
Содержание
Домашние задания
Домашнее задание от 13.09.2016
- Дописать интерпретатор стековой машины с символическим стеком (там надо поддержать оставшиеся 5 инструкций).
- Реализовать печать инструкций в правильном формате ассемблера x86 (см., например, https://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax).
- Реализовать правильное "обрамление" порожденной программы:
.text
.globl main
main:
<тут идет текст ассемблерного порождения>
ret
Конструкции управления
Базовые:
-
if E then S1 else S2 fi
, гдеE
— выражение, аS1
иS2
— операторы. Если значениеE вычисляется не в ноль, то исполняется <code>S1, иначе —
S2. -
while E do S od</code, где <code>E — выражение, <code>S
— оператор. Если значениеE
вычисляется в не ноль, то исполняетсяS
, а потом весьwhile
заново; иначе не делается ничего.
Дополнительные:
-
if E1 then S1 {elif E2 then S2 elif E3 then S3} ... [else Sk] fi
эквивалентно:
if E1 then S1 else if E2 then S2 else if E3 then S3 .... [else Sk] fi
repeat S until E
эквивалентноS; while E == 0 do S od
for S1, E, S2 do S od
эквивалентноS1; while E do S; S2 od
Поддержка функций
Документация
Система сборки (новая)
Используется opam - это пакетный менеджер для OCaml.
Подготовка (альтернативно можно запустить скрипт от Димы):
- Требуется установить opam версии хотя бы 1.2.2. Есть в репозиториях Debian/Ubuntu (
sudo apt-get install opam
). - Должен автоматически поставится компилятор ocaml. Проверяем версию:
ocaml -version
. - Если версия хотя бы 4.02 - запускаем из домашнего каталога
opam init
. Если версия древнее — запускаемopam init --comp 4.03.0
. - Чтобы подцепить изменения в окружении в текущей сессии, надо запустить
eval `opam config env`
. Теперь версия компилятора точно должна быть хотя бы 4.02. - Выполняем команды:
opam pin add logger https://github.com/dboulytchev/logger.git -y -n opam pin add GT https://github.com/dboulytchev/GT.git -y -n opam pin add ostap https://github.com/dboulytchev/ostap.git -y -n opam pin add ocanren https://github.com/dboulytchev/ocanren.git -y -n opam install ostap opam install ocanren
- Также для сборки
runtime.o
на Debian/Ubuntu может потребоваться пакетg++-multilib
.
Как собирать:
- Если вы находитесь в корне репозитория:
make -f Makefile.ob
. - Если вы находитесь не в корне, а, скажем, в папке src, то надо добавить параметр
-C <путь-до-корня>
:make -C .. -f Makefile.ob
.