77369

РАЗРАБОТКА КОМПИЛЯТОРА ДЛЯ ЯЗЫКА ПРОГРАММИРОВАНИЯ RIDE.L

Научная статья

Информатика, кибернетика и программирование

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

Русский

2015-02-02

24 KB

0 чел.

РАЗРАБОТКА КОМПИЛЯТОРА ДЛЯ ЯЗЫКА ПРОГРАММИРОВАНИЯ RIDE.L

М.О. Бахтерев, В.В. Косенко

ИММ УрО РАН, УрГУ, Екатеринбург

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

  1.  Не усложнять процесс разработки.
  2.  Максимально эффективно использовать ресурсы вычислителя.

С первой лучше справляются динамические языки программирования, со второй - языки с классической архитектурой компиляторов. Универсального инструмента нет, и работы по поиску подходящей концепции активно проводятся (переработанные версии Fortran, C++, Haskell, появление Go [1]).

Вопрос актуален, поэтому с нашей стороны была разработана идея императивного языка RiDE.L (оригинальное название 7fa2.L) [2,3], согласно которой, используя статическую типизацию и перегрузку операторов для описания семантики синтаксических конструкций языка на самом языке, можно получать эффективный машинный код. Данная идея является развитием метапрограммирования (Lisp, Nemerle) и сводится к динамическому выстраиванию окружения, состоящего из типов, переменных и операторов. Всё это легко укладывается в границы простого в реализации и компактного компилятора, что особенно полезно при портировании языка на специализированные вычислители и новые типы процессоров.

За основу взят язык алгебраических выражений:

  •  упрощенная лексика языка C (без ключевых слов и одним типом скобок);
  •  операторный синтаксис с сокращенной таблицей приоритетов.

Семантика строится на основе трех языковых примитивов: специального оператора asm, двух связывающих операторов:

  •  ; - бинарный оператор c пустой реализацией, определенный для всех типов;
  •  , - не совсем оператор, управляет арностью остальных операторов (например: (a,b)+c – трехоперандное сложение, (a,b)+(c,d) - четырех).

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

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

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

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

  •  код реализация оператора подставляется по месту обращения;
  •  код определяется следующим образом:

если выражение - это оператор

код фрагментов (при проходе слева направо) + реализация оператора

иначе (атомарное выражение)

пусто.

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

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

По окончанию компиляции каждое выражение получит тип, ссылку на значение и ассемблерный код. Код корневого выражения будет передан далее back-end’у.

На текущий момент закончена вторая версия front-end’а компилятора и RiDE.L-программа-библиотека, реализующая привычное определение типов, переменных и операторов, а так же такие конструкции как if-else, for-break-continue и switch-case-default-break. Первая версия была написана в виде с использованием perl и javascript под Windows для проверки и корректировки нашей теории. Новая версия написана на C#, она значительно быстрее, работает как в Windows (.Net), так и в Linux (Mono), а код стал намного понятнее.

Сейчас ведется разработка оптимизатора и генератора кода. Возможно первым целевым языком для полноценного RiDE.L-компилятора станет MSIL.

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

  1.  http://golang.org/
  2.  Бахтерев М.О. Язык программирования 7fa2.L // Третья международная конференция "Информационно-математические технологии в экономике, технике и образовании" г.Екатеринбург, 20-22 ноября 2008 г. Тезисы докладов. Стр.215-216.
  3.  Бахтерев М.О., Косенко В.В. Язык программирования RiDE.L // Тезисы 11-го Международного семинара "Супервычисления и Математическое моделирование", РФЯЦ-ВНИИЭФ, Саров, 2009, с. 25-26.


 

А также другие работы, которые могут Вас заинтересовать

26882. Крестцовые спинномозговые нервы. Крестцовое сплетение 2.6 KB
  Крестцовые спинномозговые нервы эти нервы делятся на передние и задние ветви при этом передние ветви выходят на тазовую поверхность крестца в полость таза задние на дорсальную его поверхность. Задние ветви в свою очередь делятся на внутренние и наружные. Внутренние ветви иннервируют нижние сегменты глубоких мышц спины и оканчиваются кожными ветвями в области крестца ближе к средней линии. Наружные ветви I III крестцовых спинномозговых нервов направляются книзу и имеют название средних кожных нервов ягодиц пп.
