Недавно я пришел, чтобы сохранить большой объем научного расчетного кода FORTRAN. У меня возникают трудности с обработкой всех, скажем, нюансов, сорокалетнего языка, несмотря на то, что Google и две вводные книги уровня. Этот код изобилует "улучшением производительности". Кто-нибудь есть какие-либо руководства или практические советы для de -оптимизации FORTRAN на уровни CS 101? Кто-нибудь знает, как работает оптимизация кода FORTRAN? Есть ли типичные FORTRAN "gotchas", которые могут не возникнуть для Java/С++/. NET, созданного разработчиком, использующего кодовую базу FORTRAN 77/90?
Изучение Фортран в современную эпоху
Ответ 1
Вам вроде бы нужно "почувствовать" то, что программисты должны были делать в тот же день. Подавляющее большинство кода, с которым я работаю, старше меня, и работали на машинах, которые были "новыми", когда мои родители были в старшей школе.
Общие FORTRAN-isms, с которыми я имею дело, что читаемость с учетом ошибок:
- Общие блоки
- Неявные переменные
- Два или три цикла DO с совместно используемыми операторами CONTINUE
- GOTO вместо циклов DO
- Арифметические утверждения IF
- Вычисленный GOTO
- Эквивалентность REAL/INTEGER/other в некотором общем блоке
Стратегии для их решения:
- Получить Spag/plusFORT, стоит денег, он решает многие из них автоматически и Bug Free (tm)
- Перейдите в Fortran 90, если это вообще возможно, если не перейдите в форматированный формат Fortran 77
- Добавьте IMPLICIT NONE в каждую подпрограмму, а затем исправьте каждую ошибку компиляции, требующую много времени, но в конечном итоге необходимую, некоторые программы могут сделать это для вас автоматически (или вы можете script)
- Перемещение всех ОБЩИХ блоков в МОДУЛЕ, низко висящих фруктов, стоит
- Преобразование арифметических операторов IF в блоки IF..ELSEIF..ELSE
- Преобразование вычисленных GOTO в блоки SELECT CASE
-
Преобразование всех циклов DO в новый синтаксис F90
myloop: do ii = 1, nloops ! do something enddo myloop
-
Преобразуйте эквивалентные общие члены блока в любую РАСПРОСТРАНЕННУЮ память, выделенную в модуле, или в их настоящие подпрограммы символов, если она хранится в Hollerith в REAL
Если у вас возникли более конкретные вопросы о том, как выполнить некоторые задачи чтения, я могу дать совет. У меня есть кодовая база в несколько сотен тысяч строк Fortran, которая была написана на протяжении 40 лет, за которую я в какой-то степени ответственен, поэтому я, вероятно, сталкиваюсь с любыми "проблемами", которые вы, возможно, нашли.
Ответ 2
Унаследованный Fortran Soapbox
Я долгое время поддерживал/улучшал устаревшую базу кода Fortran, и по большей части думаю, что sixlettervariables находится на деньгах. Однако этот совет имеет тенденцию к техническим; более жесткая строка для мотыги заключается в реализации "хороших практик".
- Установите требуемый стиль кодирования и рекомендации по кодированию.
- Требовать проверку кода (больше, чем просто кодера!) для чего-либо, поданного на базу кода. (Контроль версий должен быть привязан к этому процессу.)
- Начать сборку и запуск модульных тестов; точных тестов или регрессионных тестов.
В наши дни это может показаться очевидным, но с риском чрезмерного обобщения я утверждаю, что большинство кодовых магазинов Fortran имеют укоренившуюся культуру, некоторые из них начались до того, как существовал термин "разработка программного обеспечения", и что со временем что приходит к доминированию: "Сделай это сейчас". (Это не уникально для магазинов Fortran любыми способами.)
Обхват Gotchas
Но что делать с уже существующей, громоздкой старой базой кода? Я согласен с Joel Spolsky по переписыванию, не. Однако, на мой взгляд, sixlettervariables указывает на допустимое исключение: используйте программные инструменты для перехода к лучшим конструкциям Fortran. Многие могут быть пойманы/исправлены анализаторами кода (FORCHECK) и переписывающие файлы (plusFORT). Если вам нужно сделать это вручную, убедитесь, что у вас есть насущная причина. (Мне жаль, что у меня не было ссылки на количество ошибок программного обеспечения, возникающих при исправлении ошибок программного обеспечения, это унизительно. Я думаю, что какая-то такая статистика находится в Expert C Программирование.)
Вероятно, лучшее нарушение в игре в игре Fortran gotchas имеет лучшую защиту: хорошо знать язык. Для этого я рекомендую... книги!
Библиотека Fortran Dead Tree
У меня был только скромный успех как "QA nag" на протяжении многих лет, но я обнаружил, что образование действительно работает, несколько раз непреднамеренно, и что одна из самых влиятельных вещей - это справочник, который у кого-то есть. Я люблю и очень рекомендую
Fortran 90/95 для ученых и инженеров Стивен Дж. Чепмен
Книга даже хороша с Fortran 77 тем, что она специально определяет конструкции, которые не должны использоваться, и дает лучшие альтернативы. Тем не менее, это на самом деле учебник и может закончиться, когда вы действительно хотите знать nitty-grritty из Fortran 95, поэтому я рекомендую
Fortran 90/95 Разъяснение, Майкл Меткалф и Джон К. Рид
в качестве вашей ссылки (sic) для Fortran 95. Будьте предупреждены, что это не самая ясная запись, но вуаль будет подниматься, когда вы действительно хотите получить максимальную отдачу от новой функции Fortran 95.
Чтобы сосредоточиться на проблемах перехода от Fortran 77 к Fortran 90, мне понравилось
Миграция в Fortran 90, Джим Керриган
но книга теперь выходит из печати. (Я просто не понимаю, что O'Reilly использует Safari, почему не все из доступных книг без печати?)
Наконец, что касается наследника замечательной, замечательной классики, Software Tools, я назначаю
Классический ФОРТРАН, автор Michael Kupferschmid
В этой книге не только показано, что можно делать только с "только" Fortran 77, но также рассказывается о некоторых более тонких проблемах, возникающих (например, следует или не следует использовать декларацию EXTERNAL). Эта книга точно не охватывает то же пространство, что и "Программные средства", но это две из трех книг программирования Fortran, которые я бы назвал "забавой".... (здесь третий).
Разное Совет, который применяется почти к каждому компилятору Fortran
- Существует опция компилятора для принудительного применения поведения IMPLICIT NONE, которое вы можете использовать для идентификации проблемных процедур, не изменяя их сначала с помощью декларации IMPLICIT NONE. Этот совет не будет казаться значимым до тех пор, пока в первый раз сборка бомб из-за команды IMPLICIT NONE не будет вставлена в устаревшую рутину. (Что? В вашем обзоре кода этого не произошло? -)
- Существует опция компилятора для проверки границ массива, которая может быть полезна при отладке кода Fortran 77.
- Компиляторы Fortran 90 должны иметь возможность компилировать почти все коды Fortran 77 и даже более старый код Fortran. Включите параметры отчетности в своем компиляторе Fortran 90, запустите свой старый код, и у вас будет достойный старт при проверке синтаксиса. Некоторые коммерческие компиляторы Fortran 77 на самом деле являются компиляторами Fortran 90, которые работают в режиме Fortran 77, поэтому это может быть относительно тривиальное опровержение для любых скриптов сборки.
Ответ 3
Что-то в первоначальном вопросе, о котором я бы предупреждал. Вы говорите, что код изобилует "улучшением производительности". Поскольку проблемы Fortran, как правило, носят научный и математический характер, не предполагайте, что эти трюки производительности улучшают компиляцию. Вероятно, это не язык. В Fortran решение редко связано с эффективностью самого кода, но с основополагающей математикой для решения конечной проблемы. Трюки могут сделать компиляцию медленнее, может даже сделать логику запутанной, но цель состоит в том, чтобы сделать решение быстрее. Если вы точно не знаете, что он делает и почему, оставьте его в покое.
Даже простой рефакторинг, как и изменение немых имен переменных, может быть большой ошибкой. Исторически стандартные математические уравнения в данной области науки будут использовать конкретную стенографию со времен Максвелла. Таким образом, чтобы увидеть массив с именем B (:) в электромагнетике, все инженеры Emag сообщают точно, что решается. Измените это на свой страх и риск. Мораль, познакомьтесь с стандартной номенклатурой науки, прежде чем переименовать ее.
Ответ 4
Как кто-то с опытом работы в FORTRAN (77 вкус, хотя прошло некоторое время с тех пор, как я использовал его серьезно) и C/С++, элемент, который нужно следить за тем, что сразу бросается в глаза, это массивы. Массивы FORTRAN начинаются с индекса 1 вместо 0, как в C/С++/Java. Кроме того, расположение памяти меняется на противоположное. Таким образом, приращение первого индекса дает вам последовательные ячейки памяти.
Моя жена все еще использует FORTRAN регулярно и имеет код С++, с которым ей нужно работать, теперь, когда я собираюсь начать помогать ей. По мере того как проблемы возникают во время ее конверсии, я попытаюсь указать на них. Возможно, они помогут.
Ответ 5
Не могли бы вы объяснить, что вам нужно делать для поддержания кода? Вам действительно нужно изменить код? Если вы можете уйти, изменив только интерфейс на этот код, а не сам код, это будет лучше.
Врожденная проблема при работе с большим научным кодом (а не только FORTRAN) заключается в том, что базовая математика и реализация являются сложными. Почти по умолчанию реализация должна включать оптимизацию кода, чтобы работать в разумные сроки. Это усугубляется тем фактом, что много кода в этой области создается учеными/инженерами, которые являются экспертами в своей области, но не в разработке программного обеспечения. Скажем, что "легко понять" не является для них первоочередной задачей (я был одним из них, все еще учись быть лучшим разработчиком программного обеспечения).
Из-за характера проблемы, я не думаю, что общий вопрос и ответ достаточно, чтобы быть полезными. Я предлагаю вам опубликовать ряд конкретных вопросов с прикрепленным фрагментом кода. Возможно, начиная с той, которая дает вам большую головную боль?
Ответ 6
Я использовал Fortran, начиная с версии '66 с 1967 года (на IBM 7090 с 32 тыс. слов памяти). Затем я использовал PL/1 в течение некоторого времени, но позже вернулся к Fortran 95, потому что он идеально подходит для проблем матрицы/комплексного номера, которые у нас есть. Я хотел бы добавить к consoderations, что большая часть запутанной структуры старых кодов просто из-за небольшого объема доступной памяти, заставляя такую вещь повторять использование нескольких строк кода через вычисленные или назначенные GOTO. Другой проблемой является оптимизация путем определения вспомогательных переменных для каждого повторного подвыражения - компиляторы просто не оптимизировали для этого. Кроме того, было запрещено писать DO я = 1, n + 1; вам нужно было написать n1 = n + 1; DO я = 1, n1. Вследствие этого старые коды перегружены избыточными переменными. Когда я переписал код в Fortran 95, выжило только 10% переменных. Если вы хотите сделать код более понятным, я настоятельно рекомендую искать переменные, которые можно легко устранить.
Еще одна вещь, которую я мог бы упомянуть, заключается в том, что на протяжении многих лет сложные арифметические и многомерные массивы были крайне неэффективными. Вот почему вы часто находите код, переписанный, чтобы выполнять сложные какуляции, используя только реальные переменные, и матрицы, адресованные одним линейным индексом.
Ответ 7
Ну, в каком-то смысле, вам повезло, потому что у Fortran не так много возможностей для тонких конструкций управления потоком или наследования или тому подобного. С другой стороны, он получил некоторые поистине удивительные штрихи, такие как арифметически рассчитанные веточки от числа до метки, неявно типизированные переменные, которые не требуют объявления, отсутствие истинных ключевых слов.
Я не знаю о "улучшениях, улучшающих производительность". Я предполагаю, что большинство из них, вероятно, неэффективны, поскольку несколько десятилетий технологии компилятора сделали большинство намеков ненужными. К сожалению, вам, вероятно, придется оставить вещи так, как они есть, если вы не планируете делать массовый переписывание.
В любом случае, основной научный код вычисления должен быть достаточно читабельным. Любой язык программирования, использующий арифметику infix, будет хорошей подготовкой для чтения арифметики Fortran и кода назначения.
Ответ 8
Я любил FORTRAN, я учил и кодировал его. Просто хотел бросить это. Не трогал его годами.
Я начал в COBOL, когда я переехал в FORTRAN, я чувствовал, что я свободен. Все относительно, да?
Я бы повторил сказанное выше - признаю, что это язык PROCEDURAL - никаких подэлементов - так что считайте это, как видите.
Наверное, вы можете начать с вас.
Ответ 9
Я начал на 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 имеет множество уникальных конструкций, которые могут легко сбить кого-то со стороны C мира программирования. Помните, что FORTRAN восходит к середине 50-х годов, когда не существовало такой науки, как наука о языке и дизайне компилятора, просто как раз взламывая что-то (извините, доктор Б!).
Ответ 10
Вот еще один, который время от времени бил меня. Когда вы работаете над кодом FORTRAN, убедитесь, что вы пропустили все шесть начальных столбцов. Время от времени я получаю код с отступом в пять пробелов и ничего не работает. На первый взгляд все выглядит нормально, и я наконец понял, что все строки начинаются в столбце 6 вместо столбца 7.
Для тех, кто не знаком с FORTRAN, первые 5 столбцов относятся к номерам строк (= метки), 6-й столбец предназначен для символа продолжения, если у вас есть строка длиной более 80 символов (просто введите что-то здесь, а компилятор знает что эта строка фактически является частью той, что была до нее), и код всегда начинается в столбце 7.