Преобразование кода Fortran 77 в С++
Кто-нибудь конвертировал большую программу (наш - 550 000 строк) кода Fortran 77 на С++? В какие подводные камни вы столкнулись? Успешно ли конверсия? Вы использовали инструмент, например for_c
(http://www.cobalt-blue.com/fc/fcmain.htm)? Был ли результат С++-кода значительно быстрее или медленнее?
Ответы
Ответ 1
Есть много вещей, чтобы рассмотреть.
Есть два пути. Один из них - преобразование прямой линии по прямой в c. Под этим я подразумеваю каждый оператор fortran для оператора equivant c.
Другой путь - переписать, а с 500k loc + это будет гораздо больше работать.
С таким размером я, конечно, искал бы инструмент, чтобы сделать перевод, например f2c.
Проблемы для прямого порта...
gotos translate напрямую, вам нужно будет создать ярлыки для целей goto.
label10:;
goto label10;
Подстрока массива является потенциальной проблемой.
c основано на нулевом значении, fortran - на 1, поэтому для кода fortran необходимо иметь размер более одного размера.
real * 4 a (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 - в столбце.
это может быть проблемой производительности. если это становится проблемой, вы можете быть в состоянии
для его решения с каким-то макроопределением, которое меняет порядок или индексы массива. На самом деле вы также можете вывести макрос из каждого из нижних индексов, чтобы он выглядел как один массив, на самом деле сопоставляемый массиву с нулевым значением.
real * 8 a (XMAX, YMAX)
a (4,2) = 3,14
#define A(X,Y) a[Y][X]
double a[XMAX][YMAX];
A(4,2) = 3.14;
fortran unit io может быть смоделирован с файлами типа stdio. если вы используете блок 19, то
FILE *fp19 = fopen("file","mode");
При управлении транспортом fortran могут быть проблемы с управлением каретой. Единицы 5 и 6 можно просто ссылаться на stdin и stdout без fopen.
Многие типы файлов могут обрабатываться с помощью семейства функций printf. Возможно, вам придется добавить дополнительные циклы для работы с некоторыми массивами fortran io.
WRITE (6, 200) (PROJ (z, 4), z = 1, 20)
int z;
for (z = 1, z <= 20; z++)
printf("%lf ", proj[z][4]);
o использование f2c, вероятно, самый быстрый способ сделать это. Тогда вы застряли с его rtl.
o Сделать прямой порт - это выполнимая вещь. Много времени, но выполнимый
o если вы хотите сохранить его надолго, я бы рекомендовал переписать. Очень много времени, возможно, быстрее, но более долговечное обслуживание
К счастью, в любом случае у вас есть исходная программа для использования в качестве базовой линии, чтобы сделать набор модульных тестов, чтобы помочь в процессе разработки.
Ответ 2
Это добавляет совет EvilTeach. Имейте в виду, что довольно легко связать код Fortran 77 и C/С++, чтобы вы могли постепенно конвертировать части приложения и связывать их со старыми частями. Вам придется подумать обо всех обычных отклонениях fortran/c (массивы строк/столбцов, индексирование массива и т.д.), Если вы это сделаете, но это избавит вас от необходимости отлаживать всю вашу автоматически переведенную кодовую базу сразу.
В национальных (DOE) лабораториях есть много таких больших гибридных кодов, которые имеют значительные инвестиции в старый код Fortran. Если вы пройдете этот маршрут, вы можете использовать Babel, который был разработан, чтобы позволить компонентам совместно использовать C, С++, Fortran, Fortran90, Python и Java - все в одном приложении. Мотивация для этого в лабораториях - это объединение физических моделей, построенных разными командами для действительно больших симуляций, но вам может показаться полезным и для перехода на ваш код. Он активно поддерживается и используется во многих проектах, хотя он может быть слишком сложным для того, что вы пытаетесь сделать.
Ответ 3
Моя реакция - это то, почему вы хотите ее преобразовать.
Вопрос о том, как разработать продукт с большой кодовой базой Fortran, рассматривался многими компаниями в 1990-х годах. То есть, нужно ли конвертировать, оставаться с Fortran или создавать гибрид. Я думаю, что большинство выбрало гибридный подход, обычно С++ для пользовательского интерфейса и исходную базу кода Fortran в фоновом режиме.
Мое предложение - посмотреть "Программирование на смешанном языке с использованием С++ и FORTRAN 77" Карстен Арнхольм, доступный по адресу http://arnholm.org/software/cppf77/cppf77.htm В предыдущие дни из Интернета этот документ был хорошо связан.
В этом документе описывается, как иметь приложение, содержащее С++ и Fortran. Я не могу сказать, могут ли некоторые технические детали устаревать, но этот документ вышел из проекта, который хотел использовать С++ для его разработки, но имел огромную базу кода Fortran.
Вы также можете взглянуть на "Научный и инженерный С++: введение с передовыми методами и примерами" Бартона и Накмана, доступные из хороших книжных магазинов.
Эта книга преподает С++ для программистов Fortran. В нем есть несколько примеров написания оберток для кода Fortran из С++. Это хорошая книга на С++, игнорирующая аспект Fortran. Это было написано до того, как был установлен стандарт, но различия не очень большие.
Ответ 4
Я когда-то использовал это: http://manpages.ubuntu.com/manpages/hardy/man1/f2c.html, чтобы преобразовать небольшую программу fortran в C. Преобразование прошло успешно. Код не был значительно сложным для обнаружения любых изменений скорости.
Поскольку ваша программа распределяется больше, я не знаю, все ли будет работать, как это было со мной.
Ответ 5
Возможно, вы захотите изучить Promula. Он создает более читаемый код C, чем многие другие автоматические переводчики. Я не использовал Promula напрямую, но я преобразовал большое количество продукции Promula с C на С++. Легко очистить C-код до легального С++, но, конечно, для его действительно хорошего С++ требуется больше усилий.
Ответ 6
Я работал над приложением, в основе которого был код, преобразованный из FORTRAN с помощью for_c. Созданный им код был ужасным. Его было очень сложно поддерживать, поскольку большая часть его была неразборчива. К счастью, этот код был довольно стабильным, и редко было что-то делать с ним.
Однако это было сделано много лет назад - около ранних 16-битных лет Windows. Может быть, for_c теперь лучше?