26883. Седалищный нерв 5.99 KB
  Седалищный нерв Седалищный нерв п. Он и ннервирует всю конечность за исключением некоторых ягодичных мышц сгибателей тазобедренного сустава и разгибателей коленного сустава. Проходит позади тазобедренного сустава и делится на большеберцовый и малоберцовый нервы идущие в области бедра вместе по медиальной поверхности двуглавой мышцы бедра почти до коленного сустава. Малоберцовый нерв п.
26884. Морфофункциональная характеристика черепно-мозговых нервов 4.77 KB
  морфофункциональная характеристика черепномозговых нервов Каждый отдел головного мозга человека исторически связан с конкретными дистантными анализаторами хеморецепторами фоторецепторами тактильными или слуховыми системами анализа внешней и внутренней среды организма. Как правило рецепторы расположены на некотором расстоянии от мозга и соединены с ним посредством нервов. Черепные нервы устаревшее название черепномозговые нервы двенадцать пар нервов выходящих из мозгового вещества в основании мозга и иннервирующих структуры...
26885. V-я и VI 1-я пары черепно-мозговых нервов. Общая характеристика, ветвление 2.98 KB
  Двенадцать пар черепномозговых нервов принято делить на 3 чувствительных I пара обонятельный U пара зрительный и VIII пара преддверноулитковый 5 двигательных III пара глазодвигательный IV пара блоковый VI пара отводящий XI пара добавочный и XII пара подъязычный и 4 смешанных V пара тройничный VII пара лицевой IX пара языкоглоточный и X пара блуждающий; в состав последних входят чувствительные двигательные и вегетативные волокна. 5 пара тройничный нервn.
26886. Общие закономерности строения вегетативной нервной системы 2.13 KB
  В симпатической нервной системе преганглионарные нейроны находятся в промежуточном боковом роге спинного мозга от верхнегрудного до среднепоясничного отдела Т1ТЗ. Преганглионарные парасимпатические нейроны залегают в стволе мозга и крестцовом отделе спинного мозга. Постганглионарные нейроны находятся в вертебральных и превертебральных ганглиях в симпатической системе а в парасимпатической они расположены в непосредственной близости от стенки органа который они иннервируют.
26887. Симпатическая часть вегетативной нервной системы. Солнечное сплетение 4.18 KB
  Симпатическая нервная система делится на центральную расположенную в спинном мозге и периферическую включающую многочисленные соединённые друг с другом нервные ветви и узлы. По своему ходу симпатические волокна отделяются от двигательных соматических и далее в виде белых соединительных ветвей вступают в узлы пограничного симпатического ствола. В состав солнечного сплетения входят правый и левый чревные узлы непарный верхний брыжеечный узел большой и малый внутренностные нервы и многие другие которые отходят от узлов в разные стороны...
26888. Парасимпатическая часть вегетативной нервной системы 4.21 KB
  Преганглионарные волокна отходят от центров в составе черепномозговых или спинномозговых нервов. От центров расположенных в среднем мозге преганглионарные волокна доходят до ресничного узла а от него идут постганглионарные волокна к глазу где разветвляются в сфинкторе зрачка и ресничной мышце.Слезоотделительныйпреганглиолярные волокна доходят до клинонёбного ганглия постганглиолярные волокна достигают слёзных желёз желёз неба и носовой полости; 2.Краниальныйоральный слюноотделительный – преганглиолярные волокна доходят до...
26889. Блуждающий нерв 4.81 KB
  Направляясь латерально и вниз он покидает череп через переднюю часть яремного отверстия вместе с языкоглоточным и добавочным нервами располагаясь между ними. В области яремного отверстия блуждающий нерв утолщается за счёт верхнего узла лат. ganglion superius а немного ниже через 1015 см имеется ещё один узел несколько больших размеров лат. Спускаясь ниже блуждающий нерв в области шеи ложится на переднюю заднюю поверхность внутренней яремной вены лат.