Навчання FORTRAN в сучасну епоху


80

Нещодавно я прийшов підтримувати велику кількість науково-обчислювальних кодів FORTRAN. У мене виникають труднощі з вивченням усіх, скажімо, нюансів сорокарічної мови, незважаючи на google та дві вступні книги. Код багатий на "покращення продуктивності". Хто - небудь є якісь - або керівництва чи практичні поради для де -optimizing FORTRAN на рівні CS 101? Хтось знає про те, як функціонувала оптимізація коду FORTRAN? Чи є якісь типові для FORTRAN "помилки", які можуть не траплятися Java / C ++ /. NET-розробник, який бере на себе кодову базу FORTRAN 77/90?


4
Чи був би цей текст вам цікавим? fortranrefactoring.com.ar/papers/…
Ладья

2
@DavidSokol Мені було приємно слухати вас у підкасті TDL динозаврів , особливо з цим запитанням для контексту :) Зверніть увагу, в подкасті про це не згадується, я просто згадав, що бачив це після прослуховування.
Тім Пост

2
Посилання вище мертве, документ тепер тут: fortranrefactoring.org/papers/…

Відповіді:


89

Ви начебто повинні відчути те, що програмісти мали робити ще за день. Переважна більшість коду, з яким я працюю, старший за мене і працював на машинах, які були "новими", коли мої батьки навчались у середній школі.

Поширені фортран-ізми, з якими я стикаюся, що шкодять читабельності:

  • Загальні блоки
  • Неявні змінні
  • Два або три цикли DO із загальними операторами CONTINUE
  • GOTO замість циклів DO
  • Арифметичні твердження IF
  • Обчислювані GOTO
  • Еквівалентність REAL / INTEGER / інше в якомусь загальному блоці

Стратегії їх вирішення включають:

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

    myloop: do ii = 1, nloops
        ! do something
    enddo myloop
    
  8. Перетворити еквівалентні загальні члени блоку або в ALLOCATABLE пам'ять, виділену в модулі, або в їх справжні підпрограми символів, якщо Hollerith зберігається в REAL

Якщо у вас виникли більш конкретні запитання щодо того, як виконати деякі завдання з читабельності, я можу дати пораду. У мене є кодова база з декількох сотень тисяч рядків Fortran, яка була написана протягом 40 років, за яку я певним чином відповідаю, тому, мабуть, я стикалася з будь-якими "проблемами", які ви могли виявити.


3
Крім того, гарний текст щодо реструктуризації fortran. fortranrefactoring.com.ar/papers/…
Ладья,

Дуже важко, якщо код не дуже добре організований і в значній мірі затуманений деталями оптимізації. Перехід на стиль fortran 90 допоможе вам. Крім того, пізніші версії fortran 2008 надають функціонал для оптимізації.
Зевс

Схоже, сайт plusFORT переїхав сюди: polyhedron.com/?product=plusfort
jrh

32

Спадщина Fortran Soapbox

Я допомагав підтримувати / вдосконалювати застарілу базу коду Fortran протягом тривалого часу, і здебільшого вважаю, що шість літер змінних - на гроші. Однак ця порада має тенденцію до технічного; жорсткіший мотив для впровадження "належних практик".

  • Встановіть необхідний стиль кодування та керівні принципи кодування.
  • Вимагайте перевірки коду (не лише кодера!) Для будь-чого, що надійшло до бази коду. (Контроль версій повинен бути прив’язаний до цього процесу.)
  • Почати побудову та запуск модульних тестів; так само тести порівняльних показників або регресії.

Це може звучати як очевидні речі в наші дні, але, ризикуючи надмірно узагальнити, я стверджую, що більшість магазинів коду Fortran мають усталену культуру, деякі почали ще до того, як термін "програмна інженерія" навіть існував, і що з часом те, що домінує є "Зробіть це зараз". (Це ніяк не властиво лише магазинам Fortran.)

Обіймаючи гоча

Але що робити з уже існуючою, непомітною старою базою застарілого коду? Я погоджуюсь з Джоелем Спольським щодо переписування, не робіть . Однак, на мій погляд, sixlettervariables вказує на допустимий виняток: використовуйте програмні засоби для переходу до кращих конструкцій Fortran. Багато можна вловити / виправити за допомогою аналізаторів коду ( FORCHECK ) та переписувачів коду ( plusFORT ). Якщо вам доводиться робити це вручну, переконайтеся, що у вас є нагальна причина. (Хоч би я мав під рукою посилання на кількість програмних помилок, що виникли в результаті виправлення програмних помилок, це принизливо. Я думаю, що деякі такі статистичні дані містяться в програмуванні експерта C )

Мабуть, найкращим порушенням у перемозі у грі Фортран є найкращий захист: досить добре знати мову. Для подальшого досягнення я рекомендую ... книги!

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

Протягом багатьох років я мав лише скромний успіх, як "гарячий контроль", але я виявив, що освіта працює, іноді ненавмисно, і що одна з найвпливовіших речей - це довідник, який хтось має під рукою. Я люблю і дуже рекомендую

Fortran 90/95 для вчених та інженерів , Стівен Дж. Чепмен

Книга навіть хороша для Fortran 77 тим, що вона конкретно визначає конструкції, які не слід використовувати, і дає кращі альтернативи. Однак це насправді підручник і може закінчитися, коли ви дійсно хочете знати дрібницю Fortran 95, саме тому я рекомендую

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

як ваш довідковий посібник (sic) для Fortran 95. Будьте застережені, що це не найсвітліше написання, але завіса підніметься, коли ви дійсно хочете отримати максимум від нової функції Fortran 95.

Якщо я зосередився на питаннях переходу від Фортрана 77 до Фортрана 90, мені сподобалось

Перехід на Fortran 90 , Джим Керріган

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

Нарешті, що стосується спадкоємця чудової, чудової класики, Програмні засоби , я висуваю

Класичний FORTRAN , Майкл Купфершмід

Ця книга не лише показує, що можна зробити із "лише" Fortran 77, але вона також розповідає про деякі найтонші проблеми, які виникають (наприклад, слід чи не слід використовувати ЗОВНІШНУ декларацію). Ця книга не точно охоплює той самий простір, що і "Засоби програмного забезпечення", але це дві з трьох книг з програмування Fortran, які я б позначив як "веселі" .... ( ось третя ).

Різні поради, які стосуються майже кожного компілятора Fortran

  • Існує опція компілятора для забезпечення поведінки IMPLICIT NONE, яку ви можете використовувати для виявлення проблемних процедур, не змінюючи їх за допомогою декларації IMPLICIT NONE. Ця порада не буде здаватися значущою, доки після першого побудови бомб через команду IMPLICIT NONE, вставлену у застарілу процедуру. (Що? Ваш огляд коду цього не зрозумів? ;-)
  • Існує опція компілятора для перевірки меж масиву, яка може бути корисною під час налагодження коду Fortran 77.
  • Компілятори Fortran 90 повинні вміти компілювати майже весь код Fortran 77 і навіть старіший код Fortran. Увімкніть параметри звітування на своєму компіляторі Fortran 90, пропустіть через нього ваш застарілий код, і ви почнете гідно розпочинати перевірку синтаксису. Деякі комерційні компілятори Fortran 77 насправді є компіляторами Fortran 90, які працюють у режимі Fortran 77, тому це може бути відносно тривіальним варіантом обертання для будь-яких скриптів збірки, які у вас є.

1
Посилання Fortran 90/95 для вчених та інженерів мертве, але ви можете знайти його на Amazon за ціною близько 50 доларів США, або перше видання в м'якій обкладинці приблизно за $ 25
jrh

24

У оригінальному питанні є щось, про що я б застерігав. Ви кажете, що в коді багато «покращення продуктивності». Оскільки проблеми Фортрана, як правило, мають науковий та математичний характер, не припускайте, що ці трюки ефективності існують для покращення компіляції. Йдеться, мабуть, не про мову. У Fortran рішення рідко стосується ефективності самого коду, а основної математики для вирішення кінцевої задачі. Ці фокуси можуть зробити компіляцію повільнішою, навіть може зробити логіку сумбурною, але намір полягає в тому, щоб зробити рішення швидшим. Якщо ви точно не знаєте, що і чому робить, залиште це в спокої.

Навіть простий рефакторинг, як зміна імен змінних, що виглядають тупо, може бути великою підводною камерою. Історично стандартні математичні рівняння в певній галузі науки використовували певний стенограф з часів Максвелла. Тож побачити масив з назвою B (:) в електромагнетиці розповідає всім інженерам Emag, для чого саме вирішується. Змініть це на свій ризик. Мораль, ознайомтесь зі стандартною номенклатурою науки перед тим, як перейменувати теж.


7

Як хтось, хто має досвід роботи як з FORTRAN (77 ароматів, хоча минув деякий час, відколи я серйозно його використовував), так і в C / C ++, предмет, на який слід зважати, відразу ж нагадує, це масиви. Масиви FORTRAN починаються з індексу 1 замість 0, як це робиться в C / C ++ / Java. Крім того, розташування пам'яті зворотне. Отже, збільшення першого індексу дає вам послідовні розташування пам’яті.

Моя дружина все ще регулярно використовує FORTRAN і має певний код С ++, з яким їй потрібно працювати зараз, коли я збираюся почати їй допомагати. Оскільки під час її навернення виникають проблеми, я спробую вказати на них. Можливо, вони допоможуть.


12
Масиви Fortran починаються з індексу 1 за замовчуванням, але можуть бути оголошені як такі, що починаються з будь-якого значення.
MSB

6

