Написание надежного и "современного" кода на Фортране - PullRequest
63 голосов
/ 03 мая 2010

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

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

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

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

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

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

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

Ответы [ 7 ]

45 голосов
/ 03 мая 2010

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

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

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

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

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

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

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

39 голосов
/ 03 мая 2010

Мои 5 центов.

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

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

Рекомендую прочитать этот курс: Введение в современный фортран . М. С. Б. упомянул знаменитый «Фортран 95/2003 Объясненный», но эта книга достаточно большая и полная деталей. Курс, упомянутый выше, наоборот, является хорошим началом. Также ознакомьтесь с Интерактивным курсом по программированию на 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.

13 голосов
/ 03 мая 2010

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

Отличная книга, чтобы узнать об этих и других особенностях: «Фортран 95/2003 объяснил» Меткалф, Рейд и Коэн. Это определенно хорошая идея - изучить лучшие возможности современного Фортрана, а не продолжать писать Фортран 77 - если необходимо, написать стандарты / руководства по кодированию.

6 голосов
/ 19 января 2012

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

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

4 голосов
/ 03 мая 2010

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

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

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

(Это может показаться «очевидным» современным допущениям в программировании, но в устаревшем мире Fortran большинство из них - большие изменения в типичном рабочем процессе программиста)

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

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

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

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

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

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

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

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

3 голосов
/ 19 января 2012

Я только что нашел эту серию из двух частей по объектно-ориентированному программированию с F2003. Здесь много хороших вещей:

Часть 1: http://www.pgroup.com/lit/articles/insider/v3n1a3.htm

Часть 2: http://www.pgroup.com/lit/articles/insider/v3n2a2.htm

Там есть отличные примеры, и все очень четко объясняется.

1 голос
/ 11 апреля 2013

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

...