2010-11-30 18 views
7

Como parte de mi Proyecto de fin de año, necesito convertir algún código FORTRAN en C o C++ (no importa qué idioma, siempre que pueda entenderlo, y puedo entender el estilo C idiomas).Conversión de FORTRAN a C/C++

he descubierto f2c, un programa que supuestamente convierte FORTRAN a C, y trató de instalarlo, siguiendo las instrucciones, por guardar un archivo makefile.vc en mi disco y luego hacer

copy makefile.vc makefile 
nmake 

(aquí es la parte del archivo README sobre la instalación de f2c que se incluye en el f2c download page)

Recopilar f2c en Linux o Unix sistemas, copia makefile.u a Makefile, edición makefile si es necesario (ver el comentarios en él y más abajo) y escriba "make" (o tal vez "nmake", dependiendo de su sistema).

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

copia makefile.vc makefile nmake

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

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

En los sistemas no UNIX donde los archivos tienen modos binarios y de texto por separado, posible que tenga que "hacer xsumr.out" en lugar de "hacer xsum.out".

Me postulo bit versión de 64 bits de Windows Vista y probado "nmake", pero me da

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

He descargado 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 dijeran que funcionaría, pero no cambió nada.

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

+9

Una palabra de advertencia: los convertidores de LanguageA-a-languageB pueden producir código que se ejecuta correctamente (aunque esto solo puede ser bastante difícil), pero ninguno produce código * legible por humanos ... – delnan

+0

¿Qué haces? proponer entonces? Estoy abierto a sugerencias, realmente tengo que hacer ese código de FORTRAN en C o C++ de alguna manera ... – OddCore

+0

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

Respuesta

4

voy a responder, solamente la última parte de su pregunta:

¿hay alguna manera de convertir ese código FORTRAN en C o C++?

Sí hay: Lea el código fortran y escriba las declaraciones C equivalentes en un archivo C. Ambos son idiomas imprescindibles. La sintaxis es diferente pero no imposible de decodificar. Esto probablemente le dará mejores resultados que un convertidor automático, y también le dará una comprensión mucho más profunda de cómo funciona el programa original.

+3

Esta respuesta se reduce a: "¿Cómo puedo solucionar este error?" - "Solo rtfm y bricolaje, amigo". Esta respuesta funciona para cualquier pregunta SO. En matemáticas lo llamamos una "solución trivial". – sixtytrees

+0

@sixtytrees La gente fue más generosa con los votos hacia el final de la última década cuando se publicó esta respuesta. – agentp

+0

@agentp (1) Comenté mi voto a favor. (2) Subí la otra publicación de AShelly para mantener el saldo positivo y porque valía la pena votar por adelantado. ¿Cómo sabes mi voto? – sixtytrees

1

¿Has probado el binary?

+0

Lo descargué pero es un archivo .gz, y después de descargar gnuzip, todo lo que obtuve fue un .exe que me muestra una consola de comandos y nada más. – OddCore

+0

¿Quiere decir que hizo doble clic en él? Tanto 'gzip' como' f2c' son aplicaciones de línea de comandos. Obtenga 7zip de http://7-zip.org si desea un descompresor de la GUI. –

+0

Ok, extraje exitosamente el f2c.exe de eso, aunque es solo una consola de comandos. Tendré que descubrir cómo operarlo. (esperando haber hecho todo bien hasta el momento, solo he descargado el archivo MAKE del sitio original. – OddCore

2

Si tuviera que instalar f2c en Windows, usaría Cygwin. Ahora está el g77. Espero que no muchas personas usen f2c nunca más.

+0

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

+0

Bueno, no veo el sentido de eso. f2c simplemente convierte FORTRAN en C. Cómo compilarlo más allá de eso es una cuestión diferente. Personalmente, he usado compiladores de MS y Borland C. Pero la elección es realmente irrelevante para la conversión. –

1

¿Tiene instalado Visual Studio de MS? Si es así, nmake está disponible en la línea de comandos de Visual Studio (no en la línea de comando normal). Si no, ¿tal vez intente descargar e instalar eso?

+0

Sí, tengo MS Visual Studio 2010, lo intentaré con eso y te responderé, aquí! – OddCore

+0

Recibo "NMAKE: error fatal U1073: no sé cómo hacer que 'xsum.c'" sea un error. ¿Eso tiene que ver con la parte del archivo README sobre sistemas no Unix donde tengo que "hacer xsumr.out"? – OddCore

3

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

¡Por otro lado calificaría a f2c como uno de los mejores códigos de todos los tiempos!

2

No es muy claro al respecto, pero parece que quiere estudiar el código, y para hacerlo, desea convertirlo en C o C++. Si quieres usar el código en lugar de estudiarlo, entonces estoy fuera de la base aquí, y deberías buscar los compiladores de Fortran.

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

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

2

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

Luego 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 sucediendo.

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

Pero, afortunadamente, ahora hay varias implementaciones de Java.

Así que si puede explicar sus necesidades reales quizás podamos ayudarlo. I espero que esto no es una tarea, porque si es así (IMO) es una mala. Si hay algún código de legado mágico, sugiérele que intente lo más posible para encontrar un equivalente moderno.

+0

Necesito hacer un front-end para Zork en C++, pero como no pude encontrar el código fuente de Zork, fui con Adventure y encontré un código fuente de FORTRAN. Así que fui con eso. Entonces sí, es una tarea, el proyecto de mi último año, para ser exactos. – OddCore

+0

Esto es emocionante. Trabajé con Mike Arnautov - Ver http://en.wikipedia.org/wiki/Colossal_Cave_Adventure quien desarrolló código posterior en un lenguaje más avanzado que FORTRAN. Le sugiero que escriba a Mike, le explique su problema y vea lo que sugiere. el código ADVENT es brillante: para que todo el juego se convierta en memoria fija FORTRAN en la década de 1970 es genial. Pero necesitas entrar en el espíritu del diseño. (Mike probablemente sabrá sobre Zork) –

+0

vea http://www.mipmip.org/ para las coordenadas de Mike –

3

El método que he estado utilizando para la conversión hasta ahora es semiautomatizado: muchos scripts de editor y texto.

Primero, colimar todas las fuentes 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 a etiquetas con nombre (por ejemplo, agregando una L antes que ellos para gotos y F para formatos).Haga los cambios apropiados en los lugares que hacen referencia a las etiquetas.

A continuación, marque la etiqueta - continúe las combinaciones y las continuaciones de extracto (por ejemplo, con una marca al comienzo de cada línea donde se producen). Luego vuelva a unirse a las líneas label-continue y statement-continuation. 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 #. Como las líneas de continuación se marcaron especialmente como los combos de do-continue, se vuelven a unir.

Asegúrese de que las etiquetas if y do-labels estén separadas (por ejemplo, escriba un patrón grep para extraer las líneas correspondientes y luego escriba un programa simple de coincidencia de corchetes para verificarlas). Una vez separados, puedes convertir el do-continue en corchetes.

Convierta el if-then-else, y dowhile/enddo, subroutine/endsub, etc. en paréntesis. Haga que la subrutina sea nula, ponga nombres falsos para los tipos básicos (por ejemplo, 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 las funciones y las declaraciones de variables para hacerlas coincidir. Lo ideal sería que primero coloque 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 a "#Doble \ nA \ nB \ n". y luego se configura una utilidad para prefijar todas las líneas que no sean # 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 sentencias "const". Guarda convierte a declaraciones estáticas. Commons Todavía no he descubierto una buena forma de trabajar.

Ahora vienen las piezas HARD: el dimensionamiento de la matriz, el análisis de entrada/salida variable (para determinar qué variables se deben pasar por valor o por referencia). Debería obtener un compilador de C que reconozca el tipo de referencia & o use C++. Para el redimensionamiento de matriz también es posible que necesite ir a C++, lo que permite redefinir [].

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

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

2

Encontré que hay una pequeña caja de herramientas llamada fábulafable - Automatic Fortran to C++ conversion que está dedicada a tal conversión.

THere también es a review of such a tool. Resumen de los autores de la revisión:

Antecedentes

En la computación científica, Fortran era el lenguaje de implementación dominante en la mayor parte de la segunda parte del siglo 20. 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

Impulsado por los requisitos de un proyecto de software científico a gran escala, que han desarrollado una Fortran a C++ herramienta de conversión llamado FÁBULA de fuente a fuente. Esto permite el desarrollo continuo de nuevos métodos incluso al cambiar de idioma. Divulgamos la aplicación de FABLE en tres proyectos principales y presentamos comparaciones detalladas de funcionamientos del tiempo de ejecución de Fortran y de C++.

Conclusiones

Nuestra experiencia sugiere que la mayoría de los 77 códigos Fortran se pueden convertir con un esfuerzo que es de menor importancia (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 una manera portátil y sostenible. FABLE está disponible bajo una licencia de fuente abierta 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.

+1

No es una revisión sino un artículo escrito por los autores de la herramienta. –

+0

gracias. Tienes razón. – LCFactorization

1

La conversión directa a/de FORTRAN a C o a la versión de procedimiento de C++ no debe ser complicada y se recomienda principalmente porque aprenderá el funcionamiento interno de la implementación de FORTRAN.

Herramientas automáticas como f2c producirán código desordenado con doble guión bajo como este: __i (siendo yo la variable de contador de bucle).

+0

OP preguntó sobre la traducción del código al final de su publicación. OP no publicó ningún ejemplo de código FORTRAN, ni ningún constructo de lenguaje FORTRAN se mencionaron en su publicación, entonces, ¿cómo podría proporcionar una respuesta más constructiva a su pregunta? – beniekg

+0

De hecho. De las colas de revisión a veces no es fácil ver la imagen completa, lo siento, parecía que debería haber sido un comentario. – CherryDT

+0

¡espero que la OP haya terminado su proyecto de * año final * por ahora! – agentp

-1

f2c requiere Cygwin para obtener resultados decentes y funciona mejor en F77 y podría eliminar la legibilidad del código.

Esta es una publicación de "Estoy buscando una herramienta". Debería ser legal, pero está prohibido en SO. Esto resulta en muchas formas de replantear la pregunta. "¿Cuál es la forma correcta de hacer este paso", "hay una mejor manera de hacer esto", etc. con la esperanza de "señor, simplemente use esta herramienta".