\documentclass[a4paper]{article}
\usepackage[cp1251]{inputenc}
\usepackage[russian]{babel}
\usepackage{alltt}
\inputencoding{cp1251}
\usepackage{graphics}

\renewcommand{\topfraction}{1}
\input{my-macro.tex}

\begin{document}

\title{
Параллельная реализация языка программирования Рефал+: компиляция в императивный язык
}
\author{
 Институт программных систем Российской академии наук
}
\maketitle 

\begin{abstract}
В отчете рассматриваются алгоритмы и формализмы, реализо\-ван\-ные при разработке компилятора и run-time--библиотеки для конвер\-ти\-рования Рефал Плюс ---программ в программы на императивном языке (на примере языка С++). 
\end{abstract}

%\tableofcontents

\section{Cхема компиляции Рефал Плюс в импера\-тив\-ный язык}
\label{sec:comp-shema}	

Общая схема компиляции программ на языке Рефал Плюс в императивный 
язык (на примере Си++) приведена на рис.~\ref{fig:comp-shema} на
стр.~\pageref{fig:comp-shema}.

\begin{figure}[hbt]
	\begin{center}
		\includegraphics{comp-sheme.eps}
	\end{center}
	\caption{Схема компиляции Рефала Плюс в императивный язык}
	\label{fig:comp-shema}	
\end{figure}

В процессе компиляции выделяются три основных этапа:
\begin{enumerate}

	\item 
	Преобразование Рефал-программы в текст на языке абстрактного син\-так\-си\-са
	(AS-текст), которое выполняют модули \verb|rfp_lex| и \verb|rfp_parse|.
	
	\item 
	Преобразование AS-текста в программу на абстрактном импе\-ра\-тив\-ном 
	языке (ASAIL-текст), осуществляемое модулем \verb|rfp_compile|.
	
	\item
  Генерация выходного текста Си++~--программы, которую выполняет	модуль   \verb|rfp_asail|.
	
\end{enumerate}

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

\begin{enumerate}

	\item 
Выделение AS-языка как входного языка для последующих этапов
компиляции дает возможность использовать разработанные модули 
для компиляции в императивные языки других диалектов Рефала. 

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

\end{enumerate}


Более подробно основные этапы компиляции рассмотрены далее.

\section{Этап компиляции ``Рефал Плюс~--- Абст\-ракт\-ный син\-так\-сис''}
\label{sec:comp-refal-as}	

\subsection{Правила преобразования в AS}

При разработке абстрактного синтаксиса (далее AS) приоритетной была  задача максимально обеспечить возможность отображения в AS-пред\-ло\-же\-ни\-ях
конструкций различных диалектов Рефала.

Вследствие этого был выбран следующий набор методов преобразования конструкций Рефала Плюс в AS-выражения:

\begin{enumerate}
	\item 
Тело функции~--- путь (не обязательно блок).
	
	\item 
Путь~--- линейная последовательность операторов, вытянутых через  конкатенацию, а не через ``cons''.

	\item 
Все AS-скобки, включая образующие термы, имеют впереди теги.

	\item 
Сложные конструкции Рефала Плюс (перестройки, \ присваивания) 
разбиты на составляющие их действия.

	\item 
Семантика действия состоит в пополнении среды и выработке нового
форматного значения (объектного выражения со статическим фор\-ма\-том).
Действия бывают простые (образцы, результаты, форматы) и сложные
(блоки).

	\item 
Есть отдельный оператор \verb|NoFail|, непроницаемый для 
\verb|$Fail|, и \verb|CUTALL|, выражающий семантику равенства 
Рефал Плюс. Непрозрачному бло\-ку в AS соответствует конструкция 
\verb|NoFail (Block e.Branches)|.

	\item 
Оператор итерации
\verb|$iter| заменяется более элементарными конструк\-ци\-я\-ми 
\verb|(Label sl)| и \verb|(Loop sl)|. При этом в операторе 
\verb|Loop| метка \verb|sl| должна быть определена (оператором 
\verb|Label|) выше на пути от начала функции к данному оператору
\verb|Loop|, т.е. ищется ближайшая точка \verb|Label| с тем же 
символом-меткой \verb|sl|. 

	\item 
Вместо трех понятий Рефала Плюс: \verb|Tail|, \verb|Path|, 
\verb|Source|, ~--- исполь\-зу\-ет\-ся одно: \verb|e.Sentence|.

	\item 
Все константы подставлены на этапе лексического анализа. 
Ссылка на функцию и другие символы-ссылки выглядят 
как \verb|(Ref s.Word)|. 
Определяющие вхождения задаются как \verb|s.Word|. 
В вызове функции используется \verb|(Ref s.Word)|.

	\item 
Объектные символы (в отличие от символов-ссылок) представляются
сами собой, а не как \verb|(Symbol s)|.

	\item 
Операторы \verb|Error| и \verb|Trap| имеют неявный дополнительный 
аргумент~--- продолжение справа от оператора.

	\item 
Окончание выражений после операторов \verb|Fail| и \verb|Loop| игнорируется.

	\item 
Конкретная реализация может не поддерживать какие-то элементы (или
сочетания элементов) абстрактного синтаксиса. В этом случае должно
выдаваться соответствующее сообщение.

\end{enumerate}

% Описание АС-синтаксиса.
\input {AS-syntax}


\section {Этап компиляции ``Абстрактный синтаксис (AS)~--- Абстрактный синтаксис им\-пе\-ра\-тив\-но\-го языка (ASAIL)''} 

% Описание ASAIL-синтаксиса.
\input {ASAIL-syntax-long}

\section {Этап компиляции ``Абстрактный синтаксис императивного языка ~--- Си++''} 

% Описание класcа Expr.
\input {class-Expr}

% Описание компиляции отщеплений

\input {split-compiling}

% Описание соответствия ASAIL - C++.
\input {ASAIL-to-C++}

\section{Пример компиляции ``Рефал Плюс~--- С++''}

% Список зарезервированных слов С++
\input {reserved-c++}

% Запуск компилятора
\input {option-compiling}

% Пример компиляции
\input {example-compiling}

\end{document}
