Дипломная работа: Современный фортран для компьютеров традиционной архитектуры и для параллельных вычислительных систем

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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

Аналогичное правило действует и для использования указателя в левой части встроенного оператора присваивания. Для присваивания значения собственно указателю служит уже упоминавшийся оператор присваивания указателю (см. пример в 3.7.2.).

3.7.2 Оператор присваивания указателю устанавливает связь указателя с существующим объектом, оператор NULLIFY разрывает связь указателя с объектом.

Примеры

! Атрибут TARGET означает, что к массиву MATR можно обращаться

! с помощью указателя

REAL, TARGET :: MATR (M, N)

REAL, POINTER :: ROW (:), WINDOW (:, :)

ROW => MATR (M, :) ! ROW связывается со строкой матрицы

! WINDOW связывается с секцией массива MATR

WINDOW => MATR (I-1:I+1, J-1:J+1)

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

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

Пример

! Объявление указателей

REAL, DIMENSION (:, :), POINTER :: A, B

. . .

READ (*, *) N, M

! Создание и размещение динамических массивов

ALLOCATE (A (N, M), B (N, M))

При выполнении оператора DEALLOCATE освобождается память от тех динамических объектов, на которые ссылаются указатели, перечисленные в данном операторе.

Этот аппарат работы с создаваемыми массивами целесообразен в тех случаях, когда существенным является использование указателей; в противном случае лучше использовать механизм размещаемых массивов ( см. 3.6.).

3.8 Модули

Одним из наиболее важных новых средств языка является модуль - новый вид программных единиц. Программные единицы-модули служат для описания различных объектов (данных, производных типов, определяемых пользователем операций, процедур, интерфейсных блоков, namelist-списков), доступных другим программным единицам. Для доступа к объектам модуля, имеющим атрибут PUBLIC, используется оператор USE. Такие средства описания глобальных объектов являются более общими и гибкими, чем традиционный для Фортрана оператор COMMON.

Использование модулей вместе с аппаратом для описания новых типов и операций является удобным механизмом, обеспечивающим расширяемость языка; это позволяет создавать модули для конкретных приложений. Описание данных и операций над ними в модуле может быть скрыто от пользователя (такие объекты объявляются с атрибутом PRIVATE). Это позволяет при использовании модуля употреблять описанные в нем операции, не вникая в то, как эти операции выполняются (инкапсуляция).

Еще одно преимущество модулей заключается в том, что обеспечивается возможность зависимой (т.е. контролируемой) раздельной компиляции программных единиц. Это объясняется тем что информация, специфицируемая в модуле, доступна процессору при компиляции программных единиц, использующих данный модуль. Зависимая и в то же время раздельная компиляция повышает надежность программ и позволяет компилятору выполнять более широкий спектр оптимизирующих преобразований.

3.9 Поддержка объектно-ориентированного программирования

Предыдущие разделы уже позволяют читателю убедиться в том, что современный Фортран поддерживает значительную часть методологии объектно-ориентированного программирования (ООП).

ООП - это современная методология программирования. ООП позволяет использовать не только встроенные абстракции (как в традиционном программировании), но и определять собственные абстракции и тем самым позволяет описать программу в терминах близких к прикладной области.

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

В книге [16] обсуждается языковая поддержка ООП для С++ и Ада 95. Язык Фортран в книге отнесен к языкам с низким уровнем абстракции. Это справедливо только в отношении “старого” Фортрана. Что касается современного Фортрана, отметим, что в описании стандарта явно не указывается, какие средства обеспечивают поддержку тех или иных элементов ООП (это и не требуется в официальном документе).

Однако, как показали проведенные исследования (проект РФФИ №00-01-00043), такие средства имеются: расширяемость типов и операций, возможность статического контроля соответствия типов и соответствия формальных и фактических аргументов при вызове процедур, механизм инкапсуляции для реализации абстрактных типов данных, cтатический полиморфизм и частично наследование.

3.10 Новшества для процедур

