Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
FALGOL.doc
Скачиваний:
15
Добавлен:
28.06.2014
Размер:
814.59 Кб
Скачать

Удк 681.3 falgol – тридцать лет спустя

© 2009 г. В.Н. Фальк

Москва, РГСУ, МЭИ (ТУ)

Поступила в редакцию 07.07.08 г., после доработки – 09.09.08 г.

(Formal ALGOrithmic Language) – фундаментальная теоретическая модель операторных языков высокого уровня с неограниченной иерархией программных объектов, формализующая связывание, присваивание, подстановку и рекурсию, причем в отличие от других известных формальных систем такого рода в этой модели реализован принцип динамического связывания переменных, что открывает возможность применения ’а для уточнения наиболее трудно формализуемых понятий современных языков объектного программирования.

Formal ALGOrithmic Language) - the fundamental theoretical model of operator high level languages with the unlimited hierarchy of program objects, which formalizes binding, assigntment, substitution and recursion, moreover in contrast to other known formalisms of this type in this model is realized the principle of the dynamic binding of variables, which offers the possibility of application and for refining the most difficultly formalized concepts of the modern languages of objective programming.

Введение. Прошло более тридцати лет со времени первой (и единственной!) публикации по ’у [1]. Продвижение идей этой модели для разработки архитектуры процессора смешанных вычислений с внутренним языком высокого уровня осуществлялось при выполнении ряда НИР в 1982-88 годах [2] и в кандидатской диссертации Чернова С.А. [3]. Материалы по ’у входили в программу читаемой автором дисциплины «Специальные разделы теории программирования» и были доступны для многих поколений студентов МИРЭА, МЭИ и РГСУ. Однако, для привлечения внимания специалистов явно недоставало публикации с формальным описанием ’а на современном уровне. Настоящая статья является несколько запоздалой попыткой исправления этой ситуации.

Предпосылками создания -модели можно считать

существенно возросший в 60 – 70-е г. интерес к механизмам реализации операторных языков высокого уровня [4], особенно после появления языка [5],

неудовлетворенность применением для исследования таких языков, с одной стороны, формализма схем программ [6] (трудности анализа языков высокого уровня) и, с другой стороны, классического -исчисления [7],

интерес в то время к трансформационному подходу к вычислениям, возникший благодаря исчислениям -конверсий и комбинаторов [8,9], и появлению алгоритма Кнута-Бендикса [10], появление теории смешанных вычислений [11],

популярность архитектур вычислителей с аппаратной интерпретацией многих механизмов реализации языков высокого уровня (после появления машины B5000 фирмы Burroughs),

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

Результатом работы, проделанной в стремлении снять указанные неудовлетворенности известными формальными моделями и ставящей своей главной целью создать теоретическую основу для разработки архитектуры реального процессора с внутренним языком высокого уровня, реализующего на аппаратном уровне принцип смешанных вычислений, и стал предлагаемый вниманию читателя язык . Его синтаксическими особенностями являются непосредственная декларация списковой структуры программных объектов без использования в качестве первоосновы двоичных деревьев. Подразумеваемый стиль суффиксной бесскобочной записи предполагает возможность стековой организации вычислений при определении операционной семантики языка. Необходимость формализации присваивания для объектов любой структурной сложности привела к появлению в языке особых примитивов – символов «присваивания», а в операционной семантике – памяти с адресным доступом типа «куча». Отличительной особенностью является и то, что в базовой модели отсутствуют операторы, подобные -оператору, кванторам общности и существования и др., а вводятся специальные символы «связывания», которые в языке играют роль символов операций. «Инкапсулированные» термы языка, т.е. термы, рассматриваемые наряду с атомами как элементы при построении термов более высокого структурного уровня, дополнительно играют роль «процедур», т.е. не исполняемых программных объектов, на которые непосредственно не распространяется операционная семантика. Однако, к процедурам применима система преобразований, заданных необходимой для реализации смешанных вычислений трансформационной семантикой языка. Для универсальных моделей вычислений, а таковой является (см. ниже связь с -исчислением), трансформационная семантика не может быть семантически полной, и любая система правил может непротиворечиво пополняться. Определениеметасемантики ’а позволяет ограничить сверху такие пополнения, позволяя для каждого вводимого правила доказывать, что оно не противоречит метасемантике языка. То же самое замечание относится и к возможным расширениям языка .

  1. Синтаксис языка . Пусть , и – счетные множества атомов трех видов. Символы , и назовем, соответственно, связыванием, вызовом и присваиванием значения переменной (понятие переменной не имеет в модели самостоятельного значения и используется лишь для указания связи указанных символов с одинаковыми номерами). Множество термов определяется как множество списков на множестве атомов , то есть как множество1 любых конечных последовательностей (кортежей) элементов термов: , где . Элемент вида – «инкапсулированный» терм – назовем процедурой, а терм – ее телом.

