Skip to content

Repository files navigation

Язык программирования

Введение

Данный проект представляет собой мой язык программирования. У моего языка есть возможность транслировать код в два вида ассемблерных кода (x86-64 и мой собственный ассемблер).

Проект состоит из 4 частей:

  1. Frontend
  2. Middleend
  3. Backend
  4. Reverse frontend

Более подробно про каждый из них, поговорим чуть позже.

Note

Язык поддерживает только целочисленные типы данных, поэтому я решил не добавлять типы данных.

Скачивание и установка проекта

Для установки программы используются утилиты make и git.

    git clone git@github.com:EntryFrager/language.git
    cd language
    make

Принцип работы компилятора

Работа компилятора состоит из нескольких этапов:

  1. Frontend: Лексический анализ кода (разбиение на токены) и синтаксический анализ кода (создание абстрактного синтаксического дерева)
  2. Middleend: Оптимизации дерева
  3. Backend: Трансляция дерева в ассемблерный код

Рассмотрим более подробно backend. В моем проекте возможны трансляции в два вида ассемблерных кода:

  1. NASM (x86-64)
  2. Мой собственный ассемблер

Для моего ассемблера я взял старый проект CPU. Он состоит из двух частей:

  1. Ассемблер (на основе ассемблерного кода создает бинарный код для процессора)
  2. Процессор (представляет из себя виртуальную машину, которая выполняет бинарный код)

Отличие NASM от моего ассемблера

Главным отличием является то, что для перемещения данных в моем ассемблере используется стек. Поэтому все инструкции берут свои аргументы из стека. Также мой ассемблер составляет ассемблерный листинг, который сохраняется в папке files.

Для ввода и вывода чисел в моем ассемблере присутствуют инструкции in и out, которые соответственно считывают и выводят значения, используя стандартные потоки ввода и вывода (stdin, stdout). В NASM для данных функций я написал свою библиотеку stdio.asm.

Примеры программ на языке

Я написал два примера для тестирования языка:

  1. Программа, решающая квадратное уравнение
  2. Программа, считающая факториал от n

Приведу код второго примера. С первым примером вы можете ознакомиться самостоятельно.

def main()
{
    input(a);

    NO_FACT = 1;

    if (a < 0 || a == 0)
    {
        print(NO_FACT);
    }
    else
    {
        result = fact(a);

        print(result);
    }
}

def fact(n)
{
    if (n == 1)
    {
        return n;
    }

    b = n - 1;

    n = n * fact(b);

    return n;
}

Note

Ниже приведен пример AST для второго примера.

overflow

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages