Преобразование FORTRAN в C / C++

в рамках моего проекта последнего года мне нужно преобразовать некоторый код 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++,

копировать makefile.vc makefile nmake

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

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

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

Я запускаю x64 битную версию Windows Vista и попробовал "nmake", но я получаю

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

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

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

11 ответов


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

есть ли способ конвертации, который Код FORTRAN на C или c++?

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


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

в стороне я бы оценил f2c как один из всех великих кодов времени!


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

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

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

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

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

Поверните if-then-else и dowhile / enddo, подпрограмму / endsub и т. д. в скобках. Сделайте подпрограмму void, выведите поддельные имена для основных типов (например, Boolean, Character, Integer, Real, Double, Complex, Complex).

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

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

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

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

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

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


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


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

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

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


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

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

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

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

Так если вы можете объяснить ваши реальные требования, то возможно мы можем помочь. Я!--9-->Надежда что это не задание, потому что если это так, то (ИМО) плохое. Если есть какой-то волшебный устаревший код, предложите вам как можно больше найти современный эквивалент.


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

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

фон

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

результаты

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

выводы

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


вы пробовали бинарные?


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


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

автоматические инструменты, такие как f2c будет производить беспорядочный код с двойным подчеркиванием, как это:__i (I-переменная счетчика циклов).


f2c требует Cygwin для достойных результатов, и он лучше всего работает на F77, и он может удалить читаемость из кода.

это сообщение "Я ищу инструмент". Это должно быть законно,но запрещено законом. Это приводит к тому, что вопрос во многом повторяется. "Каков правильный способ сделать этот шаг", "есть ли лучший способ сделать это"и т. д. надеясь на" сэр, просто используйте этот инструмент".