Правильное использование ключевого слова Pure Fortran

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

у меня есть книга, Фортран 90/95 по S Chapman, который вводит pure ключевое слово, но странно не обеспечивает "хорошую практику кодирования".

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

Итак, где он лучше всего используется? Только в процедурах хочется полностью гарантия не имеет никаких побочных эффектов? Или, возможно, в процедурах планируется преобразовать в процедуры? (As elemental процедуры должны быть pure.)

3 ответов


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

помимо тех необходимых случаев, следует ли использовать PURE или нет-это в основном вопрос стиля, который несколько субъективный.

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

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


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

вверх по Fortran 2003,ELEMENTAL процедуры неявно PURE. Fortran 2008 добавляет IMPURE префикс, который можно использовать с ELEMENTAL процедуры для отключения этого аспекта.


если вы пытаетесь изменить переменную, которая имеет INTENT(IN), Он не будет компилироваться.

чистые функции могут иметь только INTENT(IN) аргументов, и возвращает значение, которое зависит только от аргументов. Чистая подпрограмма может изменять INTENT(OUT) и INTENT(INOUT) аргументы, но опять-таки, только на основе значения аргументов.

в обоих случаях: те же аргументы - > тот же результат.

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