Моделирование распознавателей мультисинтаксических языков программирования мультиверсионных систем

ных технологий в обучении, предложенный профессором Л. А. Растригиным. В качестве модели обучения была взята экспоненциальная зависимость вероятности незнания лексической единицы от скорости и времени забывания.

Ключевые слова: информационно-обучающая технология, состояние памяти модели обучаемого, процесс обучения, порция информации, алгоритм обучения.

© Karaseva M. V., 2009

УДК 681.3.006

А. С. Кузнецов

МОДЕЛИРОВАНИЕ РАСПОЗНАВАТЕЛЕЙ МУЛЬТИСИНТАКСИЧЕСКИХ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ МУЛЬТИВЕРСИОННЫХ СИСТЕМ

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

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

Для создания отказоустойчивых программных систем известно множество подходов, использующихся на практике. К их числу относится методология мультиверсион-ного, или Ж-вариантного программирования [1], одной из отличительных черт которой является разработка нескольких версий одного и того же функционального модуля или компонента. В целом данная методология является дополнением к таким способам получения отказоустойчивых систем, как тестирование и верификация программного обеспечения.

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

- языки программирования модулей;

- алгоритмы решения типовых задач;

- средства программирования;

- методы тестирования.

Авторами ряда работ по мультиверсионному подходу отмечается тот факт, что при разработке программного обеспечения важно применение различных языков программирования для оформления вариантов [2] или версий [3] программных модулей, поскольку реализация различных версий модуля на разных языках позволяет уменьшить вероятность появления в версиях однотипных ошибок, связанных с языком.

Процесс создания мультиверсионных программных систем подразумевает их архитектурное разбиение на компоненты и модули, создаваемые независимо друг от друга. Однако нередко возникает необходимость в кодировании этих модулей на разных языках в рамках одного и того же исходного текста, как, например при создании динамических ИТМЬ-страниц с включением кода на язы-

Итак, в рамках одного исходного текста программы могут одновременно использоваться языки со свойствами, различающимися с точки зрения синтаксиса, и, как следствие, генерируемые разными классами грамматик. В связи с этим такие языки можно отнести к классу мультисинтаксических языков (МСЯ).

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

Мультиавтомат с магазинной памятью. В основу системы MuYacc положено устройство распознавания МСЯ в виде мультиавтомата с магазинной памятью (МП-мультиавтомат). При этом каждый вспомогательный анализатор основывается на обычном автомате с магазинной памятью (МП-автомат), который принято описывать семеркой элементов [б]:

P = (Q, S, Г, 8, qo, Z 0, F),

где Q - множество состояний автомата; S - алфавит вход -ных символов; Г - алфавит магазинных символов; 8 -графически и таблично заданная функция переходов;

б2

до - начальное состояние автомата; Е - множество конечных состояний автомата Р; 2о - символ, обозначающий дно магазина.

Функция 5 с тремя аргументами (д - текущим состоянием автомата, а - текущим входным символом или пустой строкой е, а также X - символом на вершине магазина) в качестве результата выдает пару элементов (р, у), где р - новое состояние автомата; у - цепочка магазинных символов, замещающая X на вершине магазина. Если у = е, то магазинный символ снимается. Если у = X, то содержимое магазина не меняется. Например, если у = У2, то X заменяется на 2, а затем У добавляется в магазин.

Для мультиавтомата Ршп1 данный набор расширяется за счет введения трех дополнительных элементов. Таким образом, требуемое абстрактное устройство описывается следующим образом:

Ршп1 =

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

N ___

Множество М = 0 или М = и М,, где М ], = 1, N -

1

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

Аналогично множество 5 с Q также может быть пустым (5 = 0). В общем случае 5 = и 5 , где

5,,, = 1, К - особое состояние из соответствующего множества мощностью К. Количество особых состояний может быть больше либо равно количеству вспомогательных автоматов (К > Ж), поскольку из различающихся особых состояний возможно переключение на один и тот же автомат.

Мультиавтомат считается заданным ошибочно в следующих случаях:

- если количество особых состояний меньше количества вспомогательных автоматов (К < Ж), так как бессмысленно включать в устройство столь ресурсоемкий элемент, ни разу не получая шанса переключиться на него. Однако при желании это ограничение можно снять, зарезервировав, например, один или несколько вспомогательных автоматов для дальнейшего использования;

- если М = 0 , а 5 ^0 , так как тогда исчезает необходимость в выделении особых состояний.

- если М ^0, а 5 = 0 по тем же соображениям, что и в первом пункте.

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

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

