Введение 4
1. Обзор 6
1.1. Обзор реализации транслятора РуСи 6
1.1.1. Вспомогательные таблицы транслятора 6
1.1.2. Лексический анализатор 8
1.1.3. Синтаксический анализ 9
1.1.4. Генерация кода и исполнение 10
1.2. Структуры в языке Си 10
1.2.1. Объявление структур 11
1.2.2. Работа со структурами 12
2. Описание решения 14
2.1. Модификация лексического анализатора в трансляторе
РуСи 14
2.2. Модификация синтаксического анализатора в транслято¬
ре РуСи 14
2.3. Изменение таблицы видов и видозависимого анализа . . 15
2.4. Изменения генерации кода виртуальной машины 18
2.4.1. Команда SELECT 19
2.4.2. Команды COPY и COPYAT 20
2.4.3. Изменение в хранении массива в памяти 21
Заключение 23
Список литературы 24
В настоящее время давно стало очевидным, что программировать в
машинных кодах или в кодах ассемблера не слишком удобно, особенно
для начинающих программистов. В современных языках программирования высокого уровня используются операторы языка – конструкции, записанные в более человеческом виде. Программировать на таких
языках прозоляют трансляторы[5] – программы, которые преобразуют
входную программу, написанную на языке высокого уровня, в машинный код, либо в коды языка более низкого уровня. В настоящее время
большинство языков программирования поддерживают только английский язык, то есть в тексте программы, включая ключевые слова, идентификаторы переменных и сообщения об ошибках используются только
английские буквы.
Транслятор РуСи разрабатывается на кафедре системного программирования математико-механического факультета. Транслятор РуСи
может быть полезен для школьников, которые не знают английский
язык, так как транялятор РуСи дает возможность программировать
на всем известном языке C [1], используя русские буквы для ключевых
слов языка и именования переменных, ошибки так же выводятся на
русском языке.
РуСи имеет ряд внутренних особенностей и преимуществ перед обычным языком С, при этом является его подмножеством. РуСи написан
на языке C[2], что дает возможность реализовать его более оптимально и быстро, и, кроме того, использовать на любых платформах. РуСи
транслирует входную программу в коды собственной виртуальной машины, кроме того, есть возможность транслировать в коды LLVM [6].
В РуСи уже реализовано большинство конструкций языка C: работа с
переменными, массивами, указателями и функциями. Но, ранее, в РуСи можно было использовать только базовые типы, такие как float,
int, char. Чтобы приблизить язык транслятора к языку С и увеличить
подмножество конструкций, было решено расширить транслятор и реализовать на нем работу со структурами[3].
4В программировании иногда бывает удобно использовать одно имя
для обозначения группы переменных, когда эти переменные имеют общее назначение. Структуры предоставляют возможность хранения некоторого набора различных значений, объединенных одним общим названием. Это увеличивает модульность программы и компактность программного кода. Структуры, как правило, используют тогда, когда в
коде программы имеется большое количество родственных данных и их
нужно сгруппировать вместе.
По этим причинам была поставлена задача: реализовать обработку
структур в трансляторе РуСи в соответствии с тем, как они работают
в языке С. Более подробно, необходимо реализовать работу с переменными структурного типа, работу с массивами структур и указателями
на структуры, возможность создания функций, которые возвращают
структуры или принимают структуру в качестве аргумента, то есть,
все возможности базовых типов языка. Для достижения этой цели были поставлены следующие задачи:
• модифицировать лексический анализатор в соотвестствии с поставленной задачей;
• модифицировать синтаксический анализатор;
• внести изменения в видозависимый анализ;
• модифицировать генерацию кода виртуальной машины.
Цель работы - реализация структур в трансляторе РуСи была достигнута, при этом следующие задачи были выполнены:
• в лексический анализ добавлены новые лексемы и ключевые слова;
• в синтаксический анализ добавлена обработка новых конструкций;
• были внесены значительные изменения в видозависимый анализ,
переработана таблица видов;
• были внесены изменения в генерацию кода и добавлены новые
команды виртуальной машины.
Выполнение данной работы увеличило подмножество языка Си, которое может обрабатывать транслятор РуСи. Таким образом, теперь
транслятор может обрабатывать почти весь язык C, кроме арифметики над указателями и объединений (union), которые реализовывать не
планируется. Кроме того, были убраны ограничения на размерность
массивов и сделаны другие изменения в системе типов, что позволило
сделать систему типов более гибкой и расширить видозависимый анализ.
[1] Kernighan Brain W., Ritchie Dennis M. The C programming language / Ed. by ATT Bell Laboratories. - Murray Hill, New Jersey : PRENTICE HALL, Englewood Cliff, 1978.
[2] Lee Jeff. C grammar. — 1985. — URL: https://www.lysator.liu.se/ c/ANSI-C-grammar-y.html.
[3] Mike Banahan Declan Brady Mark Doran. The C Book.— 1991.—
URL: http://publications.gbdirect.co.uk/c_book/chapter6/
structures.html.
[4] Wikipedia. Recursive descent parser.— 2012.— URL: https://en. wikipedia.org/wiki/Recursive_descent_parser.
[5] Wikipedia. Translator.— 2012.— URL: https://en.wikipedia.org/ wiki/Translator_(computing).
[6] Болотов Сергей. Создание транслятора из РуСи в LLVM IR. — 2015.— URL: http://se.math.spbu.ru/SE/YearlyProjects/ spring-2015/YearlyProjects/2015/371/371-Bolotov-report.pdf (дата обращения: 30.06.2015).