Я використовував Fortran, починаючи з версії 66 року, починаючи з 1967 року (на IBM 7090 із 32 тис. Слів пам'яті). Потім я деякий час використовував PL / 1, але згодом повернувся до Fortran 95, оскільки він ідеально підходить для проблем матриці / комплексного числа, які ми маємо. Я хотів би додати до міркувань, що велика частина заплутаної структури старих кодів просто пов'язана з невеликим обсягом доступної пам'яті, що змушує таке, як повторне використання декількох рядків коду через обчислені або призначені GOTOs. Іншою проблемою є оптимізація шляхом визначення допоміжних змінних для кожного повторного підвираження - компілятори просто не оптимізували для цього. Крім того, не дозволялося писати DO i=1,n+1; треба було писати n1=n+1;DO i=1,n1. Як наслідок, старі коди завалені зайвими змінними. Коли я переписав код у Fortran 95, вижило лише 10% змінних. Якщо ви хочете зробити код більш розбірливим, настійно рекомендую шукати змінні, які можна легко усунути.

Ще одне, що я міг би згадати, це те, що протягом багатьох років складні арифметичні та багатовимірні масиви були вкрай неефективними. Ось чому ви часто зустрічаєте переписаний код для виконання складних обчислень із використанням лише реальних змінних та матриць, адресованих одним лінійним індексом.


5

Ну, в одному сенсі, вам пощастило, тому що у Фортрана не так вже й багато тонких конструкцій потоку управління, успадкування тощо. З іншого боку, у нього є справді дивовижні проблеми, такі як арифметично розраховані матеріали з відгалуження до числової мітки, неявно введені змінні, які не вимагають декларування, відсутність справжніх ключових слів.

Я не знаю про "покращення продуктивності". Я думаю, більшість з них, мабуть, неефективні, оскільки пара десятиліть технологій компілятора зробила більшість натяків непотрібними. На жаль, вам, мабуть, доведеться залишити речі такими, як вони є, якщо тільки ви не плануєте робити масовий перепис.

У будь-якому випадку, основний науковий код розрахунку повинен бути досить читабельним. Будь-яка мова програмування, що використовує інфіксну арифметику, була б гарною підготовкою до читання арифметики і коду призначення Фортрана.


5

Не могли б ви пояснити, що вам потрібно зробити, щоб підтримувати код? Ви дійсно повинні змінити код? Якщо ви можете піти, змінивши лише інтерфейс цього коду замість самого коду, це було б найкращим.

Невід’ємною проблемою при роботі з великим науковим кодом (а не лише з FORTRAN) є те, що основна математика та її реалізація є складними. Майже за замовчуванням, реалізація повинна включати оптимізацію коду, щоб працювати в розумні часові рамки. Це ускладнюється тим, що багато коду в цій галузі створюється вченими / інженерами, які є експертами у своїй галузі, але не розробляють програмне забезпечення. Скажімо просто, що "легко зрозуміти" для них не перший пріоритет (я був одним із них, все ще навчаючись бути кращим розробником програмного забезпечення).

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


4

Я любив ФОРТРАН, раніше вчив і кодував у ньому. Просто хотів це вкинути. Я не торкався цього роками.
Я почав у COBOL, коли переїхав до FORTRAN, відчув, що звільнився. Все відносно, так? Я б підтримав сказане вище - визнайте, що це мова ПРОЦЕДУРИ - ніяких тонкощів - тож сприймайте це так, як бачите.
Можливо, для вас це розчарує.


2
Я теж пройшов цю фазу. Насправді я пам'ятаю "найкращі практики", які мінімізували проблеми. Але потім я перейшов до Lisp, Pascal, C, C ++. Мені ще треба працювати з якимсь Фортраном. Справжня проблема полягає в тому, що більшість з них написано з дуже малою програмістською дисципліною. Люди все ще викладають фортран, але не викладають дисципліни.
Mike Dunlavey

3

Я починав з Fortran IV (WATFIV) на перфокартах, і мої перші робочі роки були VS FORTRAN v1 (IBM, рівень Fortran 77). Багато хороших порад у цій темі.

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

Я б, звичайно, почав з ретельної реструктуризації контрольних структур FORTRAN IV щонайменше до рівня FORTRAN 77, з належним відступом та коментуванням. Спробуйте позбутися примітивних структур управління, таких як НАЗНАЧЕННЯ та ОБРАБОТНЕ ГОТО та арифметичне ПІС, і звичайно, якомога більше ГОТО (за допомогою ІФ-ТОГА-ІНШЕ-ЕНДІФ). Безумовно, використовуйте IMPLICIT NONE у кожній процедурі, щоб змусити вас правильно оголосити всі змінні (ви не повірите, скільки помилок я виявив у чужому коді - помилки в іменах змінних). Слідкуйте за "передчасною оптимізацією", що вам краще дозволити компілятору самостійно обробляти.

Якщо цей код продовжує жити і підтримуватися, ви зобов’язані собі та своїм наступникам, щоб зробити його читабельним та зрозумілим. Просто будьте впевнені в тому, що робите, змінюючи код! FORTRAN має безліч своєрідних конструкцій, які можуть легко спокусити когось, хто походить зі сторони С у світі програмування. Пам’ятайте, що FORTRAN бере свій початок із середини-кінця 50-х років, коли ще не існувало такого поняття, як наука про мову та дизайн компілятора, а лише спеціальний злом чогось (вибачте, доктор Б!).


1

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

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


6
Цей коментар справедливий щодо FORTRAN 77 та попередніх версій, але не для Fortran 90 та пізніших версій, що використовує макет джерела у вільній формі.
MSB

3
Крім того, рядки повинні закінчуватися в 72-й колоні, а не в 80-й.
Ладья
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.