Компилятор Fortran-DVM |
Оглавление
1 Назначение компилятора
2 Формат командной строки
3 Общая схема компилятора
3.1 Синтаксический анализ
3.2 Преобразование дерева разбора
3.3 Генерация кода на языке Фортран 77
3.4 Генерация кода на языке HPF
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). Рассматриваются структуры данных, схема управления и функции модулей компилятора.
Язык Fortran DVM (FDVM) является расширением языка Фортран 77 для параллельного программирования. Расширение оформлено в виде специальных комментариев (директив DVM), которые аннотируют последовательную программу на языке Фортран 77.
На вход компилятору подается исходный код на языке Fortran DVM или HPF-DVM. Компилятор производит следующие выходные программы.
Формат команды вызова компилятора 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 указывает уровень отладки производительности. |
В качестве инструментального средства разработки компилятора FDVM используется система Sage++.
Sage++ представляет собой объектно-ориентированную инструментальную систему для построения систем преобразования программ на языках Фортран, Си и Си++. Она является открытой библиотекой классов Си++, которая предоставляет пользователю набор синтаксических анализаторов, дерево разбора, таблицы символов и типов. Ядро системы составляет набор функций для реструктурирования дерева разбора и механизм (называемый unparsing) для генерации нового кода по реструктурированному внутреннему представлению.
Компилятор FDVM состоит из четырех компонент:
Синтаксический анализатор системы 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.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.