Компилятор 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.