Правильное использование ключевого слова 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)
аргументы, но опять-таки, только на основе значения аргументов.
в обоих случаях: те же аргументы - > тот же результат.
преимущество в том, что он гарантирует компилятору, что он может поменять порядок выполнения вокруг (для оптимизации кода) без изменения поведения программы.