Модульный транслятор с языка ЛЯПАС | Прикладная дискретная математика. Приложение. 2016. № 9.

Модульный транслятор с языка ЛЯПАС

Сообщается о разработке модульного транслятора с языка программирования ЛЯПАС. Цель разработки - упрощение создания транслятора с ЛЯПАСа, написанного на ЛЯПАСе. Процесс трансляции разделяется на этапы, за каждый из которых ответствен один из модулей транслятора. Модули выполнены в виде исполняемых программ и обмениваются данными с помощью файлов. Для представления промежуточных результатов работы модулей используются вспомогательные языки программирования.

Modular translator from lyapas.pdf Язык программирования ЛЯПАС [1] возрождается в Томском государственном университете силами кафедры защиты информации и криптографии с целью иметь высокопроизводительную доверенную вычислительную систему для создания доверенного ПО, разработки и исследования криптографических алгоритмов, управления сетевым оборудованием. Главные компоненты создаваемой системы - транслятор с ЛЯ-ПАСа [2] и ОС ЛЯПАС [3]. В [3] описаны этапы создания ОС ЛЯПАС, после завершения которых появляется возможность разработки и компиляции ОС ЛЯПАС и прикладных программ для неё в самой ОС ЛЯПАС. Для выполнения последних двух этапов требуется транслятор с ЛЯПАСа, написанный на ЛЯПАСе. Модульный транслятор с языка ЛЯПАС - вспомогательное средство для создания требуемого. Создание транслятора с ЛЯПАСа на ЛЯПАСе - трудоёмкая задача, требующая решения множества отдельных небольших проблем. Предлагается реализация транслятора, разделённого на модули, каждый из которых может быть написан на любом языке программирования независимо от других модулей. Такой транслятор может быть создан изначально, например, на C+-+ и переписан по частям на ЛЯПАСе. В качестве способа связи модулей выбрана передача данных через файлы в формате, не зависящем от языка реализации модулей. 1. Архитектура транслятора Транслятор t : X1 -> Xn+1 состоит из модулей mi : Xi -> Xi+1, таких, что t = m1 о 0 m2 о ... о mn; Xi - входной язык модуля mi и выходной язык модуля mi-1. Входной язык X1 транслятора t - ЛЯПАС, выходной язык Xn+1 -язык ассемблера; языки Xi, 1 G {2,... ,n}, используются для представления промежуточных результатов трансляции; X1,..., Xn+1 называются языками транслятора t; X2,..., Xn называются внутренними языками транслятора t. Возможно Xi = Xj при i = j, например, входной и выходной языки оптимизирующего модуля могут совпадать. Модули реализованы в виде исполняемых программ, каждая из которых может быть написана на любом языке программирования, независимо от других модулей. Обмен данными между модулями осуществляется с помощью временных файлов, содержащих программы на внутренних языках транслятора. Поскольку программы на внутренних языках транслятора анализируются, в основном, модулями транслятора и их разработчиками, эти программы можно представить в виде, лёгком для разбора машиной, и только во вторую очередь - человеком. Дополнительное требование к такому способу представления программ - наличие библиотек для разбора и генерации данных этим способом для большинства существующих языков программирования. В качестве такого способа представления выбран JSON [4]; в качестве библиотек для работы с JSON на языках C и C+-+ выбраны [5] и [6] соответственно. На этапе, когда модули транслятора переписываются на ЛЯПАСе, необходима библиотека, конвертирующая программы, представленные с помощью JSON, в программы, представленные с помощью типов данных ЛЯПАСа - логических и символьных комплексов и чисел. Эта библиотека для представления внутренних языков транслятора (ПВЯТ) реализуется как обёртка над библиотекой для формата JSON на C. Такая технология добавления библиотек C в ЛЯПАС уже опробована на работе с файлами и сокетами в ОС GNU/Linux. После того, как все модули будут переписаны на ЛЯПАСе, необходимость в формате JSON отпадёт и модули смогут обмениваться программами, представленными с помощью комплексов и чисел. Промежуточные результаты трансляции можно будет записывать во временные файлы в бинарном виде с помощью вспомогательной библиотеки, подпрограммы которой имеют те же заголовки, что и подпрограммы библиотеки ПВЯТ. Примером такой архитектуры модульного транслятора с ЛЯПАСа частично послужил транслятор CompCert [7] с C, обладающий формальным (проверяемым машиной) доказательством корректности своей работы. В будущем планируется разработка формально верифицированного транслятора с ЛЯПАСа по образцу CompCert. Одной из задач, необходимых для достижения этой цели, является создание модульного транслятора, так как формальное доказательство упрощается разбиением его на части, соответствующие модулям. Другая важная задача для достижения указанной цели - создание операционной семантики ЛЯПАСа [8]. 2. Языки транслятора В настоящий момент в модульном трансляторе предусмотрены одиннадцать языков. Первый (входной язык транслятора)-ЛЯПАС. Одиннадцатый (выходной язык транслятора) - язык ассемблера. Внутренние языки модульного транслятора не имеют собственных имён, они пронумерованы числами от 2 до 10. Язык 2. Программы на языке 2 представляют собой программы на ЛЯПАСе с добавленным к ним именем файла, в котором хранится данная программа. Это необходимо для вывода сообщений об ошибках на следующих этапах трансляции. Язык 3. Программы на языке 3 представляют собой результат лексического анализа программы на ЛЯПАСе - последовательность токенов. Помимо типа и значения лексемы, в токенах хранится информация о нахождении лексемы в исходной программе на ЛЯПАСе: имя файла, номер строки и символа в строке. Транслятор из языка 2 в язык 3 реализуется на языке C с использованием генератора flex [9]. Язык 4. Программы на языке 4 представляют собой результат синтаксического анализа программы - дерево разбора. Узлы дерева разбора, помимо символов грамматики, содержат информацию об их нахождении в исходной программе на ЛЯПАСе. Транслятор из языка 3 в язык 4 реализуется на языке C с использованием генератора bison [10]. Язык 5. Язык 5 представляет собой язык абстрактной одноадресной машины, каждый регистр общего назначения которой соответствует переменной ЛЯПАСа. Каждый вызов подпрограммы на ЛЯПАСе создаёт в машине новый набор регистров. Копирование входных и выходных параметров выполняется абстрактной машиной автоматически. Поскольку ЛЯПАС изначально создавался для компиляции в язык одноадресной машины Урал-1 [1], язык 5 является наиболее простым выходным языком для трансляции с ЛЯПАСа из всех следующих языков модульного транслятора. Транслятор с языка 4 в язык 5 реализуется на языке C+-+. Язык 6. Язык 6 отличается от языка 5 тем, что представляет собой язык абстрактной двухадресной машины. Переход от одноадресной к двухадресной машине облегчает явную работу со стеком на следующих этапах трансляции и помогает более эффективно производить оптимизацию получаемой программы. Транслятор с языка 5 в язык 6 реализуется на языке C+-+. Язык 7. Язык 7 отличается от языка 6 явной работой со стеком при вызове подпрограмм. Механизм композиции функций, описанный в [2], реализуется транслятором с языка 6 в язык 7. Язык 8. Язык 8 отличается от языка 7 наличием ограниченного количества регистров общего назначения и неограниченным количеством пронумерованных областей памяти, с которыми регистры могут обмениваться значениями. Набор регистров соответствующей абстрактной машины - один для всех вызовов всех подпрограмм. Транслятор с языка 7 в язык 8 производит отображение переменных ЛЯПАСа, каждая из которых до сих пор хранилась в собственном регистре абстрактной машины, в ограниченный набор регистров новой абстрактной машины. В необходимых местах значения регистров сохраняются в памяти для последующего восстановления. Количество регистров абстрактной машины для языка 8 - параметр. Это необходимо для обеспечения независимости транслятора в язык 8 от конкретной аппаратной архитектуры. Язык 9. Язык 9 отличается от языка 8 наличием операций захвата и освобождения памяти. Адресная арифметика в данном языке запрещена. Операции с комплексами производятся в явном виде, в отличие от предыдущих языков, в которых абстрактная машина имела элементарные операции для работы с комплексами. Язык 10. Язык 10 отличается от языка 9 наличием адресной арифметики при работе с памятью. Из языка 10 происходит трансляция в язык ассемблера. Производится замена некоторых специальных операций абстрактной машины для языка 10 вызовами заранее подготовленных ассемблерных процедур. 3. Этапы разработки Разработка модульного транслятора с ЛЯПАСа разделяется на три этапа. 1) На первом этапе языки реализации модулей - Си C+-+, формат представления внутренних языков программирования - JSON. 2) На втором этапе производится перенос модулей на язык ЛЯПАС. Языки реализации модулей - С, С+-+ и ЛЯПАС, формат представления промежуточных данных - JSON. На этом этапе требуется библиотека ПВЯТ для модулей на ЛЯПАСе. 3) На третьем этапе все модули переписаны на ЛЯПАСе. Формат JSON становится ненужным. Библиотека ПВЯТ модифицируется так, что она записывает в файлы данные не в формате JSON, а напрямую - комплексы и целые числа. На этом этапе производится оптимизация транслятора и его перекомпиляция с помощью предыдущей версии этого же транслятора. Заключение В настоящий момент разработка модульного транслятора находится на первом этапе. Создана цепочка модулей, транслирующая исходную программу на ЛЯПАСе в язык 5. Ведётся разработка модуля, переводящего программу с языка 5 в язык 6. На втором этапе планируется использование существующего монолитного транслятора с ЛЯПАСа, разработанного в ТГУ, который используется в настоящий момент [3].

