Написание надежного и" современного " кода Fortran
в некоторых научных средах вы часто не можете обойтись без FORTRAN, поскольку большинство разработчиков знают только эту идиому, и есть много устаревшего кода и связанного с ним опыта.
И честно говоря, есть не так много других кросс-платформенных вариантов высокая производительность Программирование (C++ выполнит эту задачу, но синтаксис, нулевые массивы и указатели не совместимы с некоторыми людьми).
Итак, предположим новый проект должны используйте Fortran 90, но я хотите построить самую современную архитектуру программного обеспечения из него, будучи совместимым с самыми последними компиляторами (Intel ifort, но также включая компиляторы Sun / HP / IBM)
поэтому я думаю о навязывании материала, который широко известен как здравый смысл, но еще не является стандартом в моей среде:
- глобальная переменная запрещена, нет gotos, нет ярлыков перехода,
implicit noneи т. д. - "объектно-ориентированное программирование "(модули с типами данных и связанные с ними подпрограммы)
- модульные / многоразовые функции, хорошо документированные, многоразовые библиотеки
- утверждения / предварительные условия / инварианты (реализованные с помощью операторов препроцессора)
- модульные тесты для всех (большинства) подпрограмм и "объектов"
- интенсивный "режим отладки" (
#ifdef DEBUG) С большим количеством проверок и всеми возможными проверками компилятора Intel (границы массива, интерфейсы подпрограмм и т. д.) - равномерный и принудительный разборчивый стиль кодирования, используя код обработка инструментальных помощников.
цель со всем этим, чтобы иметь надежный, ремонтопригодный и модульный код. В то время как во многих устаревших кодах повторное использование не было важной целью.
Я искал ссылки на объектно-ориентированный Fortran, Программирование по контракту (утверждения/предварительные условия/и т. д.), а нашли только уродливые и устаревшие документы, синтаксисы и бумаги, сделанные людьми без масштабного участия в проекте, и мертвые проекты.
есть ли хорошие URL-адреса, советы, справочные документы / книги по этому вопросу?
7 ответов:
мои 5 копеек.
The Fortran Wiki - это хорошая отправная точка. В нем есть статьи о различных аспектах программирования с использованием современного Фортрана. Модульное тестирование, отладка, обобщенное программирование, и т. д. Также очень интересно таблица on поддержка компилятора для стандарта Fortran 2003 доступна. (Как уже упоминалось Blklight, некоторые функции 2003 года недоступны в компиляторах. Это хорошее место для сравнения различных компиляторов.)
Я C++ парень, но я застрял с некоторыми проектами F90.
рекомендую прочитать этот курс:введение в современный Фортран. М. С. Б. упоминал знаменитый "Fortran 95/2003 Explained", но эта книга достаточно большая и полная деталей. Курс, упомянутый выше, напротив, является хорошим местом для начала. Также взгляните на Интерактивный Курс Программирования Fortran 90 из Университета Ливерпуля.
ошибки в программах Fortran 90 Это Может Вас Удивить. Название этой страницы говорит само за себя. =)
Хммм... У меня также есть в моих закладках некоторые ссылки на СЕРИЯ ЛЕКЦИЙ PSTI RESEARCH "НАУЧНЫЕ ВЫЧИСЛЕНИЯ С FORTRAN 95". Дайте ему попробовать.
J. F. Себастьян упомянул F2Py и дать совет, чтобы научить Python. Я разделяю его мнение. Python-это не мой любимый язык. Но это достаточно полезно, чтобы научить его. В дополнение к уже упомянутым препроцессорам (многие из которых написаны в Python) и F2Py не пропускают SCons - современный инструмент построения программного обеспечения.
P. S. На прошлой неделе я купил электронную книгу в lulu.com. разработка научного программного обеспечения в Фортране Дрю Маккормак. Я надеюсь, что это хорошее чтение, но вдруг нет времени. Автор является разработчиком Forpedo (один из Fortran-специфических препроцессоров, упомянутых в Fortran Wiki) и автором многих книг и учебных пособий по программированию Objective-C и Python.
Я предлагаю, чтобы OP отбросил отношение к тому, что Fortran-это что-то неприятное, которое нужно терпеть в высокопроизводительных научных вычислениях, и с энтузиазмом погружается в него. Если OP сохраняет это довольно пренебрежительное мышление, то вся его / ее карьера кодирования Fortran будет борьбой. И действительно, нет ничего, что вы можете сделать с Fortran, что вы не можете сделать с C++, так зачем беспокоиться, если вы действительно не хотите ?
в списке пуль ОП нет ничего, что многие из нас, кто был работа с Fortran в течение последних 30 лет не выполнялась (так как широко распространена доступность компиляторов Fortran 90, но некоторые из них до этого тоже). Да, есть ученые-вычислители и инженеры-программисты, которые понимают указатели, знают, что многие (заблуждающиеся) люди начинают считать в 0 и что глобальные переменные-это плохо.
Как @MSB я бы рекомендовал Metcalf et alкнига как источник информации о возможностях и особенностях современный Фортран. И, как и @MSB, я поднимаю бровь при мысли об использовании C или C++ для обертывания библиотек, для которых есть либо эквиваленты Fortran, либо лучшие подходы полностью. Совместимость стандарта 2003 года с функциями C, которые реализованы в Intel Fortran, делает его проще, чем когда-либо, чтобы вызвать библиотеки C напрямую.
Я бы принял проблему с OP, что наличие модульного кода является самоцелью. Цели, я предлагаю, правильные, проверяемые и валидируемые, надежные, надежный код. Модульность является одним из способов поддержки достижения этих целей, но это тактика, а не конечная точка. Если бы я думал, что мы можем писать хорошие (в предыдущих смыслах) программы, содержащие 10^6 строк кода без модульности, я бы не стал беспокоиться о модульности.
хорошо, теперь некоторые конкретные советы, чтобы добавить к тому, что ОП уже намеревается сделать или было сказано:
- используйте виды в объявлениях переменных для обеспечения требуемой точности; не оставляйте это для параметров компилятора или догадок о том, что этот компилятор может сделать на этом процессоре;
- используйте операции с массивами везде, где это возможно, а не явные циклы; это помогает сделать код более безопасным-иногда за счет производительности, но вам нужно проверить это в каждом конкретном случае;
- написать чистые функции;
- не зависите от препроцессоров или других не Фортранских подходов к правильности кода (и т. д.), напишите свои утверждения и предварительные условия (и т. д.) В Fortran; препроцессоры (etc) не выживут так долго, как хорошо написанные программы Fortran, и будут главным препятствием для переносимости сейчас и в будущем;
- если у вас есть доступ к Intel Fortran получить доступ к Intel MKL (и IPP) и использовать эти библиотеки, а не писать свой собственный код;
- планируйте решать OpenMP и MPI для распараллеливания, они оба очень хорошо подходят для Fortran; о, и планируйте идти параллельно как можно скорее, это намного веселее, чем серийный Программирование;
- этот набор Стандарты Программирования На Фортране это хорошее начало, но, вероятно, не более того; 1-е издание Код было намного больше о программировании Fortran (77), чем в текущем издании, но большинство его советов могут быть применены на любом языке, на котором вы пишете.
и, наконец, в наши дни я думаю, что программы и программисты Fortran лучше информированы идеями функционального программирования, чем идеями объектно-ориентированное программирование.
Fortran 90/95/2003 разработан таким образом, что можно писать модульный код, если вы хотите, путем добавления модулей, частных/публичных, пользовательских типов и т. д. Fortran 2003 представляет дополнительные объектно-ориентированные функции. Нет смысла подключаться к C, чтобы добавить malloc, когда Fortran 90 имеет "выделять" напрямую динамически выделять массивы Fortran более безопасным способом. Размещение ваших процедур (функций и подпрограмм) в модулях, а затем "использование" модулей приведет к тому, что интерфейсы будут проверен. Можно использовать множество параметров отладки / проверки компиляторов, таких как проверка границ индекса.
отличная книга, чтобы узнать об этих и других особенностях: "Fortran 95/2003 объяснил" Меткалф, Рид и Коэн. Это, безусловно, хорошая идея, чтобы узнать лучшие черты современного Fortran, а не продолжать писать FORTRAN 77-при необходимости, написать стандарты кодирования / руководство.
за последние несколько лет мы с коллегой разработали довольно большую вычислительную библиотеку с нуля в современном Fortran со многими функциями, которые вы упомянули - объектная ориентация, модульный/многоразовый, согласованный стиль кода и многое другое (мы не сделали большую работу с модульными тестами, хотя - нужно это сделать), а затем обернуть все это, чтобы обеспечить интерфейсы с C++, Python и многое другое. Другие здесь указали на все книги и ссылки, которые я рекомендовал бы (и больше), поэтому я не буду повторять их. Моя причина для публикации-просто сказать, что это действительно возможно сделать с Fortran и создать что-то отличное, поэтому придерживайтесь его.
Я также отмечу, как вам повезло, что вы начинаете после того, как большая часть стандарта Fortran 2003 была реализована во всех основных компиляторах. Вы найдете много этих функций (например, указатели на процедуры), которые будут очень полезны.
Я очень спешу, поэтому простите меня, если я делаю этот ответ в виде контрольных точек вместо разумных предложений.
- попробуйте придерживаться стандартный (Fortran-это стандартизированный язык, и, придерживаясь стандартных языковых функций и избегая конкретных расширений поставщика, у вас будет портативная программа между платформами, для которой вы можете быть уверены, что компилятор не даст никаких проблем). Я не знаю, где я скачал свою копию, но я довольно конечно, вы можете скачать последний проект (будьте осторожны; многие функции fortran 2008 или 2003 по этому вопросу все еще не реализованы в компиляторе currect, хотя многие из них практически нет в настоящее время ... Крей, будучи одним) из страница J3
- для всех вопросов, касающихся выше, я сердечно рекомендую comp.ленг.Фортран группа usenet-там не только есть очень знающие люди (например. мистер Ричард Мэн ... вероятно будьте готовы ответить на любые стандартные вопросы соответствия, которые вы можете задать, с большим количеством деталей, если их задают красиво ... то же самое касается и многих других), но у него также есть люди, которые работали над крупномасштабными проблемами и наверняка знают и готовы дать совет по вашему теме
- книги-в дополнение ко всем уже упомянутым (книга Меткалфа, Рида и Коэна также имеет мою рекомендацию, а также "Fortran 2003 handbook" Мэна и других ...), попробуйте найти себе копию "на Fortran 95/2003 для ученых и инженеров" ... занимает немного слишком уверенную позицию по некоторым темам, но все же, в целом очень хорошая книга, со многими "хорошими практиками программирования" упоминается)
- кроме того, не знаю, если вы пришли через этот "объектно-ориентированное программирование через Fortran 90/95"
некоторые комментарии к вашему тексту:
(все это может показаться" очевидным " современным предположения программирования, но в унаследованном мире fortran большинство из них являются большими изменениями в типичном рабочем процессе программиста)
даже в современном Фортране мира, некоторые из этих предположений являются сомнительными ... помните, что программисты fortran-это не программисты (я повторяю это в сжатой форме, я уже много раз писал об этом на этом форуме), а инженеры, ученые и так далее. Для них (нас?) код-это не цель, а лишь инструмент ... для профессиональных программистов код это все; у них нет ничего "за это" ... поэтому они так дорожат им. Для нас, инженеров, это просто средство получения желаемого результата ... имея это в виду, хотя хорошие практики программирования платят позже, не нужно настаивать на них там, где нет очевидной необходимости в них.
цель со всем этим должна иметь благонадежный, ремонтопригодный и модульный код. В то время как в типичном fortran модульность часто не является основной целью, и код заслуживает доверия только если первоначальный разработчик был очень умным, и код не был изменен с тех пор ! (я немного шучу, но не сильно)
кто-то однажды сказал, и вы не поверите, как это верно:
"Нет ничего более постоянного, чем временное решение".любой хороший URL, советы, справочный документ / книги по этому вопросу?
приведенный несколько выше.
кроме того, при написании этого ответа я вижу высокий Perf. Марк выложил очень хороший ответ, с которым я в основном согласен ... он идет немного более подробно о стандартном придерживаясь.
кроме того, моя рекомендация состояла бы в том, чтобы определенно опубликовать этот вопрос также на comp.ленг.Фортран. .. Я полагаю, что вы можете получить гораздо более качественные ответы там, а затем здесь (я считаю, что на всем stackoverflow не более 20 или около того программистов fortran).
был набор руководящих принципов написания кода, опубликованных свободно некоторым комитетом Европейского союза; они были бы очень полезно как часть этого ответа, но, к сожалению, я не могу найти их в своем быстром поиске google, и у меня нет времени, чтобы искать широко. Попробуйте поискать по теме ... может быть, тебе повезет больше.
Я только что нашел эту двухчастную серию по объектно-ориентированному программированию с F2003. Много отличных вещей здесь:
Часть 1 http://www.pgroup.com/lit/articles/insider/v3n1a3.htm
Часть 2: http://www.pgroup.com/lit/articles/insider/v3n2a2.htm
Он имеет большие примеры и объясняет все очень ясно.
Если вы хотите посмотреть на большую программу Fortran в OO перейдите www.mohid.com это GPL. Я согласен, что для написания современного Fortran OO уже недостаточно, необходимо включить функциональные концепции программирования. Я провожу некоторые исследования по этому вопросу, и я считаю, что основная недостающая функция-это лямбда (анонимные) функции. С другой стороны, я думаю, что для распараллеливания лучше идти по маршруту MPI, а не OpenMP.
Comments