Pregunta

Recientemente he llegado a mantener una gran cantidad de código FORTRAN que requiere cálculos científicos intensivos.Tengo dificultades para manejar todos los, digamos, matices de un idioma de cuarenta años, a pesar de Google y dos libros de nivel introductorio.El código está plagado de "mejoras que mejoran el rendimiento".¿Alguien tiene alguna guía o consejo práctico para Delaware-¿optimizar FORTRAN en niveles CS 101?¿Alguien tiene conocimiento de cómo operaba la optimización del código FORTRAN?¿Hay algún problema típico de FORTRAN que no se le ocurra a un desarrollador desarrollado en Java/C++/.NET que se haga cargo de una base de código FORTRAN 77/90?

¿Fue útil?

Solución

Tienes que tener una "sensación" de lo que los programadores tenían que hacer en el pasado.La gran mayoría del código con el que trabajo es más antiguo que yo y se ejecutaba en máquinas que eran "nuevas" cuando mis padres estaban en la escuela secundaria.

Los FORTRAN-ismos comunes con los que trato y que perjudican la legibilidad son:

  • Bloques comunes
  • Variables implícitas
  • Dos o tres bucles DO con declaraciones CONTINUE compartidas
  • GOTO en lugar de bucles DO
  • Declaraciones aritméticas IF
  • GOTO calculado
  • Equivalencia REAL/INTEGER/otro en algún bloque común

Las estrategias para resolverlos implican:

  1. Conseguir Spag / plusFORT, vale la pena, resuelve muchos de ellos automáticamente y sin errores (tm)
  2. Pase a Fortran 90 si es posible, si no, pase a Fortran 77 de formato libre
  3. Agregue IMPLICIT NONE a cada subrutina y luego corrija cada error de compilación, lo que requiere mucho tiempo pero, en última instancia, es necesario; algunos programas pueden hacer esto automáticamente (o puede crear un script)
  4. Mover todos los bloques COMUNES a MÓDULOS, fruta madura, vale la pena
  5. Convierta declaraciones IF aritméticas en bloques IF..ELSEIF..ELSE
  6. Convierta GOTO calculados en bloques SELECT CASE
  7. Convierta todos los bucles DO a la sintaxis F90 más nueva

    myloop: do ii = 1, nloops
        ! do something
    enddo myloop
    
  8. Convierta miembros de bloques comunes equivalentes en memoria ASIGNABLE asignada en un módulo o en sus rutinas de caracteres verdaderos si Hollerith se almacena en un formato REAL.

Si tuviera preguntas más específicas sobre cómo realizar algunas tareas de legibilidad, puedo darle un consejo.Tengo una base de código de unos cientos de miles de líneas de Fortran que se escribieron a lo largo de 40 años y de la que soy responsable de alguna manera, por lo que probablemente me he encontrado con cualquier "problema" que haya encontrado.

Otros consejos

Caja de jabón de Fortran heredada

Ayudé a mantener/mejorar una base de código Fortran heredado durante bastante tiempo y en su mayor parte pienso variables de seis letras está en el dinero.Sin embargo, ese consejo tiende a lo técnico;Una cuestión más difícil de resolver es la de implementar "buenas prácticas".

  • Establezca un estilo de codificación requerido y pautas de codificación.
  • Requerir una revisión del código (¡de algo más que solo el codificador!) para cualquier cosa enviada a la base del código.(El control de versiones debe estar vinculado a este proceso).
  • Comience a construir y ejecutar pruebas unitarias;lo mismo ocurre con las pruebas de referencia o de regresión.

Estas pueden parecer cosas obvias hoy en día, pero a riesgo de generalizar demasiado, afirmo que la mayoría de las tiendas de códigos Fortran tienen una cultura arraigada, algunas comenzaron antes de que existiera el término "ingeniería de software", y que con el tiempo lo que llega a dominar es "Hágalo ahora".(Esto no es exclusivo de las tiendas Fortran de ninguna manera).

Aceptando trampas

Pero, ¿qué hacer con una base de código heredada ya existente y sucia?Estoy de acuerdo con Joel Spolsky en la reescritura, no.Sin embargo, en mi opinión variables de seis letras apunta a la excepción permitida: Utilice herramientas de software para realizar la transición a mejores construcciones de Fortran. Los analizadores de código pueden detectar/corregir muchas cosas (VERIFICAR) y reescritores de código (plusFORT).Si tienes que hacerlo a mano, asegúrate de tener un motivo apremiante.(Me gustaría tener a mano una referencia a la cantidad de errores de software que surgieron al corregir errores de software, es una lección de humildad.Creo que alguna de esas estadísticas está en Programación C experta.)

Probablemente la mejor ofensiva para ganar el juego de trampas de Fortran es tener la mejor defensa:Conociendo bastante bien el idioma.Para lograr ese fin, recomiendo...¡libros!

Biblioteca del árbol muerto de Fortran

A lo largo de los años, sólo he tenido un éxito modesto como "molesto de control de calidad", pero he descubierto que la educación funciona, a veces sin darme cuenta, y que una de las cosas más influyentes es un libro de referencia que alguien tenga a mano.Me encanta y lo recomiendo mucho.

Fortran 90/95 para científicos e ingenieros, por Stephen J.Chapman

El libro es incluso bueno con Fortran 77 porque identifica específicamente las construcciones que no deberían usarse y ofrece mejores alternativas.Sin embargo, en realidad es un libro de texto y puede perder fuerza cuando realmente quieres conocer el meollo de la cuestión de Fortran 95, por lo que recomiendo

Fortran 90/95, de Michael Metcalf y John K.reid

como su referencia (sic) para Fortran 95.Tenga en cuenta que no es el escrito más lúcido, pero el velo se levantará cuando realmente desee aprovechar al máximo una nueva característica de Fortran 95.

Por centrarme en los problemas de pasar de Fortran 77 a Fortran 90, disfruté

Migrando a Fortran 90, por Jim Kerrigan

pero el libro ya está agotado.(Simplemente no entiendo el uso que hace O'Reilly de Safari, ¿por qué no están disponibles todos y cada uno de sus libros agotados?)

Por último, en cuanto al heredero del maravilloso, maravilloso clásico, Herramientas de software, yo nomino

FORTRAN clásico, por Michael Kupferschmid

Este libro no sólo muestra lo que se puede hacer "sólo" con Fortran 77, sino que también habla de algunos de los problemas más sutiles que surgen (por ejemplo, se debe o no se debe usar la declaración EXTERNA).Este libro no cubre exactamente el mismo espacio que "Herramientas de software", pero son dos de los tres libros de programación de Fortran que yo etiquetaría como "divertidos"....(aqui esta el tercero).

Consejos varios que se aplican a casi cada compilador de Fortran

  • Existe una opción del compilador para imponer el comportamiento IMPLICIT NONE, que puede utilizar para identificar rutinas problemáticas sin modificarlas primero con la declaración IMPLICIT NONE.Este consejo no parecerá significativo hasta después de la primera vez que una compilación falle debido a un comando IMPLICIT NONE insertado en una rutina heredada.(¿Qué?¿La revisión de tu código no detectó esto?;-)
  • Existe una opción de compilación para verificar los límites de la matriz, que puede resultar útil al depurar código Fortran 77.
  • Los compiladores de Fortran 90 deberían poder compilar casi todo el código de Fortran 77 e incluso el código de Fortran más antiguo.Active las opciones de informes en su compilador Fortran 90, ejecute su código heredado y tendrá un comienzo decente en la verificación de sintaxis.Algunos compiladores comerciales de Fortran 77 son en realidad compiladores de Fortran 90 que se ejecutan en modo Fortran 77, por lo que esta podría ser una opción relativamente trivial para cualquier script de compilación que tenga.

Hay algo en la pregunta original sobre lo que advertiría.Dice que el código está plagado de "mejoras para mejorar el rendimiento".Dado que los problemas de Fortran son generalmente de naturaleza científica y matemática, no asuma que estos trucos de rendimiento están ahí para mejorar la compilación.Probablemente no se trate del idioma.En Fortran, la solución rara vez se trata de la eficiencia del código en sí, sino de las matemáticas subyacentes para resolver el problema final.Los trucos pueden hacer que la compilación sea más lenta, incluso pueden hacer que la lógica parezca confusa, pero la intención es hacer que la solución sea más rápida.A menos que sepa exactamente qué está haciendo y por qué, déjelo en paz.

Incluso una refactorización simple, como cambiar nombres de variables que parecen tontos, puede ser un gran problema.Históricamente, las ecuaciones matemáticas estándar en un campo determinado de la ciencia habrán utilizado una taquigrafía particular desde los días de Maxwell.Entonces, ver una matriz llamada B(:) en electromagnetismo les dice a todos los ingenieros de Emag exactamente qué se está resolviendo.Cambie eso bajo su propio riesgo.Moraleja, conozca la nomenclatura estándar de la ciencia antes de cambiarle el nombre también.

Como alguien con experiencia tanto en FORTRAN (versión 77, aunque ha pasado un tiempo desde que lo usé en serio) como en C/C++, el elemento a tener en cuenta que inmediatamente me viene a la mente son las matrices.Las matrices FORTRAN comienzan con un índice de 1 en lugar de 0 como lo hacen en C/C++/Java.Además, la disposición de la memoria se invierte.Entonces, incrementar el primer índice le brinda ubicaciones de memoria secuenciales.

Mi esposa todavía usa FORTRAN con regularidad y tiene algo de código C++ con el que necesita trabajar ahora que estoy a punto de comenzar a ayudarla.A medida que surjan problemas durante su conversión, intentaré señalarlos.Quizás ayuden.

¿Podrías explicar qué tienes que hacer para mantener el código?¿Realmente tienes que modificar el código?Si puede salirse con la suya modificando solo la interfaz de ese código en lugar del código en sí, sería lo mejor.

El problema inherente cuando se trata de un gran código científico (no sólo FORTRAN) es que tanto las matemáticas subyacentes como la implementación son complejas.Casi por defecto, la implementación tiene que incluir optimización de código, para que se ejecute dentro de un plazo razonable.Esto se ve agravado por el hecho de que gran parte del código en este campo es creado por científicos/ingenieros expertos en su campo, pero no en desarrollo de software.Digamos que "fácil de entender" no es la primera prioridad para ellos (yo era uno de ellos y todavía estaba aprendiendo a ser un mejor desarrollador de software).

Debido a la naturaleza del problema, no creo que una pregunta y respuesta generales sean suficientes para resultar útiles.Le sugiero que publique una serie de preguntas específicas con un fragmento de código adjunto.¿Quizás empezando por el que te da más dolor de cabeza?

He usado Fortran a partir de la versión del 66 desde 1967 (en un IBM 7090 con 32k palabras de memoria).Luego usé PL/1 por algún tiempo, pero luego volví a Fortran 95 porque es ideal para los problemas de matrices/números complejos que tenemos.Me gustaría agregar a las consideraciones que gran parte de la complicada estructura de los códigos antiguos se debe simplemente a la pequeña cantidad de memoria disponible, lo que obliga a cosas como la reutilización de algunas líneas de código a través de métodos calculados o asignados. GOTOs.Otro problema es la optimización al definir variables auxiliares para cada subexpresión repetida; los compiladores simplemente no optimizaron para eso.Además, no se le permitía escribir DO i=1,n+1;tuviste que escribir n1=n+1; DO i=1,n1.En consecuencia, los códigos antiguos se ven abrumados por variables superfluas.Cuando reescribí un código en Fortran 95, sólo sobrevivió el 10% de las variables.Si desea que el código sea más legible, le recomiendo buscar variables que puedan eliminarse fácilmente.

Otra cosa que podría mencionar es que durante muchos años las matrices aritméticas y multidimensionales complejas fueron muy ineficientes.Es por eso que a menudo se encuentra código reescrito para realizar cálculos complejos utilizando solo variables reales y matrices abordadas con un único índice lineal.

Bueno, en cierto sentido, tienes suerte, porque Fortran no tiene muchas construcciones sutiles de flujo de control o herencia o similares.Por otro lado, tiene algunas trampas realmente sorprendentes, como las cosas de rama a etiqueta numérica calculadas aritméticamente, las variables escritas implícitamente que no requieren declaración, la falta de palabras clave verdaderas.

No sé acerca de las "mejoras para mejorar el rendimiento".Supongo que la mayoría de ellos probablemente sean ineficaces, ya que un par de décadas de tecnología de compilación han hecho que la mayoría de las sugerencias sean innecesarias.Desafortunadamente, probablemente tendrás que dejar las cosas como están, a menos que planees hacer una reescritura masiva.

De todos modos, el código de cálculo científico central debería ser bastante legible.Cualquier lenguaje de programación que utilice aritmética infija sería una buena preparación para leer el código de asignación y aritmética de Fortran.

Me encantaba FORTRAN, solía enseñar y codificar en él.Sólo quería incluir eso.No lo he tocado en años.
Comencé en COBOL, cuando pasé a FORTRAN me sentí liberado.Todo es relativo ¿no?Respaldo lo que se ha dicho anteriormente: reconocer que este es un lenguaje PROCEDIMIENTO, sin sutilezas, así que tómalo como lo ves.
Probablemente te frustre para empezar.

Comencé con Fortran IV (WATFIV) con tarjetas perforadas y mis primeros años de trabajo fueron VS FORTRAN v1 (IBM, nivel Fortran 77).Hay muchos buenos consejos en este hilo.

Yo agregaría que hay que distinguir entre las cosas que se hacen para que la bestia se ejecute, las cosas que "optimizan" el código y las cosas que son más legibles y fáciles de mantener.Recuerdo haber tenido que lidiar con superposiciones VAX al intentar que el código de simulación DOE se ejecutara en IBM con memoria virtual (tuvieron que eliminarse y todo se convirtió en un espacio de direcciones).

Sin duda, comenzaría reestructurando cuidadosamente las estructuras de control de FORTRAN IV al menos al nivel FORTRAN 77, con sangrías y comentarios adecuados.Intente deshacerse de estructuras de control primitivas como ASSIGN y COMPUTED GOTO y IF aritmético y, por supuesto, tantos GOTO como pueda (usando IF-THEN-ELSE-ENDIF).Definitivamente use IMPLICIT NONE en cada rutina, para obligarlo a declarar correctamente todas las variables (no creería cuántos errores detecté en el código de otras personas: errores tipográficos en los nombres de las variables).Tenga cuidado con las "optimizaciones prematuras" que es mejor dejar que el compilador maneje por sí solo.

Para que este código siga vigente y sea mantenible, se lo debe a usted mismo y a sus sucesores hacerlo legible y comprensible. ¡Solo asegúrese de lo que está haciendo mientras cambia el código! FORTRAN tiene muchas construcciones peculiares que pueden fácilmente hacer tropezar a alguien que viene del lado C del mundo de la programación.Recuerde que FORTRAN se remonta a mediados de los años 50, cuando no existía tal cosa como una ciencia del lenguaje y el diseño de compiladores, solo ad hoc Hackear algo (lo siento, Dr.¡B!).

Aquí tenéis otro que me ha picado de vez en cuando.Cuando esté trabajando en código FORTRAN, asegúrese de omitir las seis columnas iniciales.De vez en cuando, solo obtengo el código con una sangría de cinco espacios y nada funciona.A primera vista, todo parece estar bien y finalmente me doy cuenta de que todas las líneas comienzan en la columna 6 en lugar de en la columna 7.

Para cualquiera que no esté familiarizado con FORTRAN, las primeras 5 columnas son para números de línea (=etiquetas), la sexta columna es para un carácter de continuación en caso de que tenga una línea de más de 80 caracteres (simplemente coloque algo aquí y el compilador sabrá que esta línea es en realidad parte del anterior) y el código siempre comienza en la columna 7.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top