online - fortran pdf
Aprendiendo FORTRAN en la era moderna (10)
Recientemente he llegado a mantener una gran cantidad de código FORTRAN intensivo en cálculo científico. Tengo dificultades para manejar todos los, por ejemplo, los matices de un idioma de cuarenta años, a pesar de Google y dos libros de introducción. El código está plagado de "mejoras para mejorar el rendimiento". ¿Alguien tiene guías o consejos prácticos para desestimular los niveles de FORTRAN en CS 101? ¿Alguien tiene conocimiento de cómo funciona la optimización del código FORTRAN? ¿Hay algún ''atraso'' típico de FORTRAN que no se le ocurra a un desarrollador elevado de Java / C ++ / .NET que se haga cargo de una base de código FORTRAN 77/90?
Legacy Fortran Soapbox
Ayudé a mantener / mejorar una base de código Fortran heredada durante bastante tiempo y, en general, creo que las variables de seis letras están en el dinero. Sin embargo, ese consejo tiende a lo técnico; una disputa más difícil es implementar "buenas prácticas".
- Establezca un estilo de codificación requerido y pautas de codificación.
- Requerir una revisión del código (¡más que el codificador!) Para todo lo que se envíe a la base de códigos. (El control de versiones debe estar vinculado a este proceso).
- Comience a construir y ejecutar pruebas unitarias; lo mismo sucede con las pruebas comparativas o de regresión.
Estas cosas pueden parecer obvias en estos días, pero a riesgo de generalizar demasiado, afirmo que la mayoría de las tiendas de código 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 viene a dominar es "Hazlo ahora". (Esto no es exclusivo de las tiendas Fortran de ninguna manera).
Abrazando Gotchas
Pero, ¿qué hacer con una antigua base de código tradicional heredada? Estoy de acuerdo con Joel Spolsky en la reescritura, don''t . Sin embargo, en mi opinión, sixlettervariables apunta a la excepción permitida: usar herramientas de software para hacer la transición a mejores constructos de Fortran. Mucho puede ser capturado / corregido por analizadores de código ( FORCHECK ) y FORCHECK código ( plusFORT ). Si tiene que hacerlo a mano, asegúrese de tener un motivo urgente. (Me gustaría tener a mano una referencia a la cantidad de errores de software que surgieron de la reparación de errores de software, es humillante. Creo que algunas de esas estadísticas se encuentran en la Programación Expert C ).
Probablemente la mejor ofensiva para ganar el juego de Fortran gotchas sea tener la mejor defensa: conocer el idioma bastante bien. Para promover ese fin, recomiendo ... ¡libros!
Biblioteca Fortran Dead Tree
A lo largo de los años he tenido un éxito modesto como "regaña de QA", pero descubrí que la educación sí funciona, algunas veces inadvertidamente, y que una de las cosas más influyentes es un libro de referencia que alguien tiene a mano. Me encanta y recomiendo encarecidamente
Fortran 90/95 para científicos e ingenieros , por Stephen J. Chapman
El libro es incluso bueno con Fortran 77 en el sentido de que identifica específicamente los constructos que no deberían usarse y brinda las mejores alternativas. Sin embargo, en realidad es un libro de texto y puede quedarse sin vapor cuando realmente quieres saber lo esencial de Fortran 95, y por eso te recomiendo
Fortran 90/95 Explicado , por Michael Metcalf y John K. Reid
como referencia de ir a (sic) para Fortran 95. Tenga en cuenta que no es la escritura más lúcida, pero el velo se levantará cuando realmente desee sacar el máximo provecho de una nueva característica de Fortran 95.
Para centrarme en los problemas de ir de Fortran 77 a Fortran 90, disfruté
Migrando a Fortran 90 , por Jim Kerrigan
pero el libro ahora está agotado. (Simplemente no entiendo el uso que hace O''Reilly de Safari , ¿por qué no están disponibles todos sus libros descatalogados?)
Por último, en cuanto al heredero del maravilloso y maravilloso clásico, Software Tools , nomino
Classical FORTRAN , por Michael Kupferschmid
Este libro no solo muestra lo que se puede hacer con "solo" Fortran 77, sino que también habla de algunos de los problemas más sutiles que surgen (por ejemplo, debería o no debería uno usar la declaración EXTERNAL). 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 etiqueto como "divertidos" ... ( aquí está el tercero ).
Asesoramiento misceláneo que se aplica a casi todos los compiladores de Fortran
- Existe una opción de compilación para imponer el comportamiento IMPLICIT NONE, que puede usar para identificar las 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 se construyen bombas debido a un comando IMPLICIT NONE insertado en una rutina heredada. (¿Qué? ¿Tu revisión de código no captó esto? ;-)
- Hay una opción de compilación para la comprobación de límites de matriz, que puede ser útil al depurar el código Fortran 77.
- Los compiladores Fortran 90 deberían ser capaces de compilar casi todos los códigos Fortran 77 e incluso código Fortran más antiguo. Active las opciones de informes en su compilador Fortran 90, ejecute su código heredado a través de él y tendrá un comienzo decente en la comprobación de sintaxis. Algunos compiladores Fortran 77 comerciales son en realidad compiladores Fortran 90 que se ejecutan en modo Fortran 77, por lo que esta podría ser una opción relativamente trivial para cualquiera de los scripts de compilación que tenga.
¿Podría explicar lo que tiene que hacer para mantener el código? ¿De verdad tienes que modificar el código? Si puede escapar modificando solo la interfaz de ese código en lugar del código en sí, sería lo mejor.
El problema inherente al tratar con un gran código científico (no solo FORTRAN) es que las matemáticas subyacentes y la implementación son complejas. Casi de manera predeterminada, la implementación debe incluir la optimización del código para poder ejecutarse dentro de un marco de tiempo razonable. Esto se ve agravado por el hecho de que gran cantidad de código en este campo es creado por científicos / ingenieros que son expertos en su campo, pero no en el desarrollo de software. Digamos que "fácil de entender" no es la primera prioridad para ellos (yo era uno de ellos, todavía estoy aprendiendo a ser un mejor desarrollador de software).
Debido a la naturaleza del problema, no creo que una pregunta y respuesta general sea suficiente para ser útil. Te sugiero que publiques una serie de preguntas específicas con un fragmento de código adjunto. Tal vez comenzando con el que le da más dolor de cabeza?
Aquí hay otro que me ha mordido de vez en cuando. Cuando trabaje con el código FORTRAN, asegúrese de omitir las seis columnas iniciales. De vez en cuando, solo obtendré el código sangrado en 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 la columna 7.
Para cualquiera que no esté familiarizado con FORTRAN, las primeras 5 columnas son para números de línea (= etiquetas), la 6ª columna es para un personaje de continuación en caso de que tenga una línea de más de 80 caracteres (simplemente ponga algo aquí y el compilador sepa que esta línea es en realidad parte de la anterior) y el código siempre comienza en la columna 7.
Bueno, en cierto sentido, tienes suerte, porque Fortran no tiene mucho en el camino de constructos sutiles de flujo de control o herencia o similares. Por otro lado, tiene algunos errores realmente asombrosos, como las cosas de la etiqueta ramificada a la etiqueta numérica calculada aritméticamente, las variables implícitamente tipadas que no requieren declaración, la falta de palabras clave verdaderas.
No sé sobre las "mejoras para mejorar el rendimiento". Supongo que la mayoría de ellos probablemente no sean efectivos, ya que un par de décadas de tecnología de compilación han hecho que la mayoría de las insinuaciones sean innecesarias. Desafortunadamente, es probable que tengas que dejar las cosas tal como están, a menos que planees hacer una reescritura masiva.
De todos modos, el código de cálculo científico central debe ser bastante legible. Cualquier lenguaje de programación que use infinidad de aritmética sería una buena preparación para leer el código de aritmética y asignación de Fortran.
Como alguien con experiencia tanto en FORTRAN (sabor 77 a pesar de que ha pasado un tiempo desde que lo usé en serio) y C / C ++, el elemento a tener en cuenta que salta inmediatamente 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 te da ubicaciones de memoria secuenciales.
Mi esposa todavía usa FORTRAN con regularidad y tiene un código C ++ con el que necesita trabajar ahora que estoy a punto de ayudarla. A medida que aparezcan problemas durante su conversión, trataré de señalarlos. Quizás ellos ayuden.
Empecé con Fortran IV (WATFIV) en tarjetas perforadas, y mis primeros años de trabajo fueron VS FORTRAN v1 (IBM, nivel Fortran 77). Un montón de buenos consejos en este hilo.
Yo agregaría que tienes que distinguir entre las cosas hechas para hacer funcionar a la bestia, versus las cosas que "optimizan" el código, frente a las cosas que son más legibles y mantenibles. Recuerdo tratar con superposiciones de VAX al intentar obtener código de simulación DOE para que se ejecutara en IBM con memoria virtual (tuvieron que ser eliminados y todo se convirtió en un espacio de direcciones).
Ciertamente comenzaría reestructurando cuidadosamente las estructuras de control de FORTRAN IV al menos al nivel de FORTRAN 77, con la sangría adecuada y comentando. Intente deshacerse de las estructuras de control primitivas como ASSIGN y COMPUTED GOTO y aritmética IF, y por supuesto, tantas GOTO como pueda (usando IF-THEN-ELSE-ENDIF). Definitivamente use IMPLICIT NONE en cada rutina, para forzarlo a declarar adecuadamente todas las variables (no creería cuántos errores atrapé en el código de otras personas - errores ortográficos en los nombres de las variables). Tenga cuidado con las "optimizaciones prematuras" que le conviene dejar que el compilador maneje por sí mismo.
Si este código continúa vivo y puede mantenerse, se lo debe a usted y a sus sucesores para que sea legible y comprensible. ¡Solo asegúrese de lo que está haciendo mientras cambia el código! FORTRAN tiene muchas construcciones peculiares que pueden confundir fácilmente a alguien que viene del lado C del mundo de la programación. Recuerde que FORTRAN se remonta a mediados y finales de los 50, cuando no existía la ciencia del lenguaje y el diseño de compiladores, solo el hackeo ad hoc de algo (lo siento, Dr. B!).
Hay algo en la pregunta original sobre el que advertiría. Usted 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 suponga que estos trucos de rendimiento están ahí para mejorar la compilación. Probablemente no se trata del lenguaje. 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 puede hacer que la lógica parezca desordenada, pero la intención es hacer que la solución sea más rápida. A menos que sepa exactamente lo que está haciendo y por qué, déjelo en paz.
Incluso la refactorización simple, como cambiar los nombres de variables tontas puede ser un gran escollo. Históricamente, las ecuaciones matemáticas estándar en un campo de la ciencia habrán usado una taquigrafía particular desde los días de Maxwell. Entonces, ver una matriz llamada B (:) en electromagnetismo le dice a todos los ingenieros de Emag exactamente para qué se está resolviendo. Cambie eso a su propio riesgo. Moraleja, conozca la nomenclatura estándar de la ciencia antes de cambiar el nombre también.
He usado Fortran comenzando con la versión ''66 desde 1967 (en una IBM 7090 con 32k palabras de memoria). Luego utilicé PL / 1 por algún tiempo, pero luego volví a Fortran 95 porque es ideal para los problemas de matriz / número complejo que tenemos. Me gustaría agregar a las cooperativas que gran parte de la estructura intrincada de los códigos antiguos se debe simplemente a la poca cantidad de memoria disponible, lo que obliga a reutilizar algunas líneas de código a través de GOTO calculados o asignados. Otro problema es la optimización al definir variables auxiliares para cada subexpresión repetida; los compiladores simplemente no se optimizaron para eso. Además, no se permitió escribir DO i = 1, n + 1; tenías que escribir n1 = n + 1; DO i = 1, n1. En consecuencia, los códigos antiguos están saturados de variables superfluas. Cuando reescribí un código en Fortran 95, solo 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 altamente ineficientes. Es por eso que a menudo se reescribe el código para hacer cálculos complejos usando solo variables reales, y las matrices se direccionan con un solo índice lineal.
Me encantó FORTRAN, solía enseñar y codificar en él. Solo quería echar eso. No lo he tocado en años.
Empecé en COBOL, cuando me mudé a FORTRAN, sentí que me liberaron. Todo es relativo, ¿sí? En segundo lugar, lo que se ha dicho antes: reconozca que se trata de un lenguaje PROCEDIMIENTO, sin subtendencias, así que tómelo como lo ve.
Probablemente te frustres para empezar.
Tienes que tener una idea de lo que los programadores tuvieron que hacer durante el día. La gran mayoría del código con el que trabajo es más antiguo que yo y funcionaba en máquinas que eran "nuevas" cuando mis padres estaban en la escuela secundaria.
Los FORTRAN-ismos comunes con los que trato, que perjudican la legibilidad son:
- Bloques comunes
- Variables implícitas
- Dos o tres bucles DO con declaraciones CONTINUAR compartidas
- GOTO en lugar de bucles DO
- Declaraciones IF aritméticas
- Computado GOTO
- Equivalencia REAL / INTEGER / otro en un bloque común
Las estrategias para resolver estos involucran:
- Obtén Spag / plusFORT , vale la pena el dinero, resuelve muchos de ellos automáticamente y sin errores (tm)
- Si es posible, muévase a Fortran 90, si no se mueve al formato libre Fortran 77
- Agregue IMPLICIT NONE a cada subrutina y luego corrija todos los errores de compilación, que consumen mucho tiempo pero que en última instancia son necesarios, algunos programas pueden hacer esto por usted automáticamente (o puede crear un script)
- Mover todos los bloques COMUNES a los MÓDULOS, fruta colgante baja, vale la pena
- Convierta las sentencias IF aritméticas en bloques IF..ELSEIF..ELSE
- Convierta GOTO calculados a bloques SELECT CASE
Convierta todos los bucles DO a la sintaxis F90 más nueva
myloop: do ii = 1, nloops ! do something enddo myloop
Convierta los miembros del bloque común equivalente a la memoria ASIGNABLE asignada en un módulo, o a sus rutinas de caracteres verdaderos si se almacena Hollerith en un REAL
Si tuviera preguntas más específicas sobre cómo llevar a cabo algunas tareas de legibilidad, puedo dar consejos. Tengo una base de código de unos cientos de miles de líneas de Fortran que se escribió en el lapso de 40 años de los que soy responsable de alguna manera, así que probablemente me he topado con cualquier "problema" que haya encontrado.