Изучение Фортрана в современную эпоху - PullRequest
71 голосов
/ 28 августа 2008

Я недавно пришел для того, чтобы поддерживать большое количество наукоемких кодов FORTRAN. Мне трудно разобраться во всех, скажем, нюансах сорокалетнего языка, несмотря на Google и две книги начального уровня. Код изобилует «улучшениями производительности». У кого-нибудь есть какие-либо руководства или практические советы для de -оптимизации FORTRAN на уровни CS 101? Кто-нибудь знает, как работает оптимизация кода на Фортране? Существуют ли какие-либо типичные «ошибки» в FORTRAN, которые могут не возникнуть у разработчика Java / C ++ /. NET, принимающего кодовую базу FORTRAN 77/90?

Ответы [ 10 ]

81 голосов
/ 16 сентября 2008

Вы как бы должны «почувствовать», что программисты должны были сделать в тот день. Подавляющее большинство кода, с которым я работаю, старше меня и работает на машинах, которые были «новыми», когда мои родители учились в старших классах.

Распространенные ФОРТРАН-измы, с которыми я сталкиваюсь, ухудшают читабельность:

  • Общие блоки
  • Неявные переменные
  • Два или три цикла DO с общими операторами CONTINUE
  • GOTO вместо петель DO
  • Арифметические операторы IF
  • Вычисленные GOTO
  • Эквивалентность REAL / INTEGER / other в некотором общем блоке

Стратегии решения этих проблем включают:

  1. Получить Spag / plusFORT , стоит денег, он решает многие из них автоматически и без ошибок (тм)
  2. Переместитесь в Fortran 90, если это вообще возможно, если не перейдите в свободный формат Fortran 77
  3. Добавьте IMPLICIT NONE в каждую подпрограмму, а затем исправьте каждую ошибку компиляции, что отнимает много времени, но в конечном итоге необходимо, некоторые программы могут сделать это автоматически (или вы можете написать скрипт)
  4. Перемещение всех ОБЩИХ блоков в МОДУЛИ, низко висящие фрукты, стоит того
  5. Преобразование арифметических операторов IF в блоки IF..ELSEIF..ELSE
  6. Преобразование вычисленных GOTO в блоки SELECT CASE
  7. Преобразование всех циклов DO в новый синтаксис F90

    myloop: do ii = 1, nloops
        ! do something
    enddo myloop
    
  8. Преобразование эквивалентных общих элементов блока либо в ALLOCATABLE память, выделенную в модуле, либо в их подпрограммы истинных символов, если это Hollerith, хранящийся в REAL

Если у вас есть более конкретные вопросы о том, как выполнить некоторые задачи по удобочитаемости, я могу дать совет. У меня есть кодовая база из нескольких сотен тысяч строк на Фортране, написанная в течение 40 лет, за которую я каким-то образом отвечаю, поэтому я, вероятно, столкнулся с любыми "проблемами", которые вы, возможно, обнаружили.

30 голосов
/ 03 октября 2008

Устаревшая мыльница Фортран

Я помогал поддерживать / улучшать унаследованную базу кода на Фортране довольно долго, и по большей части считаю, что sixlettervariables стоит денег. Этот совет, однако, имеет тенденцию к техническому; более сложный подход к внедрению «хороших практик».

  • Установить требуемый стиль кодирования и рекомендации по кодированию.
  • Требуется проверка кода (не только кодера!) Для всего, что отправлено в базу кода. (Контроль версий должен быть привязан к этому процессу.)
  • Начать сборку и запуск юнит-тестов; То же самое или регрессионные тесты.

В наши дни это может звучать как очевидные вещи, но рискуя чрезмерно обобщать, я утверждаю, что большинство магазинов кода на Фортране имеют укоренившуюся культуру, некоторые начали существовать еще до того, как появился термин «разработка программного обеспечения», и что со временем доминирует это "Сделай это сейчас". (Это ни в коем случае не уникально для магазинов Fortran.)

Обнимает Гочас

Но что делать с уже существующей, грязной старой унаследованной кодовой базой? Я согласен с Джоэлем Спольски в переписывании, не . Однако, по моему мнению, sixlettervariables указывает на допустимое исключение: Используйте программные инструменты для перехода к более совершенным конструкциям Fortran. Многое может быть поймано / исправлено анализаторами кода ( FORCHECK ) и переписыватели кода ( plusFORT ). Если вам нужно сделать это вручную, убедитесь, что у вас есть веская причина. (Хотелось бы, чтобы у меня была под рукой ссылка на количество ошибок в программном обеспечении, которые возникли в результате исправления ошибок в программном обеспечении, это унизительно. Я думаю, что некоторые такие статистические данные содержатся в Программирование на Expert C .)

Вероятно, лучшее нарушение в выигрыше в игре Фортрана - лучшая защита: достаточно хорошее знание языка. Для достижения этой цели я рекомендую ... книги!

Библиотека мертвых деревьев Фортрана

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

Фортран 90/95 для ученых и инженеров , Стивен Дж. Чепмен