Терм – конкретный кортеж элементов представляется в ’е просто цепочкой представлений его элементов .

Контекст – конструкция, подобная терму, у которого в качестве одного из подтермов используется символ □ («дырка»). Результат замены этого символа в контексте на терм или контекст обозначим как . Вхождением терма в терм назовем пару , такую, что . Вхождение символа вызова переменной (вхождение символа присваивания переменной) в терм считается связанным, если , т.е. если имеется вхождение этого символа в подтерм-процедуру, за которой непосредственно следует символ связывания соответствующей переменной. Переменная называется свободной переменной терма , если имеются не связанные вхождения в символов вызова или присваивания этой переменной. Множество индексов всех свободных переменных терма обозначим как . Терм является константой, если .

  1. Операционная семантика. Семантика ’а определена тремя способами. Во-первых, задана операционная семантика в форме описания абстрактной -машины, архитектура которой представляет собой, по сущности, обобщенную машину фон-Нейманна. В ее составе три основных компонента:

«правый» стек (стек команд), элементами которого являются элементы термов, а его начальное состояние представляет собой «вычисляемый» терм (если , то на верхнем уровне находится элемент ),

«левый» стек (стек данных, в нем задаются исходные данные и формируются результаты вычислений), элементы которого представляют собой термы (если и , то на верхнем уровне левого стека находится терм ), и

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

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

Левый стек:

;

–не определено,

, при .

,

, при .

Правый стек:

;

–не определено, , при .

,

, при .

Куча:

,

;

, если , иначе не определено2.

,

, если , иначе не определено, где , а для всех .

Для памяти типа куча определим также (вообще говоря, недетерминированную) операцию «инициализации» новой ячейки:

;

, где , , а для всех .

Кроме того, введем по определению операцию записи в правый стек кортежа элементов некоторого терма:

;

, для .

Запись обозначает результат замены индекса на индекс во всех атомах терма , т.е. замены на , на , на .

Архитектура абстрактной -машины.

Рабочий цикл -машины начинается с проверки наличия команд в стеке данных. В случае, если правый стек пуст, происходит останов: состояние левого стека представляет результаты вычислений (его можно рассматривать как кортеж процедур, тела которых представлены отдельными уровнями левого стека), а состояние памяти, в общем случае, конкретизирует «среду» возможного выполнения этих процедур. В противном случае считываемый с верхнего уровня правого стека элемент терма интерпретируется как команда и исполняется описанным ниже способом. На рисунке приведена структурная схема -машины. Компонент играет роль регистра команд классической машины фон-Нейманна. Если элемент терма является атомом, то в регистре хранится индекс соответствующей переменной, если элемент терма является процедурой, то ее тело хранится в регистре . Регистр одновременно играет и роль регистра данных. Блок , реализующий операцию , выполняет функцию устройства обработки данных.

Как следует из приведенного ниже описания рабочего цикла -машины, достаточно рассматривать вычисление термов при начальном пустом состоянии левого стека: вычисление терма (в правом стеке) с начальным состоянием левого стека сводится к вычислению терма при пустом состоянии левого стека.

