Компилятор Fortran-DVM
Детальный дизайн
* 25 июня 2000 *


Оглавление

1 Назначение компилятора
2 Формат командной строки
3 Общая схема компилятора

3.1 Синтаксический анализ
3.2 Преобразование дерева разбора
3.3 Генерация кода на языке Фортран 77
3.4 Генерация кода на языке HPF

4 Основные структуры данных

4.1 Дерево разбора
4.2 Таблица символов и Таблица типов

5 Детальное описание модулей компилятора

5.1 Трансляция конструкций языка Fortran DVM (модуль dvm.cpp)

5.1.1 Создание распределенного массива и его перераспределение
5.1.2 Ссылки на распределенные массивы
5.1.3 Параллельный цикл

5.2 Трансляция операторов ввода-вывода (модуль io.cpp)
5.3 Реструктурирование дерева разбора (модуль stmt.cpp)
5.4 Трансляция конструкций языка HPF-DVM (модуль hpf.cpp)

5.4.1 Обработка ссылок на распределенные массивы в HPF-DVM
5.4.2 Цикл INDEPENDENT


В отчете приводится подробное описание реализации компилятора Fortran-DVM (FDVM). Рассматриваются структуры данных, схема управления и функции модулей компилятора.

1 Назначение компилятора

Язык Fortran DVM (FDVM) является расширением языка Фортран 77 для параллельного программирования. Расширение оформлено в виде специальных комментариев (директив DVM), которые аннотируют последовательную программу на языке Фортран 77.

На вход компилятору подается исходный код на языке Fortran DVM или HPF-DVM. Компилятор производит следующие выходные программы.

2 Формат командной строки

Формат команды вызова компилятора FDVM представлен ниже:

dvm fdv [ <options> ] <file-name>

Исходная программа размещается во входном файле <file-name>.fdv или <file-name>.hpf.

<options> - это указания о режимах компиляции:

-o file Поместить выходную программу в файл file;
-s Генерировать последовательную выходную программу;
-p Генерировать параллельную выходную программу;
-hpf1 Генерировать выходную программу на языке HPF1;
-hpf2 Генерировать выходную программу на языке HPF2;
-v Выдать сообщения о вызовах фаз компилятора, а также номер версии компилятора;
-w Выдать все предупреждающие сообщения;
-Idir Добавить директорию dir в список директорий, где осуществляется поиск include файлов.
-bindk Задает соответствие типов данных в компиляторах с языков Фортран и Си, k – целое, обозначающее номер таблицы соответствия типов;
-dleveld[:fr-list] Генерировать дополнительный код для отладки программы; leveld указывает уровень функциональной отладки, fr-list – список номеров фрагментов;
-elevele[:fr-list] Генерировать дополнительный код для анализа производительности программы; . levele указывает уровень отладки производительности.

3 Общая схема компилятора

В качестве инструментального средства разработки компилятора FDVM используется система Sage++.

Sage++ представляет собой объектно-ориентированную инструментальную систему для построения систем преобразования программ на языках Фортран, Си и Си++. Она является открытой библиотекой классов Си++, которая предоставляет пользователю набор синтаксических анализаторов, дерево разбора, таблицы символов и типов. Ядро системы составляет набор функций для реструктурирования дерева разбора и механизм (называемый unparsing) для генерации нового кода по реструктурированному внутреннему представлению.

Компилятор FDVM состоит из четырех компонент:

3.1 Синтаксический анализ

Синтаксический анализатор системы Sage++ для Фортрана, который базируется на GNU Bison версии языка YACC, расширен средствами обработки директив DVM. Он состоит из следующих модулей:

ftn.gram - грамматические правила для языка Фортран
fdvm.gram - грамматические правила для директив Fortran DVM
lexfdvm.c - лексический анализатор
tag - список тэгов-признаков
tokens - список лексем
gram1.tab.c - синтаксический анализатор, генерируемый системой Bison
cftn.c - главная программа (вызывает синтаксический анализатор,
открывает и закрывает необходимые файлы)
init.c - подпрограммы инициализации
stat.c - подпрограммы создания внутреннего представления
операторов
(вершин дерева разбора)
errors.c - печать сообщений об ошибках
sym.c - подпрограммы работы с Таблицей символов
types.c - подпрограммы обработки описаний переменных
lists.c - подпрограммы построения списков
misc.c - вспомогательные подпрограммы
hash.c - подпрограммы работы с Кэш-таблицей

