Convertir FORTRAN a C / C++

11 minutos de lectura

Avatar de usuario de OddCore
Núcleo impar

Como parte de mi proyecto de fin de carrera, necesito convertir un código FORTRAN a C o C++ (no importa qué idioma, siempre que pueda entenderlo y pueda entender los lenguajes de estilo C).

Descubrí f2c, un programa que supuestamente convierte FORTRAN a C, y traté de instalarlo, siguiendo las instrucciones, guardando un archivo makefile.vc en mi disco y luego haciendo

copy makefile.vc makefile
nmake

(aquí está la parte del archivo README sobre la instalación de f2c que se incluye en el archivo f2c página de descarga)

Para compilar f2c en sistemas Linux o Unix, copie makefile.u a makefile, edite makefile si es necesario (vea los comentarios en él y más abajo) y escriba “make” (o tal vez “nmake”, dependiendo de su sistema).

Para compilar f2c.exe en sistemas MS Windows con Microsoft Visual C++,

copiar makefile.vc makefile nmake

Con otros compiladores de PC, es posible que necesite compilar xsum.c con -DMSDOS (es decir, con MSDOS #definido).

Si su compilador no entiende la sintaxis ANSI/ISO C (es decir, si tiene un compilador K&R C), compile con -DKR_headers.

En sistemas que no son Unix donde los archivos tienen modos binarios y de texto separados, es posible que deba “hacer xsumr.out” en lugar de “hacer xsum.out”.

Estoy ejecutando la versión x64 bit de Windows Vista y probé “nmake”, pero obtengo

‘nmake’ no se reconoce como un comando interno o externo, un programa ejecutable o un archivo por lotes.

Descargué Nmake15.exe después de algunas búsquedas, pero no funciona en máquinas de 64 bits y aparentemente no hay una versión que lo haga. Así que descargué el SDK de Windows, después de que me dijeron que funcionaría, pero no cambió nada.

¿Dónde me equivoqué en todo esto, si es así, y hay alguna forma de convertir ese código FORTRAN en C o C ++?

  • Una palabra de advertencia: los convertidores de idioma A a idioma B pueden producir código que se ejecute correctamente (aunque esto por sí solo puede ser bastante difícil), pero ninguno de ellos produce legible por humanos código…

    usuario395760

    30 de noviembre de 2010 a las 13:34

  • ¿Qué propones entonces? Estoy abierto a sugerencias, realmente tengo que convertir ese código FORTRAN en C o C++ de alguna manera…

    – OddCore

    30 de noviembre de 2010 a las 13:40

  • ¿Qué versión de Fortran? Ha habido varios. Si f2c no ha cambiado, convierte Fortran 77. Hay al menos dos versiones más nuevas.

    –David Thornley

    30 de noviembre de 2010 a las 20:21

  • @David Thornley: 4, en realidad (Fortran 90, 95, 2003, 2008).

    – janneb

    1 de diciembre de 2010 a las 14:51

  • supongo que en realidad aprendiendo FORTRAN está fuera de cuestión. . .

    – geómetra

    26 de septiembre de 2015 a las 7:57

Avatar de usuario de LCFactorization
LCFactorización

Encontré que hay un pequeño conjunto de herramientas llamado fábula fable – Conversión automática de Fortran a C++ que se dedica a tal conversión.

También hay una revisión de tal herramienta. Resumen de los autores de la revisión:

Fondo

En computación científica, Fortran fue el lenguaje de implementación dominante durante la mayor parte de la segunda parte del siglo XX. Las muchas herramientas acumuladas durante este tiempo han sido difíciles de integrar con el software moderno, que ahora está dominado por lenguajes orientados a objetos.

Resultados

Impulsados ​​por los requisitos de un proyecto de software científico a gran escala, hemos desarrollado una herramienta de conversión de fuente a fuente de Fortran a C++ llamada FABLE. Esto permite el desarrollo continuo de nuevos métodos incluso al cambiar de idioma. Informamos sobre la aplicación de FABLE en tres proyectos principales y presentamos comparaciones detalladas del rendimiento en tiempo de ejecución de Fortran y C++.

Conclusiones

Nuestra experiencia sugiere que la mayoría de los códigos Fortran 77 se pueden convertir con un esfuerzo menor (medido en días) en comparación con el tiempo de desarrollo original (a menudo medido en años). Con FABLE es posible reutilizar y evolucionar el trabajo heredado en entornos modernos orientados a objetos, de forma portátil y fácil de mantener. FABLE está disponible bajo una licencia de código abierto no restrictiva. En FABLE, el análisis de las fuentes de Fortran está separado de la generación de las fuentes de C++. Por lo tanto, partes de FABLE podrían reutilizarse para otros idiomas de destino.

  • No es una reseña sino un artículo escrito por los autores de la herramienta.

    – Vladimir F Героям слава

    1 oct 2015 a las 8:44

  • aparentemente es una herramienta de python, pero no hay una configuración fácil a través de pip, parece que tiene que instalar un gran paquete de química computacional para obtenerlo. f2c podría ser más fácil.

    – tesch1

    14 de abril de 2019 a las 15:11

f2c realmente es el camino a seguir, siempre que tenga el código F77. Si tiene F90 o posterior, f2c no ayudará. He usado f2c muchas veces con gran éxito, siempre y cuando recuerdes el interruptor -a.

Aparte, calificaría a f2c como uno de los mejores códigos de todos los tiempos.

Tienes que tener claro por qué estás haciendo esto. ¿Es porque la funcionalidad que necesita SOLO está disponible en algunos FORTRAN heredados? Tuve este problema hace muchos años cuando necesitaba un algoritmo de inversión de matriz general, que solo estaba disponible en FORTRAN. No fue fácil de entender: no hubo comentarios ni variables nombradas como G(J). Lo convertí a C usando f2c y funcionó perfectamente. Pero era aún más difícil de entender. Dos puntos fueron que FORTRAN cuenta desde 1 y C desde 0, por lo que había muchos i+1 y j-1. También los argumentos tenían que ser implementados por referencia.

Más tarde tuve que ejecutar esto en Java. Todavía no hay otro algoritmo, así que convertí el C a Java. Esto fue realmente doloroso. Y todavía no entendía lo que estaba pasando.

¡Y después de un año o dos dejó de funcionar!

Pero, por suerte, ahora hay varias implementaciones de Java.

Entonces, si puede explicar sus requisitos reales, tal vez podamos ayudarlo. I esperanza que esto no es una tarea, porque si es así (en mi opinión) es mala. Si hay algún código heredado mágico, le sugerimos que se esfuerce al máximo para encontrar un equivalente moderno.

  • Necesito hacer un front-end para Zork en C++, pero como no pude encontrar el código fuente de Zork, opté por Adventure y encontré un código fuente de FORTRAN. Así que fui con eso. Así que sí, es una tarea, mi proyecto de fin de carrera, para ser exactos.

    – OddCore

    29 de diciembre de 2010 a las 12:04

  • Esto es emocionante. Trabajé con Mike Arnautov – Ver en.wikipedia.org/wiki/Colossal_Cave_Adventure quien desarrolló código posterior en un lenguaje más avanzado que FORTRAN. Sugiero que le escribas a Mike, le expliques tu problema y veas lo que sugiere. el código de ADVENT es brillante: poner todo el juego en FORTRAN de memoria fija en la década de 1970 es genial. Pero necesitas entrar en el espíritu del diseño. (Mike probablemente sabrá sobre Zork)

    – peter.murray.rust

    29 de diciembre de 2010 a las 12:35


  • Gracias señor, eso haré.

    – OddCore

    29 de diciembre de 2010 a las 13:20

No tienes muy claro esto, pero parece que quieres estudiar el código y, para hacerlo, quieres convertirlo a C o C++. Si desea usar el código en lugar de estudiarlo, entonces estoy fuera de lugar aquí y debe buscar compiladores de Fortran.

Abandonar. No puede encontrar ninguna forma de traducir Fortran idiomático a C o C ++ idiomático. Hay diferencias semánticas sutiles entre los idiomas, y para hacerlo bien, el programa de traducción debe ser muy preciso, tener en cuenta muchas cosas y realizar llamadas a funciones oscuras, y eso puede ser muy confuso. No obtendrá C o C++ legible.

En su lugar, debe aprender la versión adecuada de Fortran. Si entiendes C y C++, no debería ser difícil de aprender. Es solo otro idioma, y ​​no tendrá muchos conceptos nuevos.

El método que he estado usando para la conversión hasta ahora es semiautomático: muchos editores y scripts de texto.

Primero, colime toda la fuente de Fortran en un solo archivo (colocando marcadores según corresponda para permitir que los archivos se vuelvan a separar).

A continuación, convierta las etiquetas numéricas en etiquetas con nombre (por ejemplo, agregando una L antes de ellas para gotos y una F para formatos). Realice los cambios apropiados en los lugares que hacen referencia a las etiquetas.

Luego, marque la etiqueta: continúe las combinaciones y las continuaciones de las declaraciones (por ejemplo, con una marca al comienzo de cada línea donde ocurren). Luego, vuelva a unir las líneas label-continuación y declaración-continuación. En un editor como vi, eso significaría hacer una serie de (digamos) 1000J, y luego un sustituto masivo:%s/#/^V^M/g si el marcador de inicio de línea es un #. Dado que las líneas de continuación se marcaron especialmente al igual que los combos de continuar, luego se vuelven a unir.

Asegúrese de que las etiquetas if y do estén separadas (por ejemplo, escriba un patrón grep para extraer las líneas relevantes y luego escriba un programa simple de combinación de paréntesis para verificarlas). Una vez separados, puede convertir los continuos en corchetes.

Convierta if-then-else y dowhile/enddo, subroutine/endsub, etc. entre paréntesis. Anule la subrutina, invente nombres falsos para los tipos básicos (p. ej., booleano, carácter, entero, real, doble, complejo, complejo).

Los comentarios se convierten a C++ // comentarios; tanto la columna 0 como ! comentarios

Luego puede volver a crear prototipos de las funciones. Esto es efectivamente una conversión de KR a ANSI-C y requiere un programa simple para leer los encabezados de función y las declaraciones de variables para emparejarlos. Idealmente, es posible que desee poner primero las declaraciones de variables como una en una línea. Esto también requiere un script de edición y una utilidad. Por ejemplo, un “Doble A, B, C, …” se convertiría en “#Doble\nA\nB\n”. y luego se configura una utilidad para prefijar todas las líneas que no son # con la línea # anterior más reciente.

Las declaraciones de parámetros se vuelven a unir a las declaraciones de tipo y se convierten en declaraciones “const”. Los guardados se convierten en declaraciones estáticas. Commons Todavía no he encontrado una buena forma de trabajar con ellos.

Ahora vienen las partes DIFÍCILES: el dimensionamiento de la matriz, el análisis de entrada/salida de variables (para determinar qué variables deben pasarse por valor o por referencia). Debería obtener un compilador de C que reconozca el tipo de referencia o usar C++. Para el redimensionamiento de matrices, es posible que también deba pasar a C ++, lo que permite [] para ser redefinido.

El análisis in-out es algo que aún no he trabajado, así como el redimensionamiento. Pero en este punto, la fuente relevante está principalmente en C o C++ en esta etapa.

Tenga cuidado: Fortran 2010 permite el procesamiento paralelo, que va más allá de C e incluso de C++ (excepto por sus capacidades de subprocesos múltiples). Si sus programas tienen esto en ellos, las cosas se volverán mucho más difíciles.

Avatar de usuario de AShelly
AShelly

Voy a responder solo la última parte de tu pregunta:

¿Hay alguna forma de convertir ese código FORTRAN en C o C++?

Sí, lo hay: lea el código fortran y escriba las declaraciones C equivalentes en un archivo C. Ambos son lenguajes imperativos. La sintaxis es diferente pero no imposible de decodificar. Es probable que esto le brinde resultados mucho mejores que un convertidor automático y también le brindará una comprensión mucho más profunda de cómo funciona el programa original.

Si tuviera que instalar f2c en Windows, usaría Cygwin. Ahora hay g77 Espero que ya no mucha gente use f2c.

  • f2c todavía se usa cuando los compiladores de Fortran no están disponibles, cuando los paquetes de C incluyen fuentes de Netlib, etc. Es mucho más fácil de instalar que g77.

    – Fred Foo

    30 de noviembre de 2010 a las 13:31

  • Bueno, no veo el punto de eso. f2c simplemente convierte FORTRAN a C. Cómo compilarlo más allá de eso es un asunto diferente. Personalmente, he usado compiladores MS y Borland C. Pero la elección es realmente irrelevante para la conversión.

    –David Heffernan

    30 de noviembre de 2010 a las 19:30

¿Ha sido útil esta solución?