Написание надежного и "современного" кода Fortran

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

Итак, предположим, что новый проект должен использовать Fortran 90, но я хочу построить из него самую современную архитектуру программного обеспечения, совместив его с последними компиляторами (Intel ifort, но также включая компиляторы Sun/HP/IBM )

Итак, я думаю о том, чтобы навязывать вещи, которые широко известны как здравый смысл, но еще не стандарт в моей среде:

  • запрещена глобальная переменная, отсутствуют точки доступа, метки перехода, implicit none и т.д.
  • "объектно-ориентированное программирование" (модули с типами данных и соответствующими подпрограммами)
  • модульные/многоразовые функции, хорошо документированные, многоразовые библиотеки.
  • утверждения/предварительные условия/инварианты (реализованы с использованием инструкций препроцессора)
  • модульные тесты для всех (большинство) подпрограмм и "объектов"
  • интенсивный "режим отладки" (#ifdef DEBUG) с большим количеством проверок и возможны все возможные проверки компилятора Intel (границы массива, подпрограммы и т.д.).
  • унифицированный и принудительно разборчивый стиль кодирования с использованием помощников инструмента обработки кода.

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

Я искал информацию о объектно-ориентированном Fortran, программировании по контракту (утверждения/предварительные условия/и т.д.) и нашел только уродливые и устаревшие документы, синтаксисы и документы, сделанные людьми, не имеющими масштабного участия в проекте, и мертвые проекты.

Любые хорошие URL-адреса, советы, справочные материалы/книги по этому вопросу?

Ответ 1

Мои 5 центов.

Fortran Wiki является хорошей отправной точкой. В нем есть статьи о различных аспектах программирования с использованием современного Fortran. Модульное тестирование, отладка, общее программирование и т.д. Также очень интересна таблица о поддержке компилятора для стандарта Fortran 2003. (Как уже упоминал Blklight, некоторые компиляторы не доступны в 2003 году. Хорошее место для сравнения разных компиляторов.)

Я парень на C++, но я застрял в проектах F90.

Я рекомендую прочитать этот курс: Введение в Modern Fortran. M. S. B. упомянул известный "Fortran 95/2003 Explained", но эта книга достаточно большая и полная подробностей. Курс, упомянутый выше, наоборот, является хорошим местом для начала. Также взгляните на Интерактивный курс программирования Fortran 90 из Университета Ливерпуля.

Ошибки в Fortran 90 программ, которые могут вас удивить. Это название страницы говорит само за себя. =)

Хммм... У меня также есть в моих закладках некоторая ссылка на PSTI RESEARCH LECTURE SERIES "НАУЧНАЯ ВЫЧИСКА С FORTRAN 95" . Попробуйте.

J.F. Себастьян упомянул F2Py и посоветовал преподавать Python. Я соглашаюсь с его мнением. Python - не мой любимый язык. Но это достаточно полезно, чтобы научить его. В дополнение к уже упомянутым препроцессорам (многие из которых написаны на Python) и F2Py не пропускают SCons - современный инструмент для создания программного обеспечения.

P.S. На прошлой неделе я купил электронную книгу на lulu.com. Научная разработка программного обеспечения в Фортране Дрю Маккормак. Надеюсь, это будет хорошее чтение, но у меня нет времени. Автор является разработчиком Forpedo (одного из Fortran-специфичных препроцессоров, упомянутых в Fortran Wiki) и автором многих книг и руководств по программированию Objective-C и Python.

Ответ 2

Я предлагаю, чтобы OP отказался от отношения, которое Fortran является чем-то противным, которое можно вынести в высокопроизводительных научных вычислениях и погрузиться в него с энтузиазмом. Если ОП сохранит это довольно пренебрежительное мышление, то его/ее вся карьера Фортранна будет борьбой. И действительно, вы ничего не можете сделать с Fortran, что вы не можете сделать с С++, так зачем беспокоиться, если вы действительно не хотите?

В списке пулей OP нет ничего, что многие из нас, которые работали с Fortran в течение последних 30 лет, не выполняли (поскольку широко распространены компиляторы Fortran 90, но некоторые из них до этого тоже). Да, есть ученые-вычислители, а ученые-разработчики программного обеспечения, которые понимают указатели, знают, что многие (ошибочные) люди начинают рассчитывать на 0 и что глобальные переменные являются ПЛОХОЙ.

Как и @MSB, я бы рекомендовал Metcalf и другие книги как источник информации о возможностях и особенностях современного Fortran. И, как @MSB, я поднимаю бровь в идею использования C или С++ для упаковки библиотек, для которых есть либо эквиваленты Fortran, либо более совершенные подходы. Стандартная совместимость 2003 с функциями C, которые реализованы в Intel Fortran, упрощает вызов C-библиотек напрямую.

Я бы поставил вопрос с OP, что модульный код - цель сама по себе. Цели, я предлагаю, правильный, проверенный и надежный, надежный, надежный код. Модульность - это один из способов поддержки достижения этих целей, но это тактика, а не конечная точка. Если бы я думал, что мы могли бы писать хорошие (в вышеперечисленных смыслах) программы, содержащие 10 ^ 6 строк кода без модульности, я бы не стал разбираться в модульности.

ОК, теперь некоторые конкретные подсказки, чтобы добавить к тому, что OP уже намерено делать или было сказано:

  • используйте KIND для объявлений переменных для обеспечения требуемой точности; не оставляйте это для параметров компилятора или догадок о том, что этот компилятор может сделать на этом процессоре;
  • использовать операции с массивами, где это возможно, а не явные петли; это помогает сделать код более безопасным - иногда за счет производительности, но вам нужно проверить это на индивидуальной основе;
  • записывать функции PURE;
  • не зависят от предварительных процессоров или других неперформенных подходов к правильности кода (и т.д.), записывайте свои утверждения и предварительные условия (и т.д.) в Fortran; предварительные процессоры (и т.д.) не выживут до тех пор, пока хорошо написаны программы Fortran и будут основным препятствием для переносимости сейчас и в будущем;
  • Если у вас есть доступ к Intel Fortran, вы получите доступ к Intel MKL (и IPP) и используйте эти библиотеки, вместо того, чтобы писать свой собственный код;
  • планируют использовать OpenMP и MPI для параллелизации, они очень хорошо подходят Fortran; о, и планируете идти параллельно как можно скорее, это намного интереснее, чем серийное программирование;
  • этот набор Fortran Coding Standards является хорошим началом, но, вероятно, не более того; 1-е издание Code Complete имело гораздо больше о программировании Fortran (77), чем в текущем издании, но большинство его рекомендаций можно применять на любом языке, на котором вы пишете.

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

Ответ 3

Fortran 90/95/2003 разработан таким образом, что можно писать модульный код, если хотите, посредством добавления модулей, частных/общедоступных, определенных пользователем типов и т.д. Fortran 2003 представляет дополнительные объектно-ориентированные функции. Нет смысла подключаться к C, чтобы добавить malloc, когда Fortran 90 "распределяет", чтобы динамически распределять массивы Fortran более безопасным способом. Размещение ваших процедур (функций и подпрограмм) в модулях, а затем "использование" модулей приведет к проверке интерфейсов. Можно использовать множество параметров отладки/проверки компиляторов, таких как проверка границ индексов.

Отличная книга, чтобы узнать об этих и других возможностях: "Fortran 95/2003 Explained" от Metcalf, Reid and Cohen. Это определенно хорошая идея, чтобы узнать лучшие возможности современного Fortran, а не продолжать писать FORTRAN 77 - при необходимости писать стандарты/руководство по кодированию.

Ответ 4