Здесь – некоторый выделенный терм, задающий начальное (инициальное) значение новой ячейки памяти. Например, можно принять соглашение, что это – пустой терм. Более интересным, на наш взгляд, является выбор в качестве инициального значения такого терма, выполнение которого приводит к «зацикливанию» процесса вычислений, в результате чего результат вычислений не будет получен. Этот вариант является своего рода защитой от попытки использовать для вычисления значения переменной до первого присваивания ей некоторого значения. В разделе 4 дается соответствующее уточнение (процедура, телом которой является такой терм, обозначена как ).

Память-куча играет вспомогательную роль «среды» при вычислениях термов. Поэтому при определении метасемантики ’а мы постараемся освободиться от ее явного использования. Во-первых, заметим, что на процесс вычислений и его результат может оказать влияние начальное состояние не всех ячеек памяти, а только тех, к которым потенциально возможно обращение по операциям чтения и записи. Более того, не ограничивая общности можно рассматривать вычисление термов при состоянии памяти , в которой все эти ячейки имеют значение : вместо вычисления терма для состояния памяти можно рассматривать вычисление терма для состояния памяти , где и для всех . Здесь замыкание множества номеров свободных переменных терма относительно состояния памяти ; , по определению, есть наименьшее подмножество номеров переменных, включающее и замкнутое относительно , т.е. выполняется условие . Вообще, состояние памяти будем называть корректным по отношению к терму , если . В этом случае при вычислении терма с начальным состоянием памяти-кучи результат выполнения операций с памятью всегда будет определен. Вследствие этого, результат вычислений может быть не определен лишь в двух случаях – либо когда при необходимости чтения из левого стека он пуст, либо когда процесс вычислений длится неограниченно долго.

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

Терм содержательно не сравним с термом (обозначается ), если . Соответствующий бинарный предикат на множестве термов является рекурсивно-перечислимым, но не рекурсивным.

  1. Трансформационная семантика. Трансформационная семантика определяет в форме исчислений отношений редукции () и конверсии (, симметричное замыкание отношения ) на множестве термов. Единственное требование состоит в том, чтобы эти отношения не пересекались с отношением содержательной несравнимости.

Мы ограничимся рассмотрением варианта трансформационной семантики для подмножества термов языка (назовем его языком Falgol) со статическим связыванием переменных. Из числа атомов этого языка исключены символы связывания переменных, а в качестве нового атома добавлена введенная по определению константа – так называемое «распроцедуривание» (выбор термина будет понятен из приведенных ниже правил редукции); кроме того, вводятся по определению несколько новых видов составных элементов термов:

–«блок» с блочной переменной и «телом» – термом ;

–«функция» с параметром и «телом» , при условии, что терм не содержит свободных вхождений символов присваивания значений переменной ;

–«рекурсивная процедура» с переменной рекурсии и «телом» , также при условии, что терм не содержит свободных вхождений символов присваивания значений переменной .

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

Стандартное инициальное значение в языке Falgol конкретизируется так: . Из определения операционной семантики следует, что выполнение на -машине терма как программы никогда не завершается.

Трансформационная семантика языка Falgol определяет отношения редукции и конверсии термов этого языка, не противоречащие метасемантике ’а, т.е. связанные этими отношениями термы не должны быть содержательно несравнимыми.

Множество термов языка Falgol далее обозначим как . Пусть – произвольные термы из , – произвольные «объектные» термы: по определению, это – либо символы вызова значения некоторой переменной, либо процедуры, а – результат подстановки в терм термов вместо свободных вхождений, соответственно, символов вызова или присваивания переменным.

Правила редукции:

  1. ;

  2. ;

  3. ;

  4. ;

  5. ;

  6. ;

  7. ;

  8. ;

  9. ;

  10. ;

  11. ;

  12. ;

  13. ;

  14. ;

  15. ;

  16. если , то .