Электронная библиотека диссертаций и авторефератов России
dslib.net
Библиотека диссертаций
Навигация
Каталог диссертаций России
Англоязычные диссертации
Диссертации бесплатно
Предстоящие защиты
Рецензии на автореферат
Отчисления авторам
Мой кабинет
Заказы: забрать, оплатить
Мой личный счет
Мой профиль
Мой авторский профиль
Подписки на рассылки



расширенный поиск

Модели и реализация транслирующих компонентов системы функционального программирования Стасенко Александр Павлович

Модели и реализация транслирующих компонентов системы функционального программирования
<
Модели и реализация транслирующих компонентов системы функционального программирования Модели и реализация транслирующих компонентов системы функционального программирования Модели и реализация транслирующих компонентов системы функционального программирования Модели и реализация транслирующих компонентов системы функционального программирования Модели и реализация транслирующих компонентов системы функционального программирования Модели и реализация транслирующих компонентов системы функционального программирования Модели и реализация транслирующих компонентов системы функционального программирования Модели и реализация транслирующих компонентов системы функционального программирования Модели и реализация транслирующих компонентов системы функционального программирования
>

Диссертация - 480 руб., доставка 10 минут, круглосуточно, без выходных и праздников

Автореферат - бесплатно, доставка 10 минут, круглосуточно, без выходных и праздников

Стасенко Александр Павлович. Модели и реализация транслирующих компонентов системы функционального программирования : дис. ... канд. физ.-мат. наук : 05.13.11 Новосибирск, 2006 231 с. РГБ ОД, 61:07-1/355

Содержание к диссертации

Введение

1. Язык Sisal 3.1 14

1.1. Потоковые языки программирования 14

1.2. История развития языка Sisal 15

1.2.1. Язык Val 15

1.2.2. Sisal 1.2 17

1.2.3. Sisal 2.0 18

1.2.4. Sisal 90 18

1.2.5. Sisal 3.0 20

1.3. Нововведения языка Sisal 3.1 21

1.3.1. Пользовательские типы 21

1.3.2. Другие нововведения 22

1.4. Ограничения языка Sisal 3.1 24

1.5. Анализ изменений в языке Sisal 3,1 24

1.5.1. Улучшение межъязыкового взаимодействия с языком Си 25

1.5.2. Повышение читаемости программ 25

1.5.3. Упрощение синтаксического разбора 26

1.5.4. Устранение неоднозначностей синтаксического разбора 27

1.5.5. Улучшение синтаксиса 28

Выводы по главе 1 29

2. Первое внутреннее представление IR1 30

2.1. Требования к внутреннему представлению 30

2.2. Обзор промежуточных представлений программ 31

2.2.1. Модель потока данных Дениса 32

2.2.2. Расншряемая модель расширяемого языка Берса 32

2.2.3. Модель вычислений языка Пифагор 35

2.3. Описание языка промежуточной формы И:1 36

2.3.1. Основные понятия 37

2.3.2. Задание последовательного выполнения 39

2.3.3. Альтернатива 39

2.3.4. Итерация 39

2.4. Модель внутреннего представления IR1 39

2.4.1. Моделирование языково-независимых понятий языка IF1 40

2.4.2. Система интерфейсов модели 41

2.5, Система дополнительных интерфейсов 49

2.5.1. Преобразование IR1 BXML И обратно 49

2.5.2. Визуализация IR1 в ActiveX компоненте 51

Выводы по главе 2 53

3. Графический метаязык описания транслятора 54

3.1. Обзор методов построения трансляторов 54

3.1.1. Нисходящие методы 51

3.1.2. Восходящие методы 58

3.1.3. Заключение по существующим методам 59

3.2. Модель упрощенного магазинного автомата 60

3.2.1. Определение модели 61

3.2.2. Недетерминированный автомат Ч; 62

3.2.3. Устранение s-переходов в детерминированном автомате Ч' 63

3.2.4. Связь с классами грамматик 65

3.2.5. Связь с классами языков 67

3.3. Представление модели, основанное на графе 68

3.3.1. Определение схемы 4' 69

3.3.2. Применение схемы Ч> 71

3.3.3. Достоинства подхода ,72

3.4. Расширения графического метаязыка 73

3.4.1. Семантически-зависимые переходы 73

3.4.2. Иерархическая обработка неопределённостей 75

3.5. Описание транслятора 76

3.6. Преобразование к интерпретируемой форме 78

3.6.1. Устранение мнимых дуг 79

3.6.2. Удаление недостижимых состояний 79

3.6.3. Оптимизация тестовых условий па дугах 79

3.6.4. Минимизация автомата анализатора 80

3.6.5. Разворачивание нециклических зависимостей 81

3.7. Адаптивная оптимизация интерпретации 81

Выводы по главе 3 82

4. Трансляция из Sisal 83

4.1. Обзор существующих компиляторов языка Sisal 83

4.1.1. Компилятор OSC 83

4.1.2. Компилятор FSC 84

4.1.3. Компилятор D-OSC 85

4.2. Общая схема транслятора 86

4.3. Система интерфейсов, задающая транслятор 87

4.3.1. Требования к системе интерфейсов 88

4.3.2. Описание системы интерфейсов 89

4.4. Лексический анализ 93

4.5. Синтаксический и семантический анализы 95

4.5.1. Общая структура разбора 97

4.5.2. Общее описание разбора 98

4.5.3. Особенности разбора отдельных конструкций языка 99

4.5.4. Сообщения об ошибках и предупреждениях 103

4.5.5. Восстановление после ошибок разбора 104

Выводы по главе 4 106

Заключение 107

Список литературы ПО

Список иллюстраций 120

Список таблиц 123

Список утверждений 124

А1. Описание языка Sisal 3.1 125

А 1.1. Общий вид Sisal 3.1 программы 125

А1.1.1. Элементы языка Sisal 3.1 125

A 1.1.2, Препроцессор 126

A 1.1,3. Интерфейс модуля 129

А 1.1.4. Реализация модуля 130

А 1.2. Типы 132

А 1.2,1. Простые (скалярные) типы 132

А1.2.2. Массивы 133

А1.2.3. Другие составные (агрегированные) типы 137

А1.2.4. Множество типов 140

А 1.2.5. Пользовательский тип 141

А 1,2.6, Преобразования типов, 141

А 1.3. Арифметические выражения 143

А 1.3.1. Постфиксные операции , 143

А 1.3.2. Префиксные операции 143

А 1.3,3, Инфиксные операции 143

А 1.3.4. Пользовательские операции 145

А1.4. Выражения 146

А 1,4.1, Выражение let 146

А 1.4.2. Выражение if 146

А1.4.3. Выражение case „ 147

А 1.4.4. Выражение where 148

А 1,5. Циклические выражения 148

А1,5.1. Выражения цикла с условием 149

А 1.5.2. Циклическое выражение с диапазоном 149

А1.5.3. Предложение возврата 150

А2. Extended BNF Sisal 3.1 153

А2.1. Синтаксис лексем 153

А2.2. Синтаксис языка 156

A3. Пример модуля, реализующего комплексное число 160

А3.1. Интерфейс модуля complex 160

A3.2. Реализация модуля complex 161

A4. Описание простых вершин IR1 165

А4.1. Алгебраические операции , 165

А4.1.1. Операции преобразования типов значений 165

А4.1.2. Арифметические операции 166

А4.1.3. Операции сравнения 167

А4.1.4. Операции сравнения типов , 168

А4.1.5. Логические операции 168

А4.2, Операции над массивами и потоками 169

А4.2.6. Операции с массивами , 169

А4.2.7. Операции с потоками „ 171

А4.3. Операции с записями и союзами 172

А4.4. Операции с функциями 173

А4.5. Особые операции циклических конструкций 174

А4.5.1. Редукции генератора диапазона 174

А4.5.2. Редукции предложения возврата 175

А5. Описание составных вершин IR1 178

А5.1. Select 178

А5.2. LoopA 181

А5.3. LoopB 183

А5.4. Forall 184

A5.5. Reduction 185

A6. Специализация ]R1 для языка Sisal 3.1 187

A7. Структура XML-представления ВП IRI 191

А8. Примеры применения схем Ч' 195

А8.1. Простой язык 195

А8.2. Лексический разбор языка Sisal 3.1 197

А8.3. Семантико-синтаксический разбор языка Sisal 3.1 216

А9. Формат файла интерпретируемого автомата анализатора 228

Введение к работе

Актуальность темы. В настоящий момент намечается существенное замедление роста производительности вычислительных систем за счет увеличения тактовой частоты вычислительных устройств, связанное с ограниченностью современных технологических возможностей. Поэтому для сохранения существующих темпов роста скорости вычислений, косвенно декларируемых законом «Moore's Law», возобновляется интерес к параллельным вычислениям. Ярким тому подтверждением является появление процессоров с двумя независимыми вычислительными ядрами, ориентированных на массовый рынок. Прослеживается общая тенденция увеличения значимости роли многих процессорных ядер, что в обозримом будущем может привести к значительному росту возможностей вычислительных систем по параллельной обработке данных.

К сожалению, подобного прогресса в области разработки программного обеспечения не наблюдается. Данное обстоятельство, прежде всего, связано с преобладанием императивных языков программирования, жестко фиксирующих порядок вычислений. Автоматическое выделение параллелизма в последовательной программе на этапе компиляции в общем случае обычно малоэффективно, а в распараллеливании на уровне машинных инструкций возможности современных процессоров практически исчерпаны. Возможности императивных языков по явному описанию фиксированного числа параллельных вычислений также не решают вопрос масштабирования на большее число процессоров (или их ядер). К тому же такой подход обычно снижает надежность программы и может даже вызывать её замедление при наличии единственного процессора (ядра) или большого числа пересекающихся критических секций.

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

должны быть исполнены. Такое неявное описание позволяет автоматизировать планирование порядка вычислений, избавляя программиста от решения этой задачи на этапе подготовки программы к исполнению, причём, с учётом архитектуры конкретной вычислительной системы. Таким образом, текст функциональной программы и её информационный граф задают машинно-независимый параллелизм.

Однако и в функциональных языках существуют ограничивающие параллелизм факторы. Одной из таких причин является набор языковых операций, специально ориентированный на последовательные вычисления или ограниченный параллелизм. В частности, в функциональном языке Лисп (Lisp) операторы для работы с данными обеспечивают выборку только одного компонента, а функциональный язык FP не предусматривает распараллеливание на уровне независимых операторов. Также в модели вычислений, присущей функциональному языку, могут присутствовать элементы управления, тем или иным образом приводящие к разделению процессами общих вычислительных ресурсов. Например, в схемах потока данных Дениса таким ресурсом является узел слияния потоков данных.

Указанные недостатки обычно обходятся в потоковых языках программирования, явно описывающих вычисления в виде графа потока данных и обычно являющихся также и функциональными языками. Эти языки, как правило, содержат операторы размножения информационных потоков, их группирования в списки данных различного уровня вложенности и одновременного выделения из списков нескольких независимых и разнородных по составу групп. Потоковые языки программирования изначально ориентировались на потоковые архитектуры вычислительных систем, имевших распространение в 80-90-х гг. XX века, и с тех пор практически не развивались.

Тем самым, актуальность работы обуславливается:

  1. технологическими трудностями роста производительности последовательных машинных архитектур и, как следствие, ростом интереса к параллельным вычислениям;

  2. высокой изменчивостью параллельных машинных архитектур и, как следствие, необходимостью в машинно-независимом представлении параллелизма;

  3. естественной пригодностью потоковых языков программирования для описания машинно-независимого параллелизма;

  4. малой распространенностью и устарелостью существующих потоковых языков и систем программирования на их основе.

Язык программирования Sisal является одним из самых известных потоковых языков промышленного уровня и позиционируется как замена языка Fortran для научных применений. Язык Sisal имеет следующие особенности, облегчающие переход с популярных императивных языков программирования:

приближенный к языку Паскаль синтаксис;

развитая система типов;

явно выделенные циклические выражения.

Последняя спецификация языка Sisal версии 2.0 датируется 1991 г., а последнее обновление транслятора OSC, работающего только с языком Sisal версии 1.2 от 1985 г., было в 1995 г. В 1995 г. также появилось пользовательское описание языка Sisal 90, не содержащее, однако, точных спецификаций языка.

В связи с этим актуальна задача разработки и спецификации новой версии языка Sisal, включающей некоторые возможности современных языков программирования. Не меньшей актуальностью обладает создание компилятора для новой версии языка Sisal, что не является тривиальной задачей ввиду богатого синтаксиса и семантики языка Sisal.

Цель работы - разработка и реализация моделей транслирующих компонентов системы функционального программирования. Достижение цели работы связывается с решением следующих задач.

1. Разработка языка Sisal версии 3.1, развивающего базовую,
функциональную часть языка Sisal 3.0, являющегося входным языком
системы SFP и основанную на языке Sisal 90.

  1. Уточнение описания языка Sisal 90.

  2. Расширение языка Sisal 90 средствами модульного программирования (Sisal 3.0) и пользовательскими типами.

  3. Улучшение синтаксиса и семантики языка Sisal 90.

2. Разработка машинно-независимого ВП IR1 программ языка Sisal 3.1,
основанного на графах информационных зависимостей.

  1. Разработка модели внутреннего представления (ВП) IR1 для машинно-независимого описания функциональных программ и её специализация для языка Sisal 3.1.

  2. Разработка и реализация вспомогательных компонентов ВП IR1 для его сохранения, восстановления и визуализации.

3. Исследование методов трансляции и создание компилятора переднего
плана из текста программ языка Sisal 3.1 в ВП IR1.

  1. Разработка модели построения компоненты компилятора переднего плана, основанной на теории автоматов, и её графического представления.

  2. Разработка компоненты поддержки трансляции из текстового представления во ВП IR1 (для поддержки нескольких входных языков системы SFP).

Методы исследования. В диссертационной работе использовались понятия и методы теории графов, теории алгоритмов и элементы теории множеств. Также применялась теория синтаксического анализа и построения трансляторов. В качестве сравнения применялись различные классы

потоковых схем. Для описания синтаксиса языка программирования использовались расширенные формы Бэкуса-Наура (БНФ).

Научная новизна. В диссертационной работе получены новые научные результаты.

  1. Спроектирована и формально описана новая версия языка Sisal 3.1, развивающая функциональную часть предыдущих версий языка Sisal и приближающая её к уровню современных языков программирования.

  2. Разработаны модели для удобного построения, хранения, анализа, преобразования и использования машинно-независимого внутреннего представления программ функциональных языков программирования.

  3. Создана модель построения компоненты компилятора переднего плана, разделяющая его реализацию на графическую, текстовую и интерпретирующую части и позволяющая использовать преимущества каждой из них для упрощения построения и сопровождения компиляторов переднего плана, написанных вручную.

  4. Формализована модель описания графической составляющей компилятора переднего плана, основанная на упрощении классической модели магазинного автомата с расширениями, делающими возможным её практическое применение. Практическая ценность. Разработанные язык программирования

Sisal 3.1, его ВП IR1 и транслятор из первого во второе являются неотъемлемой частью системы функционального программирования (SFP), разрабатываемой в рамках проекта ПРОГРЕСС. Данные разработки будут использоваться другими участниками проекта SFP в качестве основы для создания своих частей проекта и будут внедрены в учебный процесс в Новосибирском госуниверситете.

Апробация работы. Основные положения диссертации обсуждались на следующих конференциях и семинарах.

  1. 9 International Conference on Parallel Computing Technologies, Pereslavl-Zalessky, 2007 r.

  2. Европейская конференция по вычислениям (ЕСС-2007), г. Афины, 25-27 сентября, 2007.

  3. V Всероссийская конференция молодых ученых по математическому моделированию и информационным технологиям (с участием иностранных ученых), Новосибирск, ИВТ СО РАН, 2004 г.

  4. Конференция-конкурс «Технологии Microsoft в информатике и программировании», Новосибирск, 2005 г.

  1. Конференция-конкурс «Технологии Microsoft в теории и практике программирования», Новосибирск, 2006 г.

  2. XLIV Международная научная студенческая конференция «Студент и научно-технический прогресс», Новосибирск, 2006 г.

  3. XII Международная научно-методическая конференции «Новые информационные технологии в университетском образовании», 2007 г.

  4. Семинар спецкурса «Введение в функциональное программирование», 2007 г.

  5. Семинары «Конструирование и оптимизация программ», Новосибирск, ИСИ СО РАН, 2002-2008 гг.

Публикации. Основные результаты диссертационной работы опубликованы в 19 печатных работах, из которых 2 препринта, 12 статей и 6 тезисов докладов. Исследования поддерживались грантами УР.04.01.027 и УР.04.01.0201 научной программы «Университеты России» Министерства науки и образования Российской Федерации. Исследования выполнялись в соответствии с планами научно-исследовательских работ ИСИ СО РАН по проекту 3.15 «Методы и средства трансляции и конструирования программ». Проект проводился в рамках программы 3.1 СО РАН «Информационное и математическое моделирование в различных областях знаний, задачи

поддержки принятия решений, экспертные системы, системное и теоретическое программирование».

Структура диссертации. Диссертация состоит из введения, четырёх глав, заключения, списка литературы и девяти приложений. Работа содержит 109 страниц машинописного текста (без приложений и библиографии), 78 рисунков и 22 таблиц. Список литературы содержит 99 наименований.

Потоковые языки программирования

Язык программирования называется потоковым, если он подходит для описания программ для потоковых архитектур, на машинном уровне описывающих вычисления в виде графа потока данных [86]. Поэтому потоковый язык должен удовлетворять следующим критериям:

возможность извлечения зависимостей по данным из текста программы, что достигается при соблюдении принципа локальности действия (locality of effect) или прозрачности имён ссылок (referential transparency), олицетворяющие значения, а не ячейки памяти;

последовательность вычислений определяется только готовностью данных, что обеспечивается отсутствием побочных эффектов (side-effect) вычислений или их математической правильностью. Потоковые языки программирования обычно являются представителями класса чистых от побочных эффектов функциональных языков, основанных на -исчислении Черча [15], задающего вычисления через применение функций к их аргументам. Функциональные языки в сравнении с императивными языками обладают большей «выразительной мощностью», заключающейся в легкости описания операций над сложными объектами, такими как сами функции, и неявно задаваемом машинно-независимом параллелизме, ограниченном лишь зависимостями но данным.

Вначале свойства потоковых языков в значительной степени определялись особенностями существующих потоковых архитектур, первые из которых были статическими и не допускали повторное использование потокового кода, такого как рекурсия. Данные ограничения были в дальнейшем преодолены динамическими потоковыми архитектурами, позволяющими одновременное продвижение множества наборов разметок по дугам потокового графа. В настоящее время потоковые языки потеряли свою изначальную привязанность к потоковым архитектурам и, в основном, рассматриваются из-за своей выразительной мощности. К потоковым языкам программирования относятся такие языки, как Lucid [16], Id [17], Val [18], Post [19], Пифагор [20] и рассматриваемый ниже язык Sisal.

Требования к внутреннему представлению

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

1) машинная независимость представления параллелизма, без явного выделения нескольких потоков вычислений;

2) независимость типов данных от разрядности машинной архитектуры;

3) полнота, позволяющая произвести ретрансляцию в программу на исходном языке, семантически эквивалентную исходной программе;

4) ретрансляция в синтаксически корректную программу после преобразований, корректных для исходного языка (приложение А6);

5) интерпретируемость без дополнительных преобразований;

6) простота преобразований, в том числе и оптимизирующих;

7) иерархичность сущностей ВП, задающих естественную вложенность конструкций функционального языка программирования;

8) представление всех неявных операций явным образом;

9) представление циклических конструкций в явном виде;

10) расширяемость - лёгкое введение новых сущностей ВП, задающих новые конструкции языков программирования и типы данных;

11) переносимость - применение сущностей в разных языковых средах. Требование полноты ВП не влечёт взаимно однозначного соответствия между конструкциями языка и сущностями ВП, определяющего их базовый набор. Базовому набору принадлежат обобщённые сущности, такие как сущность, задающая обобщенную условную операцию, описывающую различные конструкции выбора исходного языка.

Такой базовый набор операций значительно упрощает преобразования ВП, но затрудняет ретрансляцию ВП в эффективную программу на исходном языке программирования. Трудности объясняются тем, что часть информации в обобщенных объектах ВП, выраженная явным образом в синтаксисе исходных конструкций языка, представляется неявно. Например, может быть утеряно явно выделенное управляющее выражение синтаксической конструкции, такой как оператор switch языка Си.

Перечисленные требования к внутреннему представлению основаны на требованиях оптимизирующих преобразований [40]: выразимости оптимизации, сохранении качества, сохранении свойств, унификации и удобства оптимизации. Перечисленные требования учитывают и требования к «хорошему» промежуточному представлению [41], которое должно быть исполняемым, обладать свойствами структуры данных с механизмом сбора информации о зависимостях по данным, представлять циклы в явном виде, поддерживать модель памяти с модифицируемым императивным сохранением информации и быть компактным.

Обзор методов построения трансляторов

Обычно перед анализом синтаксиса выделяют фазу анализа лексики, задаваемую детерминированным конечным автоматом, построенным по регулярной грамматике утилитами, наподобие Lex [50], и служащим для выделения синтаксически неразличимых понятий языка-лексем.

Синтаксис языка обычно всегда описывается классом контекстно-свободных грамматик, разбираемых недетерминированным магазинным автоматом. Результатом синтаксического анализа является синтаксическое дерево, соответствующее выводу цепочки языка в грамматике [51].

Семантический анализ выявляет зависимости между частями программы, не описываемые контекстно-свободным языком. Основным формализмом, описывающим анализ семантики, являются атрибутные грамматики, а результатом его работы - дерево разбора с атрибутами. Формализм хорошо описывает семантику языков программирования, но эффективно реализуется лишь для классов грамматик с простым и легко проверяемым па зацикливание вычислением атрибутов. Неэффективность объясняется плохой сочетаемостью функциональной природы неупорядоченного вычисления атрибутов и последовательного расположения элементов программы. Поэтому обычно разбор семантики пишется вручную.

Методы трансляции условно делятся на прямые и синтаксические. Прямые методы трансляции ориентированы на конкретные входные языки. Это преимущественно эвристические методы, в которых на основе некой общей руководящей идеи для каждой конструкции языка подбирается её алгоритм трансляции. Этапы синтаксического и семантического анализа здесь обычно четко не разделены. Алгоритмы трансляции, применяемые в прямых методах, как правило, существенно зависят от входного языка.

Синтаксические методы трансляции отличаются более четким разделением этапов анализа синтаксиса и семантики. Некоторые из ранних синтаксических методов также ориентировались на конкретные входные языки, как, например, метод синтаксических подпрограмм, где каждой синтаксической единице языка соответствует отдельная подпрограмма.

Более поздние синтаксические методы основаны на теории формальных грамматик. Каждый из этих методов ориентирован не на конкретный входной язык, а на некоторый класс входных языков, точнее, на определён!!ый способ описания синтаксиса входных языков. Поэтому эти методы называют синтаксически-ориентированными. Для разбора цепочек длины п контекстно-свободных грамматик общего вида можно применять:

нисходящий синтаксический разбор с возвратами, обладающий временной сложностью Т = 0(е") и емкостной сложностью М = О(п);

восходящий разбор «сдвиг-свертка» с Т = 0(еп) и М = О(п);

алгоритм Кока-Янгера-Касами с Т = 0(п ) и М = О(гГ);

алгоритм Эрли с Т = О(іГ) (для однозначных грамматик) и М = 0(п ).

Алгоритм Эрли имеет лучшие характеристики среди всех универсальных алгоритмов разбора контекстно-свободных грамматик, поэтому, как правило, такие универсальные алгоритмы не применяются в реальных трансляторах, где желательна линейная зависимость требуемого времени и объема памяти от длины транслируемой программы. По этой причине далее рассматриваются более эффективно разбираемые подклассы контекстно-свободных языков, изображенные на рис. 1І, но в работе не определенные ввиду экономии места. Различают две основные стратегии методов синтаксического разбора, разделяемые по способу построения его дерева: сверху вниз (нисходящие) и снизу вверх (восходящие).

Обзор существующих компиляторов языка Sisal

Компилятор OSC Компилятор OSC [12] даже в своих последних версиях не поддерживает некоторые из возможностей языка Sisal 1.2. Общая схема последней версии компилятора OSC 14.0.1, дорабатываемая группой энтузиастов в рамках проекта «Sisal Lives!», приведена ниже, где в скобках указано количество процентов строк от их общего числа (100000 строк).

1. Стандартный препроцессор языка Си.

2. Блок PARSER (32%) переводит [69] текст модуля Sisal 1.2 программы в промежуточную форму IF1.

3. Блок IF1LD (1%) объединяет промежуточные формы IF1 различных модулей Sisal 1.2 программы в единую промежуточную форму IF1.

4. Блок IF ЮРТ (18%) производит машинно-независимую оптимизацию промежуточной формы IF1.

5. Блок IF2MEM (6%) добавляет код, заранее размещающий массивы.

6. Блок IF2UP (6%) переупорядочивает операции для минимизации числа копирований значений при изменении их составных частей.

7. Блок 1F2PART (4%) распараллеливает и векторизует циклы.

8. Блок IF2GEN (27%) генерирует код на языке Си (или Фортран).

9. Компилятор языка Си (или Фортрана).

10. Блок Runtime (6%) для управления памятью, взаимодействия с пользователем и поддержки распределённой параллельности. В блоке IF10PT реализованы оптимизации, позволяющие генерировать очень эффективный код для последовательных, векторных и параллельных машин с общей памятью:

подстановка функций;

устранение избыточных конструкторов массивов и записей;

вынесение инвариантов цикла из цикла;

слияние общих подвыражений;

вынесение общих частей ветвей условного выражения;

объединение циклов с изоморфными диапазонами и условных выражений с изоморфными предикатами;

вынесение условных выражений из циклов;

вынесение частей вычислений цикла в выделенные циклы;

раскрытие циклов с известным небольшим числом итераций;

константные вычисления и понижение сложности операций;

устранение излишнего создания и ложных зависимостей массивов;

внесение специфичных для условных ветвей вычислений;

устранение неиспользуемых вычислении.

Похожие диссертации на Модели и реализация транслирующих компонентов системы функционального программирования