Вступ¶
Опис роботи¶
Компілятор pyCompiler - системна програма, яка призначена для транслювання коду на мові високого рівня Myl на мову асемблера, компіляції за допомогою NASM та лінкування у виконавчий файл.
Компілятор включає в себе такі компоненти як:
- Лексичний аналізатор,
- Синтаксичний аналізатор,
- Транслятор (Формальна граматика мови описана далі. myl далі - “мова”),
- Оптимізатор коду на асемблері,
- Генератор коду мови асемблера;
Всі компоненти повністю покриті тестами. Для тестування використана програма nosetests.
Використані інструменти¶
Компілятор повністю написаний на мові програмування Python 2.7, призначений для запуску на OS GNU/Linux.
Зовнішні інструменти, необхідні для роботи:
- Власне компілятор, який може бути скачаний з репозиторію https://github.com/antigluk/pyCompiler (або архівом ZIP: https://github.com/antigluk/pyCompiler/archive/master.zip)
- Системна програма лінкування ld
- Компілятор мови асемблеру NASM
- Інтерпретатор мови Python 2
Етапи отримання виконавчого файлу¶
Вихідний код, поданий як вхідні дані проходить кілька етапів обробки:
- Лексичний аналіз, при якому код розбирається на окремі лексеми
- Синтаксичний, при якому зі списку лексем формується дерево виконання
- Аналіз отриманого дерева, отримання списків оголошених функцій, змінних, строкових літералів
- Транслювання дерева виконання у код на псевдо-асемблері для ОС GNU/Linux
- Оптимізація коду на псевдо-асемблері
- Генерація коду на асемблері в синтаксисі NASM
- Компіляція коду за допомогою системної програми NASM у об’єкний файл
- Лінкування об’єкного файлу зі бібліотекою libc в виконавчий файл
Тобто, на виході можна отримати бінарний файл, готовий до виконання.
Якщо запустити програму з параметром “-v”, то можна побачити команди виклику зовнішніх системних програм nasm та ld:
pyCompiler 0.1
-------------------
Lexical analysis: Done
Syntax analysis: Done
Find variables and strings: Done
Generate Pseudo-Asm code: Done
Optimization: Done
Generate NASM code: Done
Compiling:
nasm -f elf -o examples/build/e7.o -O2 -l examples/build/e7.lst examples/build/e7.asm
Done
Linking:
ld -s -lc -dynamic-linker /lib/ld-linux.so.2 -o examples/e7.bin examples/build/e7.o
Done
А саме, виклик NASM:
nasm -f elf -o examples/build/e7.o -O2 -l examples/build/e7.lst examples/build/e7.asm
Бачимо, що генерується об’єкний файл формату ELF, а також увімкнена оптимізація O2
Виклик ld - є програмою лінкування:
ld -s -lc -dynamic-linker /lib/ld-linux.so.2 -o examples/e7.bin examples/build/e7.o
Ключ “-lc” додає до програми бібліотеку libc - стандартну бібліотеку з корисними функціями, такими як printf, scanf, fflush та іншими.
Вихідний файл має розширення .bin, а саме examples/e7.bin - після лінковки є виконавчим файлом з правами на виконання (+x).