В первом случае для этого должны быть указаны номер (неотрицательное целое число 3^) вспомогательного магазинного автомата из множества М и номер особого состояния из множества 8 (./5). В итоге получаем функцию ФпЫешр(у, принимающую пять аргументов и дающую на выходе результат в виде набора из трех элементов:

фпо1ешр1у

где р - новое состояние автомата; у - цепочка магазинных символов; М^ - автомат с номером 3М из множества М.

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

Теперь предположим, что М = 0 . Иначе говоря, в нашем абстрактном устройстве нет никаких вспомогательных автоматов. В этом случае необходимо, чтобы функция переключений ф вела себя точно так же, как функция переходов 5 обычного автомата. В результате получаем функцию Фешр(у, которая при ближайшем рассмотрении отличается от функции переходов лишь своим названием:

фешр^

В общем виде функция переключений ф приобретает вид

ф( q, a, X, Зм, ) =

фш*шр<у (g, a, X, 3М , 35 ) : {P, У, МЗм } ,

ф ешр^у уЬ

если М = 0 и 5 = 0.

Теперь дадим формализованное описание МП-муль-тиавтомата с учетом выражений (2) и (3):

'(Q, 2, Г, 5, до, 2 о, Е, М, 5, ф^,^), еслиМ ^0 и 5 ^0 и |м| <|5|,

Рши1 = <

если М = 0 и 5 = 0,

Ошибка в противном случае.

Эквивалентным для (5), с учетом (4), будет следующее формальное определение мультиавтомата, которое отличается от (1) лишь явным указанием на ошибку в описании:

'(Q, 2, Г, 5, до, 2о, Е, М, 5, ф),

Ошибка в противном случае.

Функционирование МП-мультиавтомата. Работа простого автомата, а также вырожденного МП-мульти-автомата с магазинной памятью описывается сменой конфигураций [7], где под конфигурацией МП-автомата, или его мгновенным описанием (ГО), понимается тройка элементов, описывающих состояние д, оставшуюся часть входной цепочки символов, составляющих программу ю, и содержимое магазина у. Таким образом ГО = (д, та, у).

Если Р - это МП-автомат, а 5(д, а, X) содержит (р,а), то VР определяет отношение, которое для всех цепочек ю из Е* и р из Г* такое, что

(д, ата,Xр) |-Р (р, та, ар) .

По аналогии с этими понятиями дадим определение конфигурации, или мгновенного описания ГОши1, МП-мультиавтомата Рши1. Поскольку в некоторый момент времени в выделенном состоянии может быть запущен вспомогательный МП-автомат, то помимо текущего состояния оставшейся части входа и содержимого своего магазина мультиавтомат описывается также через конфигурации каждого из содержащихся в нем МП-автоматов. Последнее является множеством ГО в формуле

= У

Шши1 -•

где N - количество вспомогательных автоматов. Таким образом, получаем мгновенное описание мультиавтомата в виде следующей формулы:

[(g, та, у, 0), если Рши1 = p,

I (д, та, у,ГОаих), в противном случае.

Также определим для МП-мультиавтомата бинарное

отношение перехода V Р Если Р , - это описанный МПА ^ 1 ши1 ши1 / \

мультиавтомат, и ф (д, а,X,3м , 35 ) содержит (р, а,М^ ) ,

то ^Рши1 определяет отношение, которое для всех цепочек ю из Е* и р из Г* такое, что

(д, ата,Xр,МЗм ) VРши1 (р,та,ар,Мм ) .

Используем символ V Рши1* для представления нуля или более переходов МП-мультиавтомата. Итак, имеем следующее индуктивное определение.

Базис: I [ Рши1* I для любого мгновенного описания I.

Индукция: 1 У Рши1 3, если существует некоторое мгновенное описание К, удовлетворяющее условиям

IVр 1 к и к Vр ,* з.

ши1 ши1

Таким образом, I V Рши1* 3, если существует такая последовательность мгновенных описаний К1, К2, ..., Кп, у которой I = К1,3 = Кпи К. |"Рши1 К. + 1 для всех! = 1, 2, ..., п- 1.

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

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

Таким образом, если Рши1 - это мультиавтомат, описанный выражением (6), то тогда языком ДР ), допускаемым мультиавтоматом по заключительному состоянию, является выражение

1

Докажем это утверждение.

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

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

3. Теперь допустим, что мультиавтомат имеет два вспомогательных МП-автомата. Поскольку, как было указано выше, они друг на друга не влияют, то мы можем поочередно удалить их из мультиавтомата. Тогда доказательство сходимости может быть сведено к п. 2.

4. По этой же схеме доказывается конечность алгоритма работы мультиавтомата при любом количестве МП-автоматов больше одного.

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

1

Ограничения на вспомогательные автоматы здесь те же, что и в выражении (9).

В [8] приводится доказательство эквивалентности языков, допускаемых по пустому магазину и по заключительному состоянию. Следовательно, построив мультиавтомат с магазинной памятью, допускающий язык по пустому магазину, эквивалентный такому же устройству, допускающему язык по заключительному состоянию, мы можем использовать доказательство выражения (9).

Формирование таблиц синтаксического анализа мультисинтаксических языков программирования. Итак, предложенный выше МП-мультиавтомат может быть использован в качестве основы программы синтаксического анализа МСЯ. Однако на каждом шаге он может требовать наличия нескольких магазинов произвольного размера в каждый момент времени, что не всегда приемлемо даже для ресурсов современных средств вычислительной техники. В силу этой и ряда других причин, трансляторы языков программирования, как правило, строятся на базе таблично-управляемых алгоритмов синтаксического анализа [7]. Эти алгоритмы в достаточной мере представлены в специальной литературе, и автором данной статьи было принято решение модифицировать один из алгоритмов формирования таблиц синтаксического

анализа с тем, чтобы в дальнейшем воспользоваться им для создания системы MuYacc.

Известно, что метод LALR(1) восходящего синтаксического анализа позволяет покрыть большинство синтаксических аспектов применяемых на практике языков программирования [7]. Модификация этого метода позволила получить алгоритм mLALR (1), который унаследовал от своего родителя необходимость построения таблиц, строки которых соответствуют состояниям синтаксического анализатора, а столбцы - терминальным и нетерминальным символам контекстно-свободной грамматики, описывающей каждый язык-компонент МСЯ. При этом для анализаторов вспомогательных языков используется классический LALR(1)-алгоритм с элементами, которые могут принимать значения четырех типов [7]. В то же время синтаксический анализатор для языка-лидера использует таблицы с элементами пяти типов, из которых первые четыре унаследованы от LALR( 1 )-алгоритма:

- элементы переноса. Эти элементы имеют вид Sk и означают следующее: поместить в магазин символ, соответствующий столбцу; поместить в магазин состояние k и перейти к состоянию k; если рассматриваемый символ -терминальный, то принять его. Если данный перенос подразумевает запуск анализатора вспомогательного языка, то это действие выполняется;

- элементы свертки. Они имеют вид Rm и означают, что нужно выполнить свертку с помощью правила m; удалить N символов и N состояний из магазина (N - количество символов в правой части правила m); перейти к состоянию, находящемуся на вершине магазина. Нетерминал из левой части продукции m считается следующим входным символом;

- элементы ошибок. Они являются пустыми ячейками таблицы и соответствуют синтаксическим ошибкам;

- элементы остановки, которые имеют вид Accept. Ими завершается процесс синтаксического анализа (входная строка принимается). Если анализируется вспомогательный язык, то процедуре анализа лидирующего языка возвращается успешное значение;

- элементы запускающего переноса. Эти элементы имеют вид Ek и означают следующее: поместить в магазин символ, соответствующий столбцу; поместить в магазин состояние k; найти и запустить анализатор соответствующего вспомогательного языка; если этот анализатор закончил анализ состоянием ошибки, то завершить анализ лидирующего языка с ошибкой; в противном случае перейти к состоянию k. Поскольку рассматриваемый символ - терминальный, то его принимают.

Анализатор языка-лидера начинает свою работу из начального состояния 0 и, переходя из одного состояния в другое, может закончить свою работу либо в состоянии Accept, либо в состоянии ошибки.

Таким образом, под руководством автора данной статьи был разработан компилятор компиляторов MuYacc [9], предназначенный для автоматизации процесса генерации трансляторов МСЯ. В качестве базиса MyYacc выбран описанный выше мультиавтомат с магазинной памятью. Это программное средство использовалось для создания экспериментального компилятора языка программирования C с возможностью включения кода на языке ассемблера архитектуры x86 в двух известных нотациях - Intel и AT &T. Опытная эксплуатация полученного компилятора показала практически двукратное снижение количества ошибок при построении второй версии двухвариантных модулей общим размером около 8 KLOC независимо от порядка их конструирования.

Библиографический список

1. Avizienis, A. The Methodology of N-Version Programming / A. Avizienis // Software Fault Tolerance. New York : John Wiley & Sons, 1995. P. 23-47.

2. Горбунов-Посадов, М. М. Расширяемые программы / М. М. Горбунов-Посадов. М. : Полиптих, 1999.

3. Соммервилл, И. Инженерия программного обеспечения / И. Соммервилл. М. : Вильямс, 2002.

5. Кузнецов, А. С. Автоматизация процесса генерации компиляторов мультисинтаксических языков программирования / А. С. Кузнецов, И. В. Ковалев, Е. А. Веретенников // Вестник СибГАУ 2007. Вып. 3(16). С. 73-75.

6. Карпов, Ю. Г Теория и технология программирования. Основы построения трансляторов / Ю. Г. Карпов. СПб. : БХВ-Петербург, 2005.

7. Ахо, А. Компиляторы: принципы, технологии и инструментарий / А. Ахо, М. Лам, Р Сети, Дж. Ульман. 2-е изд. М. : Вильямс, 2008.

8. Хопкрофт, Дж. Э. Введение в теорию автоматов, языков и вычислений / Дж. Э. Хопкрофт, Р. Мотвани, Дж. Д. Ульман. 2-е изд. М. : Вильямс, 2002.

9. Кузнецов, А. С. Генерация компиляторов мультисинтаксических языков программирования мультиверси-онных систем / А. С. Кузнецов, И. В. Ковалев // Прогр. продукты и системы. 2008. Вып. 4 (84). С. 101-103.

A. S. Kuznetsov

MODELING FOR RECOGNIZERS OF MULTISYNTAX PROGRAMING LANGUAGES FOR MULTI VERSION SYSTEMS

The abstract device for recognizing of multi syntax programming languages to construct multi version programming systems is covered. The synthesized device is a complex can be used as a base for programming language translation tool of multi version programming system development.

Keywords: multi syntax language, programming language, multi version approach, program system.

© Кузнецов А. С., 2009