Научная статья на тему 'Кроссплатформенный компилятор'

Кроссплатформенный компилятор Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
244
25
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
КОМПИЛЯТОР / ГРАММАТИКА / КОМАНДА / COMPILER / GRAMMAR / COMMAND

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Караваева Ольга Владимировна, Тимин Владислав Сергеевич

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

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Кроссплатформенный компилятор»

17. Nakamura H., 2009. Cooling Fan Model for Thermal Design of Compact Electronic Equipment: Improvement of Modeling Using PQ Curve. ASME 2009 InterPACK Conference, Volume 2.

18. Ayoub R., Nath R. and Rosing Т. "JETC: Joint energy thermal and cooling management for memory and CPU subsystems in servers," in High Performance Computer Architecture (HPCA), 2012 IEEE 18th International Symposium on. Pp. 1-12. IEEE, 2012.

19. Buyya R., Ranjan R. and Calheiros R.N. "Modeling and simulation of scalable Cloud computing environments and the CloudSim toolkit: Challenges and opportunities," in High Performance Computing and Simulation, 2009. HPCS'09. International Conference on. Pp. 111. IEEE, 2009.

КРОССПЛАТФОРМЕННЫЙ КОМПИЛЯТОР Караваева О.В.1, Тимин В.С.2 Email: [email protected]

1Караваева Ольга Владимировна - старший преподаватель; 2Тимин Владислав Сергеевич - студент, кафедра электронных вычислительных машин, Вятский государственный университет, г. Киров

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

CROSS-PLATFORM COMPILER 12 Karavaeva O.V. , Timin V.S.

1Karavaeva Olga Vladimirovna - Senior Teacher;

2Timin Vladislav Sergeevich - Student, DEPARTMENT OF ELECTRONIC COMPUTERS, VYATKA STATE UNIVERSITY, KIROV

Abstract: the rapid development of computer technology and, in particular, of operating systems allows an ever wider range of users to expand the use of the capabilities of a personal computer. But for professional development of system applications you need deep knowledge. Teaching students in modern conditions involves certain difficulties when it is required to consider the compilation processes that are performed at the lowest level. In the framework of this article, we will solve this problem using a cross-platform compiler running on a virtual machine. Keywords: compiler, grammar, command.

УДК 004.431.4

В связи с развитием вычислительной техники появилось множество средств, упрощающих и автоматизирующих разработку программного обеспечения (ПО). Но знание основных принципов работы компьютера всё также важно для разработки системного ПО,

36

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

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

Ассемблер (Assembly) — язык программирования, понятия которого отражают архитектуру электронно-вычислительной машины. Язык ассемблера обеспечивает доступ к регистрам, указание методов адресации и описание операций в терминах команд процессора. Язык ассемблера может содержать средства более высокого уровня абстракции: встроенные и определяемые макрокоманды, соответствующие нескольким машинным командам, автоматический выбор команды в зависимости от типов операндов, средства описания структур данных. Главное достоинство языка ассемблера — «приближенность» к процессору, который является основой используемого программистом компьютера [1].

Для новичка разработка на реальных ассемблерных языках может быть довольно сложной: множество команд, адресаций, назначение регистров и т.д. Перед тем, как перейти к разработке, необходимо ознакомиться с большим объемом информации. Программы на языке ассемблера являются платформозависимыми, а их отладчики различны для разных ОС и архитектур компьютера. Также при работе с реальными ассемблерными языками процесс компиляции скрывается, то есть, нет возможности узнать подробности о работе компилятора. Совокупность этих причин является серьезной проблемой при изучении темы «Ассемблерные языки программирования».

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

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

Рис. 1. Схема взаимодействия функциональных блоков

Любая машинная команда имеет определенный формат, поэтому первостепенной задачей является разработка такого формата. Для удобства выбран фиксированный размер команды длиной 40 бит (5 байт). Старший байт хранит код операции, следующий байт хранит типы адресаций для операндов, а последние три байта хранят значение самих операндов. Машинная команда имеет вид, представленный на рисунке 2.

39 32 30 28 26 24 23 16 15 S 7 0

Код команды Значение 1-го операнда Значение 2-го оп еранда Значение 3-го операнда

Подтипа 1-го Код типа 2-го Подтипа 3-го операнда операнда операнда

Рис. 2. Машинная команда

Использование фиксированного размера машинной команды принято для упрощения перевода исходного кода на языке R8 в байт-код. Преимущество данного подхода заключается в более простом поиске смещения определённой команды, а недостаток -избыточное выделение памяти, однако в данном случае этот расход не критичен.