В течение последних нескольких лет мы с коллегой разработали довольно большую вычислительную библиотеку с нуля в современном Fortran со многими функциями, о которых вы говорите: объектная ориентация, модульный/многоразовый, согласованный стиль кода и многое другое (у нас нет проделали отличную работу с модульными тестами, хотя - нужно это сделать), а затем оберните все это, чтобы предоставить интерфейсы с С++, Python и т.д. Другие здесь указали на все книги и ссылки, которые я бы рекомендовал (и многое другое), поэтому я не буду их повторять. Моя причина для публикации - это просто сказать, что действительно возможно сделать это с помощью Fortran и создать что-то великолепное, поэтому придерживайтесь его.

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

Ответ 5

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

  • попробуйте придерживаться стандарта (Fortran - это стандартизованный язык, и, придерживаясь стандартных функций языка, и избегая специальных расширений для поставщика, у вас будет переносная программа между платформами, для которой вы можете быть уверены, что компилятор не даст никаких проблемы). Я не знаю, где я скачал свою копию, но я уверен, что вы можете загрузить последний проект (остерегайтесь, многие функции fortran 2008 или 2003, если на то пошло, все еще не реализованы в currect компиляторе, хотя многие почти там в настоящее время... Cray является одним) из страница J3
  • по всем вопросам, касающимся вышеизложенного, я сердечно рекомендую comp.lang.fortran usenet group - у него есть не только очень хорошо осведомленные люди (например, Ричард Мэн... вероятно, захочет ответить на любой стандарт вопросы соответствия, которые вы можете задать, с большим количеством подробностей, если их попросят красиво... то же самое касается многих других), но у него также есть люди, которые работали над крупномасштабными проблемами и будут знать и быть готовы дать совет по вашей теме
  • книги - в дополнение ко всем уже упомянутым (Metcalf, Reid и Cohen книга также имеет мою рекомендацию, также "Руководство Fortran 2003" Мэн и другие...), попробуйте найти себе копию Стивена Дж. Чепмена "Fortran 95/2003 для ученых и инженеров" ... занимает немного уверенную позицию по некоторым темам, но все же, в целом очень приятно книга, со многими "хорошими методами программирования" ).
  • Кроме того, не знаю, если вы столкнулись с этим "Объектно-ориентированное программирование через Fortran 90/95"

Некоторые комментарии к вашему тексту:

(Все это может показаться "очевидным" современными предположениями о программировании, но в мире fortran для большинства из них большие изменения в типичном рабочем процессе программиста)

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

Цель состоит в том, чтобы иметь надежный, поддерживаемый и модульный код. Принимая во внимание, что в типичном fortran модульность часто не является основной целью, а код заслуживает доверия только в том случае, если оригинальный разработчик был очень умным, и с тех пор код не менялся! (я немного шучу здесь, но не сильно)

Кто-то однажды сказал, и вы не поверите, насколько это верно:
"Нет ничего более постоянного, чем временное исправление".

Любой хороший URL, совет, справочный документ/книги по теме?

Учитывая несколько выше.

Кроме того, при написании этого ответа я вижу High Perf. Марк опубликовал очень хороший ответ, с которым я в основном согласен... он идет немного подробнее о стандартном соблюдении.

Кроме того, моя рекомендация состояла бы в том, чтобы определенно поставить этот вопрос также на comp.lang.fortran... Похоже, вы можете получить гораздо более качественные ответы там, а затем здесь (я считаю, что не более 20 или около того fortran программистов на весь стековый поток).

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

Ответ 7

Если вы хотите посмотреть на большую программу Fortran в OO, перейдите на сайт www.mohid.com. Это GPL. Я согласен с тем, что писать современную Fortran OO уже недостаточно, необходимо включить концепции функционального программирования. Я делаю некоторые исследования по этому вопросу, и я считаю, что основной недостающей особенностью является функция лямбда (анонимность). С другой стороны, я думаю, что для выполнения распараллеливания лучше использовать маршрут MPI, а не OpenMP.