Основные новшества, касающиеся процедур, - следующие: внутренние и рекурсивные процедуры, возможность специфицировать аргументы по назначению (IN, OUT, INOUT), возможность использования необязательных и ключевых параметров при вызове процедур, средства задания явного интерфейса, а также большой набор новых встроенных процедур (в языке более 100 встроенных процедур: математических, справочных и др.).

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

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

Новыми являются поэлементные процедуры, т.е. процедуры, аргументами и результатами которых могут быть как скаляры, так и массивы; результат получается таким, как если бы процедура была применена к соответствующим элементам каждого из массивов-аргументов. В Фортране 90 были введены только встроенные поэлементные функции, в Фортране 95 появилась возможность использовать также определяемые пользователем поэлементные процедуры. Поэлементные процедуры обеспечивают дополнительные возможности для выражения параллелизма.

3.11 Средства поддержки параллельности

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

В то же время Фортран 90/95 содержит богатый набор средств ориентированных на архитектуру с векторными операциями. Необходимость таких средств (помимо дополнительных удобств ) вызвана появлением на современных ЭВМ аппаратных средств векторной обработки.

До появления этих средств в стандарте для таких компьютеров создавались векторизующие компиляторы, помогающие эффективно использовать возможности, заложенные в аппаратуре. Однако автоматическая векторизация (т.е. выявление скрытого параллелизма) требует довольно сложного анализа исходной программы, и при этом некоторые конструкции последовательных яэыков могут затруднить или даже сделать невозможной векторизацию. В некоторые системы программирования вводились специальные директивы, помогающие компилятору выполнять векторизацию исходной программы, были разработаны и языковые расширения. Достаточно полная информация об исследованиях проблем векторизации содержится в сборнике статей [17] и в статьях [18, 19]; отечественные разработки для ПС-3000 и ЕС1191 описаны в [20, 21].

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

язык фортран многопроцессорный память

3.12 Поддержка структурного программирования

Современные стандарты языка, в отличие от Фортрана 77, поддерживают структурное программирование. Язык имеет полный комплект современных управляющих структур. В частности, в язык введена структурная конструкция цикла DO - END DO, в которой отсутствует метка. Кроме того, заголовок цикла может иметь как традиционную форму (с управляющей переменной цикла), так и новую форму с ключевым словом WHILE или без управляющей информации.

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

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

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

Средства работы с массивами как с целыми объектами (см. 3.5.) также служат улучшению структуры программы, так как во многих случаях позволяют обходиться без циклов и условных операторов.

3.13 Концепция эволюционного развития языка

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

Учитывая эти противоречивые факторы, было принято следующее решение: элементы языка, которые являются кандидатами на удаление, заранее объявляются устаревшими, нерекомендуемыми для использования.

В работе [9] предложен перечень средств, которые следует признать устаревшими в будущем стандарте Фортрана, даны обоснования и предложения по замене устаревших черт современными элементами языка.

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

4. Перспективы развития языка

В настоящее время разрабатывается проект будущего стандарта, рабочее название которого Фортран 2000 (на некотором этапе использовалось название Фортран 200x). Все средства Фортрана 95 сохранены (кроме быть может признанных устаревшими).

Проект языка Фортран 2000 предусматривает весьма существенные нововведения. Назовем лишь некоторые из наиболее значимых направлений:

Развитие средств объектно-ориентированного программирования (предполагается полный набор средств OOП).

Средства взаимодействия с Си.

Параметризованные производные типы.

Новые средства ввода/вывода (асинхронный ввод/вывод и др.).

Новые возможности, касающиеся размещаемых массивов.

Исключительные ситуации.

Более полная интеграция с операционной системой.

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

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

К настоящему времени завершена разработка следующих двух Технических отчетов, которые одобрены и уже являются стандартами:

Новые возможности, касающиеся размещаемых массивов [22].

Исключительные ситуации для операций с плавающей точкой[23].

Предполагается, что стандарт Фортран 2000 будет утвержден в конце 2004 года. В работе [24] уже содержатся некоторые предложения по дальнейшему развитию языка после утверждения Фортрана 2000.