Дата публикации: Dec 15, 2012 8:36:22 PM
Объекты языка Фортран - объекты данных и процедуры - обладают рядом атрибутов, которые назначаются по умолчанию либо указываются явно. Атрибуты можно указывать при объявлении объекта, либо отдельно, одноименным оператором. Так, можно указать все атрибуты объекта сразу:
REAL, DIMENSION(2), SAVE:: A
а можно по-отдельности:
REAL A
DIMENSION(2):: A
SAVE:: A
В первом случае мы как-бы следуем за объектом, перечисляя его атрибуты, а во втором - за атрибутами, указывая для каждого объекты, которые им обладают.
Перечислим атрибуты, постаравшись ничего не пропустить.
Во-первых, атрибутом можно считать тип. Тип присущ объектам данных и функциям.
Атрибут PARAMETER превращает объект данных в именованную константу.
Атрибут DIMENSION указывает на то, что объект данных является массивом,
а CODIMENSION - комассивом, то есть объектом, доступным из других образов (копий программы, выполняемых параллельно).
Массивы могут иметь атрибут CONTIGUOUS, означающий сплошность - при этом элементы массивы обязаны располагаться подряд в памяти;
атрибут ALLOCATABLE означает, что массив размещаемый, то есть память для него выделяется и освобождается в ходе выполнения программы при вызове специальных операторов (allocate и deallocate), причем размер и конфигурация массива заранее неизвестны.
Атрибут POINTER обозначает указатель (причем прочие атрибуты описывают цели оного - например, совместное указание атрибутов DIMENSION и POINTER описывает не массив указателей, а указатель на массив), то есть специальный объект данных, который может быть "связан" с другим объектом данных и использоваться как синоним оного.
Атрибут TARGET разрешает объекту данных быть целью указателя.
Атрибут SAVE означает, что объект данных сохраняет свое значение после выхода из области видимости (например, из процедуры); следует помнить, что этот атрибут назначается по умолчанию при инициализации объектов данных в блоке объявлений в процедуре, что может быть неожиданно.
Атрибут ASYNCHRONOUS отмечает объект как доступный для асинхронного ввода/вывода, который производится без задержки вычислений.
Ряд атрибутов связан с аргументами процедур.
INTENT описывает назначение аргумента - входящий (INTENT(IN)), исходящий (INTENT(OUT)), или смешанный (INTENT(INOUT)).
OPTIONAL сопутствует необязательному аргументу.
VALUE означает, что аргумент передается по значению; при этом в процедуру поступает копися фактического аргумента - формальный аргумент может подвергаться изменениям (входящий аргумент - не может), но на фактическом аргументе это не скажется.
Объекты программы, объявленные модуле, могут иметь атрибуты PUBLIC, PRIVATE и PROTECTED: в первом случае они экспортируются и доступны вне модуля в области видимости, которая экспортирует модуль посредством USE, во втором - доступны только в модуле, а в третьем - доступны для чтения извне модуля, но менять их могут только процедуры из того же модуля (это полезно для связанных величин, например, выраженных в разных единицах).
Как сказано выше, процедуры тоже могут иметь атрибуты.
Стерильные процедуры имеют атрибут PURE - они не могут менять что-либо вне своего тела, а стерильные функции имеют, кроме того, только входящие аргументы (подпрограммы могут иметь исходящие агументы, но назначение каждого должно быть указано явно).
Поэлементные процедуры имеют атрибут ELEMENTAL - у них скалярные аргументы и (у функций) скалярный результат, но они могут вызываться с массивными (одной конфигурации) аргументами и применяться к каждому элементу массива. Поэлементные процедуры стерильны по умолчанию, но стерильность можно отключить, указав атрибут IMPURE.
Рекурсивные процедуры объявляются с атрибутом RECURSIVE - в противном случае вызов процедуры из нее же (в том числе косвенно) невозможен. Запрет на рекурсивный вызов позволяет использовать некоторые оптимизации. Кстати, имя функции в ее теле - это имя результата, если имя результата не назначено с помощью слова RESULT. Для рекурсивных функций это необходимо делать, поскольку имя функции трактуется как имя функции.
Атрибут MODULE подчеркивает, что процедура модульная, а EXTERNAL - что внешняя. Это позволяет избежать двусмысленности при наличии одноименной встроенной процедуры и повышает переносимость. Процедура может иметь атрибут INTRINSIC, означающий, что она встроенная. Если встроенная процедура используется как фактический параметр процедуры, она должна иметь этот атрибут.
Еще существует атрибут BIND(C), синтаксис которого намекает о возможной связи в будущем с дургими языками - он отмечает объект как взаимодействующий с языком C, то есть обеспечивает совместимость с аналогичным объектом в этом языке (скаляром, массивом, функцией и т.п.).