Синтаксический анализатор читает исходный файл, проверяет синтаксис, строит дерево разбора и записывает его внутреннее представление в файл с расширением .dep.

3.2 Преобразование дерева разбора

Вторая фаза компиляции включает анализ и реструктурирование внутреннего представления FDVM-программы. Директивы DVM заменяются последовательностями вызовов функций системы поддержки Lib-DVM. Затем новый код генерируется по модифицированному внутреннему представлению.

Программа “back-end” написана на языке C++ с использованием библиотеки классов Sage++.

Библиотека Sage++ организуется как иерархия классов, которая обеспечивает доступ к дереву разбора, Таблице символов и Таблице типов каждого файла из прикладного проекта. В библиотеке имеется пять основных семейств классов: Project и Files, Statements, Expressions, Symbols, Types.

Project и Files соответствуют исходным файлам. Statements соответствуют операторам языка Фортран и директивам DVM. Expressions – это выражения, содержащиеся в операторах. Symbols являются объявленными пользователем идентификаторами. Types представляют типы, которые ассоциируются с каждым идентификатором и выражением.

Описания всех классов содержатся в файле libSage++.h.

Семь модулей составляют транслятор:

dvm.cpp - анализ и трансляция конструкций языка FDVM
funcall.cpp - генерация вызовов функций библиотеки Lib-DVM
stmt.cpp - реструктурирование дерева разбора
io.cpp - трансляция операторов ввода-вывода
debug.cpp - поддержка отладочного режима
help.cpp - вспомогательные подпрограммы
hpf.cpp - трансляция конструкций языка HPF-DVM

3.3 Генерация кода на языке Фортран 77

Генерация нового кода на языке Фортран 77 по модифицированному внутреннему представлению осуществляется посредством функции unparse( ) класса File из библиотеки классов Sage++.

3.4 Генерация кода на языке HPF

Когда исходная FDVM-программа конвертируется в программу на языке HPF, следующие подпрограммы и таблицы используются:

unparse_hpf.c - подпрограммы генерации кода на языке HPF
low_hpf.c - подпрограммы нижнего уровня, используемые для генерации
unparse.hpf - таблица, управляющая генерацией кода на языке HPF2
unparse1.hpf - таблица, управляющая генерацией кода на языке HPF1

4 Основные структуры данных

Описания структур данных внутреннего представления программы содержатся в файлах:

4.1 Дерево разбора

На рис.4.1 представлена структура вершины дерева разбора для оператора, а на рис.4.2 - для выражения. Рис.4.4 демонстрирует фрагмент дерева разбора.

4.2 Таблица символов и Таблица типов

Элементы Таблицы символов и Таблицы типов показаны на рис.4.3.

признак
идентификационный номер
индекс
глобальный номер строки
локальный номер строки
спецификатор
указатель на метку
указатель на следующий оператор
указатель на имя файла
указатель на родителя по управлению
список свойств
список вершин(список процедур)
указатель на комментарий
указатель на Таблицу символов
L-дерево выражения
R-дерево выражения
запасное поле для выражения
do-метка (используется для do)
список-по-управлению-1
список-по-управлению-2 (для if)
запасное поле
запасное поле
запасное поле

Рис. 4.1. Вершина дерева разбора, представляющая оператор (bif node).

признак
идентификационный номер
указатель на следующую вершину
указатель на элемент Таблицы типов
значение костанты
указатель на элемент Таблицы символов
L-дерево выражения
R-дерево выражения

Рис. 4.2. Вершина дерева разбора, представляющая выражение (ll -node).

признак признак
идентификационный номер идентификационный номер
длина идентификатор
запасное поле ссылка на Хэш-таблицу
запасное поле специальный список
список использование-определение специальный список
ссылка на базовый тип(для массива) специальный список
границы измерений(для массива) ссылка на следующий символ
  ссылка на Таблицу типов
  область действия
  список использование-определение
  атрибуты (маска)
  флаг do-переменной
  используется синт.анализатором
  ссылка на значение(для констант)
  специальные поля

Рис.4.3. Элементы Таблицы типов и  Таблицы символов

Рис. 4.4. Внутреннее представление оператора a = b + c.

5 Детальное описание модулей компилятора ==>