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