Книга даже хороша с Фортраном 77 в том смысле, что она конкретно определяет конструкции, которые не должны использоваться, и дает лучшие альтернативы. Тем не менее, это на самом деле учебник, и он может выдыхаться, когда вы действительно хотите знать все о Fortran 95, поэтому я рекомендую

Фортран 90/95 объяснил , Майкл Меткалф и Джон К. Рейд

в качестве справочного материала для Fortran 95. Будьте предупреждены, что это не самая ясная запись, но завеса поднимется, когда вы действительно захотите получить максимальную отдачу от новой функции Fortran 95.

Для того, чтобы сосредоточиться на вопросах перехода от Фортрана 77 к Фортрану 90, мне понравилось

Миграция в Фортран 90 , Джим Керриган

но книга вышла из печати. (Я просто не понимаю, как О'Рейли использует Safari , почему не доступны все их книги, не напечатанные?)

Наконец, что касается наследника замечательной, замечательной классики, Software Tools , я номинирую

Классический Фортран , Майкл Купфершмид

Эта книга не только показывает, что можно сделать с «только» Fortran 77, но также рассказывает о некоторых более тонких проблемах, которые возникают (например, следует или не следует использовать декларацию EXTERNAL). Эта книга не совсем совпадает с «Программными инструментами», но это две из трех книг по программированию на Фортране, которые я бы назвал «забавными» .... ( вот третий ).

Разные советы, которые относятся к почти каждому компилятору Fortran

  • Существует опция компилятора для принудительного применения поведения IMPLICIT NONE, которую вы можете использовать для выявления проблемных подпрограмм, не изменяя их сначала с помощью объявления IMPLICIT NONE. Этот совет не будет иметь смысла до тех пор, пока после первого раза не будут собраны бомбы из-за команды IMPLICIT NONE, вставленной в устаревшую процедуру. (Что? Ваш обзор кода не уловил этого?; -)
  • Существует опция компилятора для проверки границ массива, которая может быть полезна при отладке кода на Fortran 77.
  • Компиляторы Fortran 90 должны иметь возможность компилировать практически весь код Fortran 77 и даже более старый код Fortran. Включите параметры отчетов на своем компиляторе Fortran 90, запустите свой унаследованный код, и вы сможете неплохо начать проверку синтаксиса. Некоторые коммерческие компиляторы Fortran 77 на самом деле являются компиляторами Fortran 90, которые работают в режиме Fortran 77, так что это может быть довольно простой вариант для любых скриптов сборки.
21 голосов
/ 22 сентября 2008

В исходном вопросе есть кое-что, о чем я хотел бы предостеречь. Вы говорите, что код изобилует «улучшениями производительности». Поскольку проблемы с Фортраном, как правило, носят научный и математический характер, не думайте, что эти приемы повышения производительности предназначены для улучшения компиляции. Это, вероятно, не о языке. В Фортране решение редко заключается в эффективности самого кода, но в основе математики для решения конечной проблемы. Уловки могут замедлить компиляцию, могут даже сделать логику беспорядочной, но цель состоит в том, чтобы ускорить решение. Если вы точно не знаете, что он делает и почему, оставьте его в покое.

Даже простой рефакторинг, такой как изменение имен переменных, которые выглядят немыми, может быть большой ошибкой. Исторически стандартные математические уравнения в данной области науки будут использовать конкретную стенографию со времен Максвелла. Поэтому, чтобы увидеть массив с именем B (:) в электромагнетизме, все инженеры Emag точно скажут, для чего решается проблема. Измените это на свой страх и риск. Мораль, познакомься со стандартной номенклатурой науки перед тем, как переименовать ее.

7 голосов
/ 28 августа 2008

Как человек, имеющий опыт работы как на FORTRAN (77-й вариант, хотя я давно его использовал), так и на C / C ++, элемент, на который стоит обратить внимание, - это массивы. Массивы FORTRAN начинаются с индекса 1 вместо 0, как в C / C ++ / Java. Кроме того, расположение памяти полностью изменено. Таким образом, увеличение первого индекса дает вам последовательные ячейки памяти.

Моя жена по-прежнему регулярно использует FORTRAN и имеет некоторый код на C ++, с которым ей нужно работать сейчас, когда я собираюсь начать помогать ей. Когда возникнут проблемы во время ее обращения, я постараюсь указать на них. Может быть, они помогут.

5 голосов
/ 11 января 2012

Я использую Fortran начиная с версии '66 с 1967 года (на IBM 7090 с 32 тыс. Слов памяти). Затем я некоторое время использовал PL / 1, но позже вернулся к Fortran 95, потому что он идеально подходит для задач с матричным / комплексным числом, которые у нас есть. Я хотел бы добавить к соображениям, что большая часть запутанной структуры старых кодов просто связана с небольшим объемом доступной памяти, что вызывает необходимость повторного использования нескольких строк кода через вычисленные или назначенные GOTO s. Другая проблема - оптимизация путем определения вспомогательных переменных для каждого повторного подвыражения - компиляторы просто не оптимизировали для этого. Кроме того, было запрещено писать DO i=1,n+1; ты должен был написать n1=n+1; DO i=1,n1. В результате старые коды перегружены лишними переменными. Когда я переписал код на Фортране 95, выжили только 10% переменных. Если вы хотите сделать код более разборчивым, я настоятельно рекомендую поискать переменные, которые можно легко исключить.

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

5 голосов
/ 17 сентября 2008

Не могли бы вы объяснить, что вы должны делать для поддержки кода? Вы действительно должны изменить код? Если вы можете уйти, изменив только интерфейс к этому коду, а не сам код, это было бы лучше.

Неотъемлемая проблема при работе с большим научным кодом (не только с Фортраном) заключается в том, что базовая математика и реализация сложны. Практически по умолчанию реализация должна включать оптимизацию кода, чтобы работать в разумные сроки. Это усугубляется тем фактом, что много кода в этой области создается учеными / инженерами, которые являются экспертами в своей области, но не в разработке программного обеспечения. Давайте просто скажем, что «легко понять» не является для них первоочередной задачей (я был одним из них, все еще учусь быть лучшим разработчиком программного обеспечения).

Из-за характера проблемы, я не думаю, что общий вопрос и ответ достаточно, чтобы быть полезным. Я предлагаю вам опубликовать серию конкретных вопросов с прикрепленным фрагментом кода. Возможно, начиная с той, которая доставляет вам больше всего головной боли?

4 голосов
/ 28 августа 2008

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

Я не знаю об «улучшениях производительности». Я предполагаю, что большинство из них, вероятно, неэффективны, так как пара десятилетий технологии компиляции сделали большинство подсказок ненужными. К сожалению, вам, вероятно, придется оставить вещи такими, какие они есть, если только вы не планируете массовую переписку.

В любом случае, основной научный код расчета должен быть достаточно читабельным. Любой язык программирования, использующий инфиксную арифметику, будет хорошей подготовкой для чтения арифметики и кода назначения Фортрана.

3 голосов
/ 09 мая 2014

Я начал работать на Fortran IV (WATFIV) на перфокартах, и мои первые годы работы были VS FORTRAN v1 (IBM, уровень Fortran 77). Много полезных советов в этой теме.

Я бы добавил, что вам нужно различать, что сделано для того, чтобы зверь вообще работал, от вещей, которые "оптимизируют" код, от вещей, которые более читабельны и удобны в обслуживании. Я помню, как работал с оверлеями VAX, пытаясь заставить код моделирования DOE работать на IBM с виртуальной памятью (их пришлось удалить, и все это превратилось в одно адресное пространство).

Я бы, конечно, начал с тщательной реструктуризации структур управления FORTRAN IV, по крайней мере, до уровня FORTRAN 77, с соответствующими отступами и комментариями. Постарайтесь избавиться от примитивных управляющих структур, таких как ASSIGN и COMPUTED GOTO и арифметических IF, и, конечно, от максимально возможного количества GOTO (используя IF-THEN-ELSE-ENDIF). Определенно используйте IMPLICIT NONE в каждой подпрограмме, чтобы заставить вас правильно объявлять все переменные (вы не поверите, сколько ошибок я обнаружил в чужом коде - опечатки в именах переменных). Следите за «преждевременной оптимизацией», которую лучше позволить компилятору обрабатывать самостоятельно.

Если этот код должен продолжать жить и быть поддерживаемым, вы должны сделать это для себя и своих преемников, чтобы сделать его читаемым и понятным. Просто будьте уверены в том, что вы делаете, когда меняете код! В FORTRAN есть множество своеобразных конструкций, которые могут легко запутать кого-то, приходящего со стороны Си в мире программирования. Помните, что FORTRAN восходит к середине 50-х годов, когда не было такой вещи, как наука о языке и дизайне компиляторов, просто ad hoc хакерство чего-то (извините, доктор Б!).

3 голосов
/ 21 ноября 2008

Я любил Фортран, я привык учить и кодировать в нем. Просто хотел добавить это. Давно не трогал.
Я начал в Коболе, когда я переехал на Фортран, я почувствовал, что меня освободили. Все относительно, да? Я бы сказал второе, что было сказано выше - признаю, что это ПРОЦЕДУРНЫЙ язык - без подлогов - поэтому примите его таким, каким вы его видите. Вероятно, расстроить вас с самого начала.

1 голос
/ 10 сентября 2008

Вот еще один, который время от времени меня кусал. Когда вы работаете над кодом FORTRAN, убедитесь, что вы пропустили все шесть начальных столбцов. Время от времени я получаю код с отступом в пять пробелов, и ничего не работает. На первый взгляд все выглядит хорошо, а потом я наконец понимаю, что все строки начинаются в столбце 6 вместо столбца 7.

Для тех, кто не знаком с FORTRAN, первые 5 столбцов предназначены для номеров строк (= меток), 6-й столбец предназначен для символа продолжения, если у вас строка длиной более 80 символов (просто введите что-то здесь и компилятор знает что эта строка на самом деле является частью предыдущей) и код всегда начинается в столбце 7.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...