Ключевые слова

ЛЯПАС, язык программирования, операционная система

Авторы

ФИООрганизацияДополнительноE-mail
Стефанцов Дмитрий АлександровичТомский государственный университетстарший преподаватель кафедры защиты информации и криптографииd.a.stefantsov@isc.tsu.ru
Сафонов Вадим ОлеговичТомский государственный университетстудент кафедры защиты информации и криптографииvsaffonov.1115@gmail.com
Першин Владислав ВладимировичТомский государственный университетстудент кафедры защиты информации и криптографииv.pershin.93@gmail.com
Гречнев Сергей ЮрьевичТомский государственный университетстудент кафедры защиты информации и криптографииsgrechnev@gmail.com
Томских Павел АлександровичТомский государственный университетстудент кафедры защиты информации и криптографииpavlic148@gmail.com
Всего: 5

Ссылки

Торопов Н. Р. Язык программирования ЛЯПАС jj Прикладная дискретная математика. 2009. №2. С. 9-25.
Гречнев С.Ю., Стефанцов Д. А. Модификация ЛЯПАСа для разработки ОС jj Прикладная дискретная математика. Приложение. 2015. №8. С. 129-131.
Стефанцов Д. А., Томских П. А. Разработка операционной системы на языке ЛЯПАС jj Прикладная дискретная математика. Приложение. 2015. №8. С. 134-135.
JSON. ECMA-404 The JSON Data Interchange Standard. http://www.json.org/. 2016.
Jansson: C library for encoding, deconding and manipulating JSON data. https://github. com/akheron/jansson. 2016.
Jsoncpp: A C++ library for interacting with JSON. https://github.com/ open-source-parsers/jsoncpp. 2016.
CompCert. Compilers you can formally trust. http://compcert.inria.fr/. 2016.
Жуковская А. О., Стефанцов Д. А. Операционная семантика ЛЯПАСа // Прикладная дискретная математика. Приложение. 2015. №8. С. 131-132.
flex: The Fast Lexical Analyzer. http://flex.sourceforge.net/. 2016.
GNU Bison. A general-purpose parser generator. https://www.gnu.org/software/bison/. 2016.
 Модульный транслятор с языка ЛЯПАС | Прикладная дискретная математика. Приложение. 2016. № 9.

Модульный транслятор с языка ЛЯПАС | Прикладная дискретная математика. Приложение. 2016. № 9.