Вступ

Опис роботи

Компілятор pyCompiler - системна програма, яка призначена для транслювання коду на мові високого рівня Myl на мову асемблера, компіляції за допомогою NASM та лінкування у виконавчий файл.

Компілятор включає в себе такі компоненти як:

Всі компоненти повністю покриті тестами. Для тестування використана програма nosetests.

Використані інструменти

Компілятор повністю написаний на мові програмування Python 2.7, призначений для запуску на OS GNU/Linux.

Зовнішні інструменти, необхідні для роботи:

  1. Власне компілятор, який може бути скачаний з репозиторію https://github.com/antigluk/pyCompiler (або архівом ZIP: https://github.com/antigluk/pyCompiler/archive/master.zip)
  2. Системна програма лінкування ld
  3. Компілятор мови асемблеру NASM
  4. Інтерпретатор мови Python 2

Етапи отримання виконавчого файлу

Вихідний код, поданий як вхідні дані проходить кілька етапів обробки:

  1. Лексичний аналіз, при якому код розбирається на окремі лексеми
  2. Синтаксичний, при якому зі списку лексем формується дерево виконання
  3. Аналіз отриманого дерева, отримання списків оголошених функцій, змінних, строкових літералів
  4. Транслювання дерева виконання у код на псевдо-асемблері для ОС GNU/Linux
  5. Оптимізація коду на псевдо-асемблері
  6. Генерація коду на асемблері в синтаксисі NASM
  7. Компіляція коду за допомогою системної програми NASM у об’єкний файл
  8. Лінкування об’єкного файлу зі бібліотекою 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).