В настоящее время существует множество различных языков программирования. Наряду с распространенными языками, использующимися для промышленной разработки программных продуктов, такими как C, C++, C#, Java, Python и др., и учебными языками, таких как КуМир, Лого или Паскаль, существуют и экспериментальные, а также так называемые эзотерические языки программирования [1]. Они создавались с целью показать какой-либо интересный подход к программированию, а иногда просто ради шутки. Однако эзотерические языки часто имеют своеобразный синтаксис, и ручной перевод из традиционного языка программирования в эзотерический может быть весьма сложным. Один из таких языков – Шекспир (Shakespeare) [2]. Он интересен тем, что программы на этом языке похожи на литературные произведения [3]. Тем не менее, этот язык является Тьюринг-полным, то есть на нём можно выразить любой алгоритм.
Цель данной работы – создать систему трансляции для перевода текстов на на различных языках программирования (в том числе и эзотерических) из одного языка в другой, поддерживающую обратимую трансляцию для языков высокого уровня.
Разработанная система трансляции (Small Compiler Collection, SCC) имеет модульную структуру и напоминает известную систему компиляции GCC [4]. Такой подход позволяет легко добавлять в систему новые языки. Основная идея – хранение всех программ в универсальном внутреннем представлении, использующем абстрактные синтаксические деревья (AST) [5]. Система представляет собой совокупность модулей, позволяющих получать из текста программы дерево AST, и наоборот. Такой способ позволяет для добавления нового языка L всего лишь написать два модуля – фронт-энд (front-end, ответственен за преобразование из данного языка L в AST) и бэк-энд (back-end, ответственен за преобразование из AST в данный язык L) и таким образом получить возможность трансляции из любого высокоуровневого языка L1 в любой высокоуровневый или низкоуровневый язык L2 из имеющихся в коллекции системы. Следует отметить, что GCC позволяет транслировать только с высокоуровневого языка в низкоуровневый, так как при трансляции в GCC теряется часть информации, и поэтому пригоден только для компиляции в машинный код, а не для "перевода" с одного языка высокого уровня на другой.
В ходе работы был разработан стандарт AST (SCC_tree) для внутреннего хранения программ. Для визуализации таких деревьев был разработан независимый модуль [6] на основе программы Dot [7], транслирующий AST в изображение в формате JPEG. Также был написан оптимизатор и линкер для многомодульных программ.
В качестве «стандартного» языка программирования был выбран язык C. На основе его подмножества был создан скриптовый язык высокого уровня (SCC_C). Также был немного переработан язык Shakespeare (SCC_spl) - в него была добавлена поддержка функций, которые отсутствуют в стандартном Shakespeare, при этом удалось сохранить полную обратную совместимость со стандартным языком. Также была сохранена характерная «литературная» стилистика синтаксиса языка.
В качестве языка низкого уровня (ассемблера) был разработан собственный язык для софт-процессора (SCC_asm), реализующий стековые операции, базовую арифметику, условные и безусловный переходы, вызовы функций, работу с памятью, ввод и вывод информации на экран.
Для исполнения программ был разработан программно реализованный софт-процессор стеково-регистровой архитектуры. Также был реализован компилятор из SCC_asm в пригодный для этого процессора код (SCC_exe). Для увеличения скорости исполнения программ был разработан вариант софт-процессора с возможностью JIT-компиляции бинарного кода (SCC_bin), полученного из SCC_asm, в опкоды семейства процессоров Intel 80x86 (32-bit).
Также было написано несколько демонстрационных программ, которые показывают высокую эффективность JIT-компиляции по сравнению с покомандной интерпретацией. Скорость выполнения JIT-компилированого кода была в 2.5 - 3 раза выше.
Работа выполнена на языке C++ (GCC g++ v.4.7.2), в среде CodeBlocks [8], консольные модули написаны для операционной системы Windows, библиотеки разработаны как кроссплатформенные. Исходный код и исполняемые файлы доступны в репозитории автора на GitHub: github.com/discharged-spider/SCC и Google Code: code.google.com/p/scc-small-compiler-collection.
Литература
1. http://en.wikipedia.org/wiki/Esoteric_programming_language
2. http://shakespearelang.sourceforge.net
3. http://shakespearelang.sourceforge.net/report/shakespeare/#sec:hello
4. http://www.gnu.org/software/gcc
5. http://en.wikipedia.org/wiki/Abstract_syntax_tree
6. http://ded32.net.ru/news/2012-09-23-63
7. http://www.graphviz.org/pdf/dotguide.pdf
8. http://www.codeblocks.org
Материалы проекта
Статья
Презентация
Доклад (видео)
Краткая демонстрация работы (видео)
Материалы к демонстрации
Репозиторий проекта: github://discharged-spider/SCC
Скачать установщик SCC
|