2010-11-30 3 views
7

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

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

copy makefile.vc makefile 
nmake 

(здесь часть README файла об установке f2c, который входит в f2c download page)

чтобы компилировать f2c на Linux или Unix систем, копировать makefile.u в Makefile, редактировать Makefile, если это необходимо (см в нем и ниже) и введите «make» (или, может быть, «nmake», в зависимости от вашей системы).

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

копию makefile.vc Makefile NMAKE

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

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

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

Я бегу x64 битной версии Windows Vista и пытался «Nmake», но я получаю

«Nmake» не распознается как внутренней или внешней командой, исполняемой программой или пакетным файлом.

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

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

+9

Предупреждение: языковые преобразователи LanguageA-to-language могут создавать код, который работает правильно (хотя это одно может быть довольно сложным), но ни один из них не производит * человеко-читаемый * код ... – delnan 2010-11-30 13:34:44

+0

Что вы предложить? Я открыт для предложений, мне просто нужно сделать код FORTRAN на C или C++ в некотором роде ... – OddCore 2010-11-30 13:40:02

+0

Какая версия Fortran? Их было несколько. Если f2c не изменился, он преобразует Fortran 77. Существует как минимум две новые версии. – 2010-11-30 20:21:16

ответ

4

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

есть ли способ преобразования, что FORTRAN код в C или C++?

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

1

Вы пробовали binary?

+0

Я скачал это, но это файл .gz, и после загрузки gnuzip все, что я получил, это .exe, который запускает консоль у меня и ничего больше. – OddCore 2010-11-30 13:38:59

+0

Вы имеете в виду, что вы его дважды нажали? И `gzip`, и` f2c` являются приложениями командной строки. Получите 7zip с сайта http://7-zip.org, если вы хотите разблокировать GUI. – 2010-11-30 13:48:00

+0

Хорошо, я успешно извлек файл f2c.exe из этого, хотя это просто консоль. Мне нужно выяснить, как его использовать. (надеюсь, что я сделал все правильно до сих пор, я только загрузил make-файл с исходного сайта. – OddCore 2010-11-30 16:04:09

2

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

1

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

3

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

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

2

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

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

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

2

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

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

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

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

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

3

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

Сначала объедините все источники Fortran в один файл (поместив маркеры, чтобы разрешить переделывать файлы).

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

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

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

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

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

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

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

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

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

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

2

Я нашел небольшой инструментарий по имени fablefable - Automatic Fortran to C++ conversion, который предназначен для такого преобразования.

Также есть a review of such a tool. Выдержки из авторов обзора:

фона

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

Результаты

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

Выводы

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

1

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

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

-1

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

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

Смежные вопросы