2008-11-09 2 views
14

Кто-нибудь конвертировал большую программу (наш - 550 000 строк) программы Fortran 77 на C++? В какие подводные камни вы столкнулись? Успешно ли конверсия? Вы использовали такой инструмент, как for_c (http://www.cobalt-blue.com/fc/fcmain.htm)? Был ли полученный код C++ значительно быстрее или медленнее?Преобразование кода Fortran 77 в C++

+3

Ого, я не завидую вам :) – 2008-11-09 01:08:59

+0

Почему вы конвертируете? – 2008-11-09 01:09:25

+4

Вы знаете старую шутку: «rm * f - это автоматический инструмент для преобразования всего вашего источника fortran в свободные блоки диска, чтобы вы могли начать писать правильно». – 2008-11-09 02:10:57

ответ

3

Я однажды использовал это: http://manpages.ubuntu.com/manpages/hardy/man1/f2c.html, чтобы преобразовать небольшую программу fortran в C. Преобразование прошло успешно. Код не был значительно сложным для обнаружения любого изменения скорости.

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

9

Есть много вещей, чтобы рассмотреть.

На самом деле есть два пути. Один из них - преобразование прямой линии по прямой в c. Под этим я подразумеваю каждый оператор fortran для выражения equivant c.

Другой путь - переписать, и с 500k loc + это будет намного больше работать. С таким размером я, конечно же, буду искать инструмент, чтобы сделать перевод, например f2c.

Вопросов для прямого порта ...

GOTOS перевод напрямую, вам нужно будет создать ярлыки для целей GOTO.

label10:; 

    goto label10; 

Подпись на основе массива является потенциальной проблемой. c основано на нулевом значении, fortran - на 1, поэтому массивы должны быть рассчитаны на один размер в коде fortran.

реальный * 4 а (10,20) становится

#define XMAX 10 + 1 
#define YMAX 20 + 1 
float a[XMAX][YMAX]; 

позволяя цикл должен быть записан следующим образом.

for (x = 1; x <= XMAX; x++) 
    for (y = 1; y <= YMAX; y++) 
     a[x][y] = 0.0f; 

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

реальный * 8 а (XMAX, YMAX) (4,2) = 3,14

#define A(X,Y) a[Y][X] 
double a[XMAX][YMAX]; 
A(4,2) = 3.14; 

Фортран блок ИО может быть смоделировано с файлами STDIO типа. если вы используете блок 19, затем

FILE *fp19 = fopen("file","mode"); 

Там может быть проблемы с управлением кареткой, если вы используете FORtran управление кареткой в ​​файлах. Единицы 5 и 6 можно просто ссылаться на stdin и stdout без fopen.

Множество форматов можно обрабатывать с помощью семейства функций printf. Возможно, вам придется добавить дополнительные циклы для работы с некоторыми массивами fortran io.

WRITE (6, 200) (PROJ (г, 4), г = 1, 20)

int z; 
for (z = 1, z <= 20; z++) 
    printf("%lf ", proj[z][4]); 


о использовании f2c, вероятно, самый быстрый способ сделать это. Тогда вы застряли с его rtl.
o выполнение прямого порта - это выполнимая вещь. Занимает много времени, но выполнимо
o Если вы хотите сохранить его надолго, я бы порекомендовал переписать. Очень длительный, вероятно, более быстрый, но более удобный в обслуживании в конечном итоге

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

9

Это добавляет советам EvilTeach. Имейте в виду, что довольно просто ссылка Фортран 77 и код C/C++, поэтому вы можете постепенно конвертировать части приложения и связывать их со старыми частями. Вам придется подумать обо всех обычных отклонениях fortran/c (массивы строк/столбцов, индексирование массива и т. Д.), Если вы это сделаете, но это избавит вас от необходимости отлаживать всю вашу автоматически переведенную кодовую базу сразу ,

В национальных (DOE) лабораториях есть много больших гибридных кодов, которые имеют значительные инвестиции в старый код Fortran. Если вы пройдете этот маршрут, вы можете использовать Babel, который был разработан, чтобы позволить компонентам совместно использовать C, C++, Fortran, Fortran90, Python и Java в одном приложении. Мотивация для этого в лабораториях - это объединение физических моделей, построенных разными командами для действительно больших симуляций, но вам может показаться полезным и для перехода на ваш код. Он активно поддерживается и используется во многих проектах, хотя это может быть слишком сложно для того, что вы пытаетесь сделать.

2

Возможно, вы захотите изучить Promula. Он создает более читаемый код C, чем многие другие автоматические переводчики. Я не использовал Promula напрямую, но я преобразовал большое количество продукции Promula с C на C++. Легко очистить код C до легального C++, но, конечно, требуется больше усилий, чтобы сделать его действительно хорошим C++.

6

Моя реакция - почему вы хотите его преобразовать.

Вопрос о том, как разработать продукт с большой кодовой базой Fortran, рассматривался многими компаниями в 1990-х годах. То есть, нужно ли конвертировать, оставаться с Fortran или создавать гибрид. Я думаю, что большинство выбрало гибридный подход, обычно C++ для пользовательского интерфейса и исходную базу кода Fortran в фоновом режиме.

Мое предложение - посмотреть «Программирование на смешанном языке с использованием C++ и FORTRAN 77» Карстен Арнхольм, доступное по адресу http://arnholm.org/software/cppf77/cppf77.htm В первые дни Интернета этот документ был хорошо связан.

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

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

0

Я работал над приложением, которое в своем сердце было преобразовано в код FORTRAN с использованием for_c. Созданный им код был ужасным. Его было очень сложно поддерживать, поскольку большая часть его была неразборчива. К счастью, этот код был довольно стабильным, и было редко, что с ним нужно было что-то сделать.

Однако это было сделано много лет назад - около ранних 16-битных лет Windows. Может быть, for_c теперь лучше?

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