Преобразование Фортрана в C / C ++ - PullRequest
8 голосов
/ 30 ноября 2010

В рамках моего проекта «Последний год» мне нужно преобразовать некоторый код FORTRAN в C или C ++ (не важно, на каком языке я его понимаю, и я могу понимать языки стиля C).

Я обнаружил f2c, программу, которая якобы конвертирует FORTRAN в C, и попытался установить ее, следуя инструкциям, сохранив файл makefile.vc на моем диске и затем выполнив

copy makefile.vc makefile
nmake

(это часть файла README об установке f2c, которая включена в страницу загрузки f2c )

Для компиляции f2c в Linux или Unix системы, скопируйте makefile.u в makefile, при необходимости отредактируйте make-файл (см. комментарии в нем и ниже) и наберите "сделать" (или, может быть, "Nmake", в зависимости от ваша система).

Для компиляции f2c.exe на MS Windows системы с Microsoft Visual C ++,

copy makefile.vc makefile nmake

С другими компиляторами ПК вам может понадобиться скомпилировать xsum.c с -DMSDOS (т.е. с MSDOS # определено).

Если ваш компилятор не понимает Синтаксис ANSI / ISO C (т.е. если у вас есть Компилятор K & R C), скомпилировать с -DKR_headers.

В не-Unix системах, где файлы имеют отдельные двоичные и текстовые режимы, вы может понадобиться "сделать xsumr.out" скорее чем "сделать xsum.out".

Я использую 64-разрядную версию Windows Vista и пробовал "nmake", но я получаю

'nmake' не распознается как внутренняя или внешняя команда, работающая программа или командный файл.

Я скачал Nmake15.exe после некоторого поиска, но он не работает на 64-битных машинах, и, очевидно, его версия не работает. Поэтому я скачал Windows SDK, когда мне сказали, что это сработает, но ничего не изменилось.

Где я ошибся во всем этом, если есть, и есть ли способ конвертировать этот код FORTRAN в C или C ++?

Ответы [ 10 ]

6 голосов
/ 30 ноября 2010

Я собираюсь ответить только на самую последнюю часть вашего вопроса:

есть ли способ конвертировать этот код FORTRAN в C или C ++?

Да, есть: прочитайте код на Фортране и напишите эквивалентные операторы C в файле C.Они оба являются императивными языками.Синтаксис другой, но не невозможно декодировать.Это, вероятно, даст вам гораздо лучшие результаты, чем автоконвертер, а также даст вам более глубокое понимание того, как работает оригинальная программа.

6 голосов
/ 26 сентября 2015

Я обнаружил, что есть небольшой набор инструментов с именем fable fable - Автоматическое преобразование Фортрана в C ++ , который предназначен для такого преобразования.

Есть также обзор такого инструмента . Аннотация от авторов обзора:

Фон

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

Результаты

Руководствуясь требованиями крупномасштабного научного программного проекта, мы разработали инструмент преобразования исходных текстов в Фортран в C ++ под названием FABLE. Это позволяет продолжать разработку новых методов даже при переключении языков. Мы сообщаем о применении FABLE в трех основных проектах и ​​приводим подробные сравнения производительности среды исполнения Fortran и C ++.

Выводы

Наш опыт показывает, что большинство кодов Fortran 77 могут быть преобразованы с небольшим усилием (измеряется в днях) по сравнению с первоначальным временем разработки (часто измеряется в годах). С FABLE можно повторно использовать и развивать устаревшую работу в современных объектно-ориентированных средах, переносимым и обслуживаемым способом. FABLE доступен по неограниченной лицензии с открытым исходным кодом. В FABLE анализ источников на Фортране отделен от генерации источников на C ++. Поэтому части FABLE могут быть повторно использованы для других целевых языков.

4 голосов
/ 30 ноября 2010

f2c действительно подходит, если у вас есть код F77. Если у вас F90 или более поздняя версия, то f2c не поможет. Я использовал f2c много раз с большим успехом, если вы помните ключ -a.

Кроме того, я бы оценил f2c как один из лучших кодов всех времен!

3 голосов
/ 22 ноября 2014

Метод, который я использовал для конвертации до сих пор, полуавтоматизирован: множество редакторов и текстовых скриптов.

Во-первых, коллимируйте все источники на Фортране в один файл (расставляя маркеры так, чтобы файлы могли быть разделены).

Затем преобразуйте числовые метки в именованные метки (например, добавив перед ними L для gotos и F для форматов). Сделайте соответствующие изменения в местах, которые ссылаются на ярлыки.

Затем отметьте метку - продолжайте комбинации и продолжения операторов (например, с отметкой в ​​начале каждой строки, где они встречаются). Затем снова соедините строки метки-продолжения и оператора-продолжения. В редакторе, таком как vi, это означало бы выполнение серии (скажем) 1000J, а затем массовую замену:% s / # / ^ V ^ M / g, если маркер начала строки - #. Поскольку строки продолжения были специально помечены, как и комбинации с продолжением, они воссоединяются.

Убедитесь, что if-метки и do-метки разделены (например, напишите шаблон grep, чтобы извлечь соответствующие строки, а затем напишите простую программу для сопоставления скобок, чтобы проверить их). После того, как вы отделены, вы можете превратить продолжение в скобки.

Включите скобки if-then-else и dowhile / enddo, подпрограмму / ends и т. Д. Сделайте подпрограмму недействительной, добавьте поддельные имена для основных типов (например, логическое, символьное, целое, вещественное, двойное, сложное, сложное).

Комментарии преобразуются в C ++ // comments; оба столбца 0 и! комментарии.

Затем вы можете заново создать прототип функции. По сути, это преобразование KR в ANSI-C и требует простой программы для чтения заголовков функций и объявлений переменных для их сопоставления. В идеале вы можете сначала поместить объявления переменных в строку. Это также требует сценария редактирования и утилиты. Например, "Double A, B, C, ..." будет преобразовано в "#Double \ nA \ nB \ n." а затем утилита настроена на префикс всех # строк с самой последней предшествующей строкой.

Операторы параметров воссоединяются с объявлениями типов и преобразуются в операторы "const". Сохранения конвертируются в статические объявления. Commons Я еще не нашел хороший способ работать с ним.

Теперь идут следующие части HARD: размерность массива, анализ переменных ввода / вывода (чтобы определить, какие переменные должны быть переданы по значению или по ссылке). Вы должны получить компилятор C, который распознает ссылочный тип и / или использует C ++. Для переназначения массива вам также может понадобиться перейти на C ++, который позволяет переопределить [].

Анализ in-out - это то, что я еще не проработал, также как и измерение. Но в На этом этапе соответствующий источник находится в основном на C или C ++.

Имейте в виду: Fortran 2010 допускает параллельную обработку, которая выходит за рамки C и даже C ++ (за исключением их многопоточных возможностей). Если в ваших программах они есть, все станет намного сложнее.

3 голосов
/ 05 декабря 2010

Тебе должно быть понятно, зачем ты это делаешь. Это потому, что необходимая вам функциональность доступна ТОЛЬКО в устаревшем FORTRAN? У меня была эта проблема много лет назад, когда мне был нужен общий алгоритм обращения матриц, который был доступен только в FORTRAN. Это было нелегко понять - без комментариев и переменных, названных как G (J). Я преобразовал его в C, используя f2c, и он отлично работал. Но это было еще труднее понять. Два момента заключались в том, что FORTRAN считает от 1, а C от 0, поэтому было много i + 1 и j-1. Также аргументы должны были быть реализованы посредством ссылки.

Позже мне пришлось запустить это на Java. Другого алгоритма пока нет, поэтому я перевел C на Java. Это было действительно больно. И я до сих пор не понял, что происходит.

И через год или два он перестал работать!

Но, к счастью, теперь есть несколько реализаций Java.

Так что, если вы можете объяснить свои реальные требования, может быть, мы можем помочь. Я надеюсь , что это не задание, потому что в этом случае оно (IMO) плохое. Если есть какой-то магический унаследованный код, предложите вам сделать все возможное, чтобы найти современный эквивалент.

2 голосов
/ 30 ноября 2010

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

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

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

2 голосов
/ 30 ноября 2010

Если бы мне пришлось установить f2c в Windows, я бы использовал Cygwin.Теперь есть g77, я думаю, что не многие люди больше используют f2c.

1 голос
/ 13 мая 2016

Прямое преобразование в / из FORTRAN в C или в процедурную версию C ++ не должно быть сложным и рекомендуется в основном потому, что вы изучите внутреннюю работу реализации FORTRAN.грязный код с двойным подчеркиванием, например: __i (я являюсь переменной счетчика цикла).

1 голос
/ 30 ноября 2010

У вас установлена ​​MS Visual Studio от MS? Если это так, nmake доступен в командной строке Visual Studio ( не обычная командная строка). Если нет, возможно, попробуйте загрузить и установить это?

1 голос
/ 30 ноября 2010

Вы пробовали двоичный файл ?

...