Любой язык, включая и язык ассемблера, должен иметь свою грамматику. Поэтому следующим шагом является разработка грамматики для языка, который будет обрабатываться компилятором. За основу взят язык ассемблера R8, к которому добавлены возможности вызова процедур, добавление комментариев и импортирование модулей.

Разработанная грамматика в форме Бэкуса - Наура представлена на рисунке 3:

<ид-команд-3> ::= «and» | «oí» «аадф> | <шог» чщ;>) | | | «add»|«sub»

<команда-3> ::= <ид-коыанд-3>: <оп-еранд>; «.». <операнд>= <о>: <операнд-6ез-числа> <коыанда> ::= «ге1>:> <коыанда-1> | <команда-2> <команда-5> <коыанда-переход>

Рис. 3. Грамматика в форме Бэкуса - Наура

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

import something_l ;daDASKLJ import import something_2;

Рис. 4. Пример файла с исходным кодом

Формат объектного файла схож с форматом исполняемого. Пример содержимого исполняемого файла представлен на рисунке 5.

1 2 3 4 5

0а шш т ш т 0а 26 00 ff 07 0а 0Ь 01 02 03 0а

28 02 04 02 fld 03 07 1е 00 04 34 03 01 03 0е 20

50 00 00 01 20 02 00 00 00 30 01 00 00 02 24 01

02 00 0f 00 00 00 00 00 30 02 00 00 0с 08 04 46

00 0а 00 01 02 03 0е 20 00 00 00 0t 00 00 00 00

00 30 01 00 00 0d 08 01 5а 00 0f 00 00 00 00 37 6

Рис. 5. Пример содержимого исполняемого файла

На данном рисунке цифрами обозначено:

1 - код команды. Код «0а» соответствует команде ADD.

2 - коды типов операндов. 0b16 = 000010112. Первые 2 бита второго байта команды не используются. Вторые 2 бита соответствуют типу первого операнда, третьи 2 бита -второму, последние 2 бита - третьему. Соответственно код типа первого операнда «00» -прямая регистровая адресация; код типа второго операнда «10» - непосредственная адресация; код типа третьего операнда «11» - прямая адресация.

3-5 - сами операнды. Значение первого операнда равно 1, значение второго - 2, значение третьего - 3.

6 - адрес точки входа (в данном примере 3716).

7 - первая выполняемая команда (точка входа).

Отладочный файл - это файл, содержащий информацию для отладки программы. Он содержит текстовую информацию о каждом файле с исходным кодом. Информация о файле с исходным кодом состоит из названия файла (без расширения) и набором кортежей из 2 значений. Первое значение в кортеже обозначает номер строки в файле с исходным кодом (указываются только те строки, на которых присутствуют команды). Второе значение указывает на наличие точки останова (true-присутствует, false-отсутствует).

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

Пример содержимого отладочного файла представлен на рисунке 6.

[test]

False 7 False illFalsel 3 S False

9 True

10 False

12 False

13 False

14 False

15 False

16 False

20 False

21 False

22 True

24 False

25 False

s"omething_l|

4 False

5 False 7 False

somet hing_2|

sbmet l~iing_3|

Рис. 6. Пример содержимого отладочного файла

На данном рисунке цифрами обозначено:

1 - имена файлов с исходным кодом без расширения «.r8s». За каждым из них идёт описание команд, содержащихся в файле. У пустых файлов информация о командах отсутствует

2 - номер строки, на которой находится команда

3 - наличие точки останова

В результате разработки был получен веб-компилятор, выполняющий следующие функции:

- компиляция отдельных файлов и создание объектных модулей;

40

- объединение объектных модулей и создание исполняемого файла;

- создание файла с отладочной информацией;

- обработка возможных ошибок;

- выполнение скомпилированных программ, написанных на языке R8;

- возможность просмотра состояния стека, регистров и памяти во время выполнения;

- обработка возможных ошибок.

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

Список литературы /References

1. Как писать на ассемблере в 2018 году. [Электронный ресурс]. Режим доступа: https://habr.com/post/345748/ (дата обращения: 30.07.2018).

2. Kris Kaspersky Тонкости дизассемблирования // Электронная библиотека ModernLib.Net [Электронный ресурс]. Режим доступа: http://modernlib.net/books/kaspersky_kris/tonkosti_dizassemblirovaniya/read/ (дата обращения: 14.04.2018).

i Надоели баннеры? Вы всегда можете отключить рекламу.