Научная статья на тему 'Оптимизация программ функционально-потокового языка Пифагор'

Оптимизация программ функционально-потокового языка Пифагор Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
60
36
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ФУНКЦИОНАЛЬНОЕ ПРОГРАММИРОВАНИЕ / ОПТИМИЗАЦИЯ КОДА / УПРАВЛЯЮЩИЙ ГРАФ

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Васильев В.С.

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

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Оптимизация программ функционально-потокового языка Пифагор»

ОПТИМИЗАЦИЯ ПРОГРАММ ФУНКЦИОНАЛЬНО-ПОТОКОВОГО ЯЗЫКА ПИФАГОР

© Васильев В.С.*

Сибирский федеральный университет, г. Красноярск

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

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

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

Пифагор является потоковым языком, а значит, вычисления на нем производятся параллельно с управлением по готовности данных - программист не задает явно порядок вычисления, но описывает зависимости по данным между операторами [1]. Зависимости по данным определяют зависимости по управлению. Однако управление можно оптимизировать отдельно - т.к. управляющие связи выделены в специальный граф (УГ, управляющий граф).

Немаловажно, что каждый оператор в программе на Пифагоре имеет свое состояние, которое изменяется под воздействием сигналов, передаваемых по УГ. Возможно создание оператора в неначальном состоянии при запуске программы, это используется при проведении некоторых преобразований.

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

* Ассистент.

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

Наконец, для Пифагора определены различные высокоуровневые синтаксические средства, к ним, относятся параллельные списки. Функционирование этих средств подчиняется определенным правилам (аксиомам), закрепленным в модели вычислений языка [2]. Аксиомы языка могут использоваться при оптимизации наравне с общеизвестными математическими правилами.

Интерпретация параллельных списков

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

Среди прочих аксиом, в модели вычислений языка закреплены:

- интерпретация параллельных списков. Параллельный список данных [х, у, z] подается на обработку параллельному списку функций [р g]. В результате выполнения операции формируется список из результатов обработки каждого элемента данных, каждой функцией:

[х, у, 7] : £ §] <=> [х*, у*, х:& у:& ггё].

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

[а, [Ь, с], а] <=> [а, Ь, с, а].

- при попадании внутрь списка данных, параллельный список может быть полностью устранен:

[х, у, 7] : () <=> ([X, у, 7]) <=> (X, у, 7).

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

Упрощение управляющих автоматов

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

1Ъо

Рис. 1. Общий вид оператора интерпретации

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

Рис. 2. Оптимизированный автомат оператора интерпретации Оптимизация лишних управляющих дуг

Язык Пифагор является потоковым - управление в нем производит по готовности данных. Зависимости по данным между операторами в этом языке описываются в информационном графе. В силу того, что зависимости по данным определяют порядок вычисления, т.е. передачу управления - управляющий граф строится на основе информационного графа.

Наличие УГ дает возможность находить и удалять лишние дуги, т.е. такие дуги, передача сигналов управления по которым не влияет на порядок вычислений. Пример оптимизации схематично показан на рис. 3, стрелками показаны зависимости по управлению. Оператор X зависит от операторов Y и 2, поэтому не может быть запущен до того, как оба этих оператора завершат работу. В тоже время, оператор 2 зависит от оператора Y, поэтому можно утверждать, что оператор 2 не завершит свою работу раньше, чем Y, а значит, передача сигнала готовности от Y к X является избыточной.

Рис. 3. Оптимизация лишних управляющих дуг

Однако, если удалить управляющие дуги, то узел-приемник данных не получит сигнала готовности и не сменит состояние автомата. Поэтому помимо удаления дуг выполняется изменение начального состояния автоматов. Узел X на рис. 3 должен быть изначально переведен в состояние, соответствующее готовности узла Y.

Оптимизация рекурсии

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

revTail - реверс списка с хвостовой рекурсией 1

// X : 1 - исходный список 2

// X : 2 - количество обработанных элементов 3

// X : 3 - накопитель результата 4

revTail « funcdef X { //5

IList « X : 1; 11 6

Counter « X : 2; 111

TOList « X : 3; //8

Len « IList : I; 11 Ъ

// 10

[((Counter, Len) : [>=, <]) : ?] Л ( //11

{TOList}, 11 12

{ 11 13

( 11 14

IList, (Counter, 1) : +, // 15 (IList : Counter, TOList : []) //16

) : revTail 11 17

} 11 18

):. » return 11 19

} 11 20

Рис. 4. Исходный код функции реверса списка с хвостовой рекурсией

На рис. 4 приведен исходный код функции, выполняющей реверс списка. В 6-8 строках выполняется получение аргументов функции, в 9 строке определяется длина исходного списка, в 11 - выполняется сравнение счетчика элементов с длиной списка, в результате которого оператору return будет передано либо содержимое накопителя результата (строка 12 -

случай, когда весь список обработан), либо результат рекурсивного вызова (строка 17).

Из примера видно, что результат рекурсивного вызова помещается в задержанный список, затем в список данных. К списку данных применяется результат работы оператора селекции, а затем - оператор «точка», раскрывающий параллельный список.

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

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

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

Оптимизация инварианта

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

Из примера на рис. 4 видно, что на каждой итерации цикла выполняется определение длины исходного списка (в 8 строке). Исходный список во время вычисления не изменяется, а значит, вычисление его длины является инвариантом и может быть вынесено из цикла.

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

revTail « funcdef X { IList « X : 1; Len << IList : |;

(X:[], Len) : revTail_inv » return

}

revTail_inv « funcdef X {

IList << X : 1; // исходный список

Counter << X : 2; // кол. обработанных эл-ов

TOList « X : 3; // накопитель результата

Len << X : 4; // длина списка

[((Counter, Len) : [>=, <]) : ?] л (

{TOList}, {

(

IList, (Counter, 1) : +, (IList : Counter, TOList : []) ) : repeat

}

):. >> return

// 1

// 2

// 3

// 4

// 5

// 6

// 7

8 й

У 10

// 11

// 12

// 13

// 14

// 15

// 16

// 17

// 18

// 19

// 20

// 21

Рис. 5. Реверс списка после выноса инварианта из цикла

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

Заключение

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

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

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

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

1. Легалов А.И. Функциональный язык для создания архитектурно -независимых параллельных программ // Вычислительные технологии. - 2005. -№ 1 (10). - С. 71-89.

2. Легалов А.И., Савченко Г.В., Васильев В.С. Событийная модель вычислений, поддерживающая выполнение функционально-потоковых параллельных программ // Системы. Методы. Технологии. - 2012. - № 1(13). -С. 113-119.

ОБ ОБЪЕКТНО-ОРИЕНТИРОВАННОМ ПОДХОДЕ К МОДЕЛИРОВАНИЮ ИНФОРМАЦИОННЫХ ВОЗДЕЙСТВИЙ ПРИ ВЕДЕНИИ ПРОТИВОБОРСТВА В КОМПЬЮТЕРНЫХ СЕТЯХ

© Савва Ю.Б.*

Государственный университет - Учебно-научно-производственный комплекс,

г. Орёл

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

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

* Доцент кафедры «Информационные системы», кандидат технических наук.

i Надоели баннеры? Вы всегда можете отключить рекламу.