oop - Escribiendo código Fortran robusto y "moderno"
assertions scientific-computing (7)
En algunos entornos científicos, a menudo no se puede prescindir de FORTRAN ya que la mayoría de los desarrolladores solo conocen ese modismo, y hay mucho código heredado y experiencia relacionada. Y francamente, no hay muchas otras opciones multiplataforma para la programación de alto rendimiento (C ++ haría la tarea, pero la sintaxis, las matrices de inicio cero y los punteros no son compatibles con algunas personas).
Entonces, asumamos que un nuevo proyecto debe usar Fortran 90, pero quiero construir la arquitectura de software más moderna, siendo compatible con los compiladores más recientes (Intel ifort, pero también incluyendo los compiladores de Sun / HP / IBM)
Así que estoy pensando en imponer cosas que son ampliamente conocidas como buen sentido común, pero que todavía no son un estándar en mi entorno:
- variable global prohibida, sin gotos, sin etiquetas de salto,
implicit none
, etc. - "programación orientada a objetos" (módulos con tipos de datos y subrutinas relacionadas)
- funciones modulares / reutilizables, bibliotecas bien documentadas y reutilizables
- aserciones / precondiciones / invariantes (implementadas usando declaraciones de preprocesador)
- pruebas unitarias para todas (la mayoría) subrutinas y "objetos"
- un "modo de depuración" intenso (
#ifdef DEBUG
) con más comprobaciones y todas las posibles comprobaciones de compilador de Intel posibles (límites de matriz, interfaces de subrutina, etc.) - estilo de codificación legible uniforme y forzado, utilizando ayudantes de herramienta de procesamiento de código.
El objetivo con todo eso es tener un código confiable, sostenible y modular. Mientras que, en muchos códigos heredados, la reutilización no era un objetivo importante.
Busqué referencias sobre Fortran orientado a objetos, programación por contrato (afirmaciones / precondiciones / etc.), y encontré solo documentos desagradables y obsoletos, sintaxis y documentos elaborados por personas sin implicación de proyectos a gran escala, y proyectos muertos .
¿Alguna buena URL, consejo, libro de referencia / libros sobre este tema?
Acabo de encontrar esta serie de dos partes sobre programación orientada a objetos con F2003. Montones de cosas geniales aquí:
Parte 1: http://www.pgroup.com/lit/articles/insider/v3n1a3.htm
Parte 2: http://www.pgroup.com/lit/articles/insider/v3n2a2.htm
Tiene grandes ejemplos y explica todo muy claramente.
En los últimos años, un compañero de trabajo y yo hemos desarrollado una gran biblioteca computacional desde cero en Fortran moderno con muchas de las características que menciona: orientación de objetos, modular / reutilizable, estilo de código consistente y más (no hemos hecho una gran trabajo con pruebas unitarias, sin embargo, necesita obtener eso), y luego envolver todo eso para proporcionar interfaces con C ++, Python y más. Otros aquí han señalado todos los libros y enlaces que recomendaría (y más), así que no los repetiré. Mi razón para publicar es solo para decir que realmente es posible hacer estas cosas con Fortran y crear algo grandioso, así que quédate con eso.
También señalaré cuán afortunado es usted de comenzar después de que gran parte del estándar Fortran 2003 haya sido implementado en todos los compiladores principales. Encontrará que muchas de estas características (punteros de procedimiento, por ejemplo) son muy útiles.
Fortran 90/95/2003 está diseñado para que uno pueda escribir código modular, si así lo desea, mediante la adición de módulos, privados / públicos, tipos definidos por el usuario, etc. Fortran 2003 introduce más características orientadas a objetos. No tiene sentido conectarse a C para agregar malloc cuando Fortran 90 tiene "asignación" para asignar directamente dinámicamente matrices Fortran de una manera más segura. Colocar sus procedimientos (funciones y subrutinas) en módulos y luego "usar" los módulos hará que se verifiquen las interfaces. Uno puede usar las muchas opciones de depuración / verificación de los compiladores, como la verificación de límites de subíndices.
Un libro excelente para aprender sobre estas y otras características: "Fortran 95/2003 Explained" por Metcalf, Reid y Cohen. Definitivamente es una buena idea aprender las mejores características del Fortran moderno en lugar de continuar escribiendo FORTRAN 77 - si es necesario, escriba estándares de codificación / guía.
Mis 5 centavos.
El Fortran Wiki es un buen punto de partida. Tiene artículos sobre diferentes aspectos de la programación usando Fortran moderno. Pruebas unitarias, depuraciones, programación genérica, etc. También hay disponible una table muy interesante sobre el Soporte del compilador para el estándar Fortran 2003. (Como Blklight ya mencionó, algunas características de 2003 no están disponibles en los compiladores. Es un buen lugar para comparar diferentes compiladores).
Soy un chico de C ++ pero estoy atascado con algunos proyectos de F90.
Recomiendo leer este curso: Introducción a Modern Fortran . MSB mencionó el famoso "Fortran 95/2003 Explained", pero este libro es lo suficientemente grande y lleno de detalles. El curso mencionado anteriormente, por el contrario es un buen lugar para comenzar. También eche un vistazo a un curso interactivo de programación Fortran 90 de la Universidad de Liverpool.
Errores en Fortran 90 Programas que podrían sorprenderte . El título de esta página habla por sí mismo. =)
Hmmm ... También tengo en mis marcadores un enlace a la SERIE DE CONFERENCIAS DE INVESTIGACIÓN DE PSTI "COMPUTACIÓN CIENTÍFICA CON FORTRAN 95" . Darle una oportunidad.
JF Sebastian mencionó a F2Py y dio el consejo de enseñar Python. Suscribo a su opinión Python no es mi idioma favorito. Pero es lo suficientemente útil para enseñarlo. Además de los preprocesadores ya mencionados (muchos de los cuales están escritos en Python) y F2Py no dejan pasar SCons , la herramienta de construcción de software moderna.
PD: La semana pasada compré un libro electrónico en lulu.com. Desarrollo de software científico en Fortran por Drew McCormack. Espero que sea una buena lectura, pero de repente no tengo tiempo. El autor es el desarrollador de Forpedo (uno de los preprocesadores específicos de Fortran mencionados en Fortran Wiki) y autor de muchos libros y tutoriales sobre programación de Objective-C y Python.
Si desea ver un gran programa Fortran en OO, vaya a www.mohid.com. Es GPL. Estoy de acuerdo en que escribir Fortran OO moderno ya no es suficiente, es obligatorio incorporar conceptos de Programación Funcional. Estoy investigando esto y creo que la principal característica que falta son las funciones lambda (anónimas). Por otro lado, creo que para hacer la paralelización es mejor ir a la ruta MPI, en lugar de OpenMP.
Sugiero que OP abandone la actitud de que Fortran es algo desagradable para ser soportado en computación científica de alto rendimiento y se sumerge en él con entusiasmo. Si OP conserva esa actitud bastante desdeñosa, toda su carrera de codificación Fortran va a ser una lucha. Y realmente, no hay nada que puedas hacer con Fortran que no puedas hacer con C ++, ¿por qué molestarse si realmente no quieres?
No hay nada en la lista de balas de OP que muchos de nosotros que hemos estado trabajando con Fortran durante los últimos 30 años no hemos estado haciendo (desde la disponibilidad generalizada de los compiladores de Fortran 90 pero también algo de eso antes). Sí, hay científicos computacionales e ingenieros de software científicos que entienden los indicadores, saben que muchas personas (equivocadas) comienzan a contar a 0 y que las variables globales son UNA COSA MALA.
Al igual que @MSB, recomendaría el libro de Metcalf y otros como fuente de información sobre las capacidades y características del moderno Fortran. Y, al igual que @MSB, levanto una ceja ante la idea de usar C o C ++ para envolver bibliotecas para las cuales existen equivalentes de Fortran o mejores enfoques por completo. La interoperabilidad del estándar 2003 con las características C, que se implementan en Intel Fortran, hace que sea más fácil que nunca llamar directamente a las bibliotecas C.
Discutiría con OP que tener un código modular es un objetivo en sí mismo. Los objetivos son, sugiero, un código correcto, verificable y validable, robusto y confiable. La modularidad es una forma de apoyar el logro de esos objetivos, pero es una táctica, no un punto final. Si pensase que podríamos escribir buenos (en los sentidos anteriores) programas que comprenden 10 ^ 6 líneas de código sin modularidad, no me molestaría con la modularidad.
OK, ahora algunos consejos concretos para agregar a lo que OP ya tiene la intención de hacer o le han dicho:
- utilice KIND en declaraciones de variables para aplicar la precisión que necesita; no deje esto en las opciones del compilador ni adivine qué podría hacer este compilador en ese procesador;
- utilice operaciones de matriz siempre que sea posible en lugar de bucles explícitos; esto ayuda a que el código sea más seguro, a veces a expensas del rendimiento, pero debe verificarlo caso por caso;
- escribir funciones PURAS;
- no dependa de preprocesadores u otros enfoques no Fortran para corregir el código (etc.), escriba sus afirmaciones y precondiciones (etc.) en Fortran; los preprocesadores (etc.) no sobrevivirán en la medida en que estén bien redactados los programas Fortran y serán una gran barrera para la portabilidad ahora y en el futuro;
- si tiene acceso a Intel Fortran, obtenga acceso a Intel MKL (e IPP) y use esas bibliotecas en lugar de escribir su propio código;
- plan para hacer frente a OpenMP y MPI para la paralelización, ambos se adaptan muy bien a Fortran; oh, y planeas ir en paralelo lo antes posible, es mucho más divertido que la programación en serie;
- este conjunto de Estándares de codificación Fortran es un buen comienzo, pero probablemente no más que eso; la 1ª edición de Code Complete tenía mucho más sobre la programación de Fortran (77) que la edición actual, pero la mayoría de sus consejos se pueden aplicar en cualquier idioma que escriba.
Y, finalmente, estos días pienso que los programas y programadores de Fortran están mejor informados por las ideas de la programación funcional que las ideas de la programación orientada a objetos.
Tengo mucha prisa, así que perdónenme si hago esta respuesta en forma de puntos de control en lugar de oraciones razonables.
- intente cumplir con el estándar (Fortran es un lenguaje estandarizado, y al adherirse a las características del lenguaje estándar, y evitar las extensiones específicas del proveedor, tendrá un programa portátil entre plataformas, para lo cual puede estar seguro de que el compilador no le dará problemas). No sé dónde descargué mi copia, pero estoy bastante seguro de que puede descargar el último borrador (tenga cuidado, muchas características de Fortran 2008 o 2003 para ese asunto todavía no se implementan en el compilador actual, aunque muchas están casi allí hoy en día ... Cray siendo uno) de la página de J3
- para todas las preguntas con respecto a lo anterior, recomiendo encarecidamente el grupo comp.lang.fortran usenet - no solo tiene gente muy bien informada allí (por ejemplo, el Sr. Richard Maine ... probablemente esté dispuesto a responder cualquier pregunta estándar de cumplimiento que puede preguntar, con mucho detalle, si se le pregunta amablemente ... lo mismo vale para muchos otros) pero también tiene personas que han trabajado en problemas a gran escala y que saben y estarán dispuestos a dar consejos sobre su tema
- libros: además de todo lo ya mencionado (el libro de Metcalf, Reid y Cohen también tiene mi recomendación, también el "Manual Fortran 2003" de Maine y otros ...), intente encontrar una copia de "Fortran 95" de Stephen J. Chapman. / 2003 para científicos e ingenieros " ... tiene un poco de confianza en algunos temas, pero aún así, en general es un libro muy bueno, con muchas" buenas prácticas de programación "mencionadas)
- Además, no sé si te has cruzado con este "Programación orientada a objetos a través de Fortran 90/95"
Algunos comentarios sobre tu texto:
(Esto puede parecer suposiciones de programación moderna "evidentes", pero en un mundo fortificado y heredado, la mayoría de estos son grandes cambios en el flujo de trabajo del programador típico)
Incluso en un mundo moderno, algunas de estas suposiciones son cuestionables ... recuerden, los programadores de Fortran no son programadores (estoy repitiendo esto en forma condensada, ya lo he escrito tantas veces en este foro) pero ingenieros, científicos y así. Para ellos (¿nosotros?) El código no es un objetivo, sino simplemente una herramienta ... para el código de programadores profesionales es todo; no tienen nada "más allá" ... por lo tanto, lo aprecian mucho. Para nosotros los ingenieros, es simplemente un medio de obtener el resultado que queremos ... teniendo esto en mente, aunque las buenas prácticas de programación paguen más adelante, no es necesario insistir en ellas cuando no hay una necesidad obvia de ellas.
El objetivo con todo eso es tener un código confiable, sostenible y modular. Mientras que, en fortran típico, la modularidad a menudo no es un objetivo principal, y el código es confiable solo si el desarrollador original fue muy inteligente, ¡y el código no se modificó desde entonces! (Estoy bromeando aquí, pero no mucho)
Alguien dijo una vez, y no creerías lo verdadero que es:
"No hay nada más permanente que una solución temporal".
¿Alguna buena URL, consejos, documentos de referencia / libros sobre el tema?
Dado varios arriba.
Además, al escribir esta respuesta, veo High Perf. Mark publicó una muy buena respuesta, con la que estoy de acuerdo en su mayoría ... va un poco más en detalle sobre la adhesión estándar.
Además, mi recomendación sería publicar definitivamente esta pregunta también en comp.lang.fortran ... supongo que se pueden obtener muchas más respuestas de calidad allí, luego aquí (creo que no hay más de 20 o más programadores de Fortran en todo del ).
Había un conjunto de pautas de redacción de códigos publicadas libremente por algún comité de la Unión Europea; Serían muy útiles como parte de esta respuesta, pero desafortunadamente, no puedo encontrarlos en mi búsqueda rápida en Google, y no tengo tiempo para mirar exhaustivamente. Intenta buscar sobre el tema ... tal vez tengas mejor suerte.