Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
JIT_CORE.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
60.7 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

СИБИРСКИЙ ГОСУДАРСТВЕННЫЙ АЭРОКОСМИЧЕСКИЙ УНИВЕРСИТЕТ

ИМЕНИ АКАДЕМИКА М. Ф. РЕШЕТНЕВА

Институт информатики и телекоммуникаций

Кафедра информатики и вычислительной техники

Курсовой проект по дисциплине

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

Тема: Core of JIT-compilation for C-like language

Выполнил: студент группы

БПИ14-01 К. А. Гусев

Проверил: Е. П. Моргунов

г. Красноярск – 2015

Оглавление

Введение 4

1 Актуальность 4

2 Цель 4

3 Задачи: 4

План выполнения разработки 4

Документ - концепция 4

1 Введение 4

1.1 Назначение и общая характеристика продукта 4

2 Описание пользователей 5

2.1 Виды потребителей и их краткие описания 5

2.2 Среда пользователя 5

2.3 Основные потребности 5

3 Состояние рынка и конкурирующие продукты 5

3.1 Характеристика рынка 5

3.2 Конкурирующие программные продукты 5

3.3 Определение позиции продукта на рынке 6

4 Функциональные требования (функции продукта) 6

4.1 Обязательные функции для первой версии 6

4.2 Дополнительные функции для первой версии 7

4.3 Будущие функции 7

5 Основные способы использования программного продукта и сценарии работы с ним 7

5.1 Основной способ использования ядра в составе стороннего программного продукта 7

5.2 Построение скриптового языка для работы с системой 7

6 Нефункциональные требования 8

6.1 Требования к программному продукту 8

6.2 Организационные требования 8

6.3 Внешние требования 9

6.4 Прочие требования 9

7 Требования к документации 9

7.1 Руководство программиста 9

7.2 Руководство пользователя 9

7.3 Интерактивная подсказка 10

7.4 Руководства по инсталляции и конфигурированию и файл ReadMe 10

7.5 Маркировка и упаковка 10

8 Глоссарий и список сокращений 10

8.1 Глоссарий 10

8.2 Список сокращений 10

Архитектура программного продукта 10

Технический проект 11

1 Основные структуры данных 11

1.1 TYPE 11

1.2 VAR 11

1.3 E 11

1.4 FUNCTION 11

1.5 MODULE 12

1.6 CORE 12

2 Основное назначение функций 12

2.1 Функции класса CORE 12

Методика тестирования 13

Руководство программиста 14

1 Способы подключения ядра к стороннему продукту: 14

2 Основные этапы использования ядра (на конкретном примере): 14

Руководство пользователя 14

1 Возможности языка: 14

Заключение 15

Список использованной литературы 15

  1. Введение

    1. Актуальность

Без актуальности.

    1. Цель

Целью моей работы является разработка ядра JIT-компиляции, которое предоставляло бы возможность компиляции скриптов в машинный код в режиме реального времени, с дальнейшей возможностью их исполнения.

    1. Задачи:

  1. Изучить набор команд процессора.

  2. Изучить основные схемы построения алгоритмов.

  3. Создать парсер, для разбора исходного кода на значащие единицы.

  4. Создать компилятор, для генерации машинного кода.

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

  1. План выполнения разработки

Вид выполняемой работы

Сроки завершения

Меню программы

1.04.2015

Функция вывода файлов

5.04.2015

Функция для записи исходной информации в файлы

10.04.2015

Функция собирающая, информацию из исходных файлов в массив

(в нужном формате для обработки)

1.05.2015

Функция формирующая, таблицу для визуального восприятия

10.05.2015

Функция формирующая, и заполняющая расписание

25.05.2015

Составление документации

5.06.2015

  1. Документ - концепция

    1. Введение

      1. Назначение и общая характеристика продукта

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

    1. Описание пользователей

      1. Виды потребителей и их краткие описания

        1. Разработчик

Условно может быть назван первичным потребителем, так как использует ядро как составляющую часть своего программного продукта.

        1. Пользователь

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

      1. Среда пользователя

Среда пользователя зависит от программного обеспечения, в котором применяется ядро. Основным требованием является принадлежность архитектуры процессора к числу х86.

      1. Основные потребности

        1. Разработчик

Основными требования для разработчика являются относительная простота применения и возможность дальнейшего масштабирования и специализированная в своих нуждах.

        1. Пользователь

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

    1. Состояние рынка и конкурирующие продукты

      1. Характеристика рынка

На исследуемом рынке можно выделить две основные категории языков программирования. Первая из них – это интерпретируемые ЯП. Они как правило предоставляют возможность исполнения произвольного исходного кода, путём использования специальной функции. Это разрешено потому, что интерпретируемые языки компилируются в процессе исполнения. Вторая же – компилируемые ЯП. В эти языки возможность исполнения произвольного исходного кода сводится к нулю, т.к. программа переводится в машинный код на этапе разработке. Несмотря на такое кажущееся преимущество, интерпретируемые языки проигрывают в быстродействии. Одним из расширений для компилируемого языка С++ является Lua, позволяющий исполнять скрипты, представленные в виде исходного кода на момент их исполнения.

      1. Конкурирующие программные продукты

        1. Общая характеристика

Основной возможностья Lua и других возможных аналогов, является создание скриптов и их исполнения. Язык написания скрипта может быть как уникальным (например Lua), так и унаследованным от языка «исполнителя»(например PHP, Python). Однако не зависимо от языка, скрипты должны включать в себя такие основные конструкции как: выражения, условия, циклы и функции.

      1. Определение позиции продукта на рынке

Данный продукт не планирует позиционировать себя на рынке, т.к. является учебной моделью, для получения новых знаний и опыта.

    1. Функциональные требования (функции продукта)

      1. Обязательные функции для первой версии

  1. Использование скриптов

      1. Все скрыпты должны быть представлены в виде исходного кода

      2. Каждый скрипт должен представлять отдельно-независимую единицу – модуль

      3. Ядро должно предоставлять возможность обращения к модулям

      4. Модуль должно предоставлять возможность обращения к функциям и глобальным переменным находящимся в скрипте.

      5. Модуль должен предоставлять возможность, обращения к разрешенным для вызова функциям находящимся в исходном коде программного продукта

  2. Основные состовляющие языка

    1. Переменные

      1. Должна быть реализована возможность объявления локальных и глобальных переменных

    2. Операции

      1. Арифметические операции

        1. Сложения «+»

        2. Вычитания «-»

        3. Умножения «*»

        4. Деления «\»

        5. Нахождения остатка «%»

        6. Инкремент «++»

        7. Декремент «--»

      2. Операции сравнения

        1. Меньше «<»

        2. Меньше равно «<=»

        3. Больше «>»

        4. Больше «>=»

        5. Равно «==»

        6. Неравно «!=»

      3. Логические операции

        1. Отрицание «!»

        2. Конъюнкция «&&»

        3. Дизъюнкция «||»

      4. Побитовые операции

        1. Побитовая конъюнкция «&»

        2. Побитово-исключающее ИЛИ «^»

        3. Побитовая дизъюнкция «|»

    3. Выражения

      1. Должна быть реализована поддержка вычисления сложных выражений

    4. Оператор ветвления

      1. Должна быть реализована конструкция ветвления, содержащая только альтернативу истины

      2. Должна быть реализована конструкция ветвления, содержащая альтернативу истины и альтернативу лжи.

    5. Оператор организации циклов

      1. Должна быть реализована конструкция, организующая цикл с предусловием

    6. Операторы передачи управления

      1. Оператор завершения функции, с возвращаемым значением

      2. Оператор завершения цикла

      3. Оператор перехода к следующей итерации цикла

      1. Дополнительные функции для первой версии

  1. Оператор ветвления(дополнение)

      1. Должна быть реализована конструкция ветвления, содержащую несколько условий с соответствующими альтернативами истины, а так же общую альтернативу лжи.

      1. Будущие функции

  1. Основные составляющие языка. Расширенные фундаментальные, а так же пользовательские типы

      1. Должна быть реализована поддержка таких фундаментальных типов как(8, 16 и 64 битные целые типы, 4 и 8 байтовые вещественные)

      2. Должна быть реализована поддержка создания пользовательских типов, определяемых на основе стандартных и других ранее определенных пользовательских типах

  2. Соглашения о вызовах функций

      1. Должна быть реализована поддержка основных соглашений о вызовах функций таких как (__cdecl, __fastcall  и др.)

    1. Основные способы использования программного продукта и сценарии работы с ним

      1. Основной способ использования ядра в составе стороннего программного продукта

Разработчик использует ядро путем включения его исходного кода в исходный код разрабатываемого им программного продукта. В местах, в которых требуется динамическая бизнес-логика, задаваемая пользователем, разработчик применяет функционал данного ядра. На месте вызова вставляется специальная функция для вызова сторонних неоткомпилированных скриптов. Предварительно модуль загружает файл и компилирует его в машинный код. В результате чего происходит быстрое выполнение загруженных функций, не требуя от пользователя особых знаний в разработки динамически подключаемых библиотек.

      1. Построение скриптового языка для работы с системой

Разработчик использует ядро путем включения его исходного кода в исходный код разрабатываемого им программного продукта. Так же он определяет функции программного продукта, доступ к которым будет разрешен из скриптов. На основе этого пользователь может составлять большие сценарии, выполнение которых будет иметь существенное преимущество перед аналогичным интерпретируемым вариантом.

    1. Нефункциональные требования

      1. Требования к программному продукту

        1. Требования к инсталляции

Нет требований.

        1. Требования к эксплуатации

Нет требований.

        1. Требования к эффективности

Нет требований.

        1. Требования к надежности

Нет требований.

        1. Требования к переносимости

Нет требований.

        1. Требования к защищенности

Нет требований.

        1. Требования к безопасности

Нет требований.

        1. Требования к удобству сопровождения

Должны быть подробные комментарии в исходных текстах программ.

        1. Требования к точности числовых вычислений

Нет требований.

        1. Прочие требования к программному продукту

Нет требований.

      1. Организационные требования

        1. Выходные требования

          1. Сроки разработки и изготовления

Первый работающий вариант программного продукта должен быть готов к 7 июня 2015 г. с возможностью досрочного завершения

          1. Сопутствующая документация

Нет сопутствующей документации.

          1. Прочие выходные требования

Нет требований.

        1. Требования к реализации

          1. Модель организации разработки

Модель итеративной разработки.

          1. Методы проектирования и документирования разработки

Нет требований.

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

Язык: C/C++

Среда разработки: MonoDevelop в ОС Linux Debian

          1. Локализация и интернационализация

Нет требований.

        1. Требования к стандартам

Нет требований.

        1. Требования к лицензированию

Программный продукт не подлежит лицензированию

        1. Требования к дистрибуции (распространению) и вопросы цены

  1. Исходный код продукта будет располагаться на GitHub

  2. Программный продукт будет распространяться бесплатно в исходных текстах.

        1. Вопросы авторских прав

Авторские права принадлежат Гусеву К. А.

      1. Внешние требования

        1. Требования к взаимодействию с другими системами

Нет требований.

        1. Юридические требования

Для разработки программного продукта должны использоваться только инструменты с лицензией, разрешающей их бесплатное использование.

        1. Этические требования

Нет требований.

      1. Прочие требования

Нет требований.

    1. Требования к документации

      1. Руководство программиста

Должно содержать следующие сведения (но не обязательно ограничиваться ими):

  • описание модулей программы и их взаимосвязей;

  • описание типовой структуры модуля и порядка его функционирования.

  • описание использования

      1. Руководство пользователя

Отсутствует, так как данный инструмент предназначен для разработчиков

      1. Интерактивная подсказка

Отсутствует.

      1. Руководства по инсталляции и конфигурированию и файл ReadMe

Отсутствует.

      1. Маркировка и упаковка

Отсутствует.

    1. Глоссарий и список сокращений

      1. Глоссарий

Модуль - функционально законченный фрагмент программы, оформленный в виде отдельного файла с исходным кодом

Библиотека - сборник подпрограмм или объектов, используемых для разработки программного обеспечения

JIT Compilation - (англ. Just-in-time compilation, компиляция «на лету»), динамическая компиляция исходного или байт-кода в машинный код, для увеличения производительности, по сравнению с интерпретируемым подходом исполнения.

      1. Список сокращений

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

ПО – программное обеспечениеАрхитектура и системные требования

Архитектура программного продукта

  1. Технический проект

    1. Основные структуры данных

      1. TYPE

struct TYPE

{

int id; //Уникальный идентификатор типа

int size; //Размер типа ( в байтах)

};

typedef std::map<std::string, TYPE> TYPES; //Ассоциативный массив типов со строковым ключом

      1. VAR

struct VAR

{

int address; //Адрес переменной в памяти

TYPE type; //Тип переменной

int count; //Количество переменных (задумка для массивов)

};

typedef std::map<std::string, VAR> VARS; //Ассоциативный массив переменных со строковым ключом

      1. E

enum E

{

LABEL_RET,GOTO_RET,//Метка выхода из функции и метка прыжка к ней

LABEL_BEGIN_IF,GOTO_BEGIN_IF,//Метка начала истиной альтернативы и метка прыжка к ней

LABEL_END_IF,GOTO_END_IF,//Метка конца истиной альтернативы и метка прыжка к ней

LABEL_BEGIN_ELSE,GOTO_BEGIN_ELSE,//Метка начала ложной альтернативы и метка прыжка к ней

LABEL_END_ELSE, GOTO_END_ELSE, //Метка конца ложной альтернативы и метка прыжка к ней

LABEL_BEGIN_WHILE, GOTO_BEGIN_WHILE, //Метка начала цикла и метка прыжка к ней

LABEL_END_WHILE, GOTO_END_WHILE, //Метка конца цикла и метка прыжка к ней

LABEL_BEGIN_AND, GOTO_BEGIN_AND, //Метка начала логического «И» и метка прыжка к ней

LABEL_END_AND, GOTO_END_AND, //Метка конца логического «И» и метка прыжка к ней

LABEL_BEGIN_OR, GOTO_BEGIN_OR, //Метка начала логического «ИЛИ» и метка прыжка к ней

LABEL_END_OR, GOTO_END_OR, //Метка начала логического «ИЛИ» и метка прыжка к ней

LABEL_TRUE, GOTO_TRUE, //Метка истины выражения и метка прыжка к ней

LABEL_FALSE, GOTO_FALSE//Метка лжы выражения и метка прыжка к ней

};

struct REPLACE

{

E type; //Тип метки

int address; //Адрес замены метки

};

typedef std::vector<REPLACE> REPLACES;

      1. FUNCTION

struct FUNCTION

{

char* m_binaryCode;

char* m_binaryPointer;

char* beginCode;

char* endCode;

int m_varmemory; //Размер памяти для локальных переменных

TYPE type; //Тип возвращаемого значения

VARS Vars; //Локальные переменные функции

VARS Args; //Аргументы функции

REPLACES m_Replaces; //Замены (требуются для компиляции)

};

typedef std::map<std::string, FUNCTION> FUNCTIONS;

      1. MODULE

struct MODULE

{

char* m_binaryGlobalVar;

char* m_binaryCode;

char* m_binaryPointer;

char* m_sourceCode;

char* m_sourcePointer;

TYPES m_Types; //Типы определенные в модуле

VARS m_GlobalVars; //Глобальные переменные модуля

FUNCTIONS m_Functions; //Функции модуля

REPLACES m_CallReplaces; //Замены (требуются для компиляции)

int m_GlobalVars_MemorySize; //Размер памяти глобальных переменных

};

typedef std::vector<MODULE*> MODULES;

      1. CORE

class CORE

{

private:

int InitModule(MODULE*);//Инициализация модуля(отчистка переменных)

int LoadSourceCode(MODULE*,char* file); //Загрузка скрипта в модуль

int Parse(MODULE*);//Поиск функций и глобальных переменных

int Preprocess(MODULE*);//Предварительная обработка кода

int Compile(MODULE*);//Компиляция модуля

int CompileFunction(MODULE*,FUNCTION*);//Компиляция функции

long CompileBlock(MODULE*, FUNCTION*);//Компиляция блока

long CompileExpression(MODULE*, FUNCTION*, int level); //Компиляция выражения

//

char* nextStr(char* code, char* str);

int isSpecialChar(char ch);

TYPE getType(MODULE*);

long getName(MODULE*, char* pRes);

VAR* getVar(MODULE* module, FUNCTION* function, char* name);

long getIntNumber(MODULE*, int* pRes);

public:

//Members

MODULES m_Modules; //Набор модулей, загруженных в ядро

//Functions

MODULE* LoadModule(char* name); //Загрузка модуля из файла

};

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]