Escribir código Fortran robusto y "moderno"


En algunos entornos científicos, a menudo no se puede prescindir de FORTRAN, ya que la mayoría de los desarrolladores solo conocen ese lenguaje, y hay mucho código heredado y experiencia relacionada. Y francamente, no hay muchas otras opciones multiplataforma para programación de alto rendimiento (C++ haría la tarea, pero la sintaxis, los arrays de arranque cero y los punteros no son compatibles con algunas personas).

Entonces, asumamos que un nuevo proyecto debe usar Fortran 90, pero quiero construir el la arquitectura de software más moderna fuera de ella, mientras que es compatible con los compiladores más recientes (Intel ifort, pero también incluye los compiladores Sun/HP/IBM)

Así que estoy pensando en imponer cosas que son ampliamente conocidas como sentido común, pero que aún 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 preprocesadoras)
  • pruebas unitarias para todas (la mayoría) subrutinas y "objetos"
  • un intenso "modo de depuración" (#ifdef DEBUG) con más comprobaciones y todas las comprobaciones posibles del compilador Intel posibles (límites de matriz, interfaces de subrutina, etc.)
  • estilo de codificación legible uniforme y obligatorio, utilizando ayudantes de herramientas de procesamiento de código.

La meta con todo lo que es tener código confiable, mantenible 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 (aserciones/precondiciones/etc.), y solo encontró documentos feos y obsoletos, sintaxis y papeles hechos por personas sin participación en proyectos a gran escala, y proyectos muertos.

¿Alguna buena URL, consejo,documento de referencia / libros sobre este tema?

Author: Chris, 2010-05-03

7 answers

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, depuración, programación genérica, etc. También es muy interesante la tabla sobre el Soporte del compilador para el estándar Fortran 2003 está disponible. (Como Blklight ya mencionó algunas características de 2003 no están disponibles en compiladores. Es un buen lugar para comparar diferentes compiladores.)

Soy un chico de C++ pero estoy atascado con algunos proyectos F90.

Recomiendo leer este curso: Introducción a Fortran Moderno. M. S. B. mencionó famoso "Fortran 95/2003 Explicó" 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 los Programas de Fortran 90 Que Podrían Sorprenderte. El título de esta página habla por sí mismo. =)

Hmmm... También tengo en mis marcadores algún enlace a SERIE DE CONFERENCIAS DE INVESTIGACIÓN PSTI "COMPUTACIÓN CIENTÍFICA CON FORTRAN 95". Inténtalo.

J. F. Sebastian mencionó F2Py y dio el consejo para enseñar Python. Suscribo 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 escritos en Python) y F2Py no dejan pasar SCons - construcción de software moderno herramienta.

P.d. La semana pasada compré un e-book en lulu.com. Desarrollo científico de Software 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 Objective-C y Python.

 38
Author: Wildcat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-03 16:49:11

Sugiero que OP abandona la actitud de que Fortran es algo desagradable que se debe soportar en la computación científica de alto rendimiento y se sumerge en ella con entusiasmo. Si OP conserva esa mentalidad más bien despectiva, entonces toda su carrera de codificación Fortran será una lucha. Y realmente, no hay nada que puedas hacer con Fortran que no puedas hacer con C++ así que ¿por qué molestarte 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 lo he estado haciendo (desde la disponibilidad generalizada de los compiladores Fortran 90, pero algunos de ellos antes también). Sí, hay científicos computacionales e ingenieros de software científicos, que entienden los punteros, saben que mucha gente (equivocada) comienza a contar en 0 y que las variables globales son ALGO MALO.

Me gusta @MSB Recomendaría el libro de Metcalf et al como una fuente de información sobre las capacidades y características de Fortran moderno. Y, como @MSB, levanto una ceja ante la idea de usar C o C++ para envolver bibliotecas para las que hay equivalentes de Fortran o enfoques mejores por completo. La interoperabilidad del estándar de 2003 con las características de C, que se implementan en Intel Fortran, hace que sea más fácil que nunca llamar directamente a las bibliotecas de C.

Estaría en desacuerdo con OP que tener código modular es un objetivo en sí mismo. Los objetivos son, sugiero, código correcto, verificable y validable, robusto y confiable. Modularidad es una forma de apoyar el logro de esos objetivos, pero es una táctica, no un punto final. Si pensara 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 se le ha dicho:

  • use tipos en declaraciones de variables para imponer la precisión que necesita; no deje esto a las opciones del compilador o a las conjeturas sobre qué este compilador podría hacer en ese procesador;
  • use operaciones de matriz siempre que sea posible en lugar de bucles explícitos; esto ayuda a hacer que el código sea más seguro sometimes a veces a expensas del rendimiento, pero debe verificarlo caso por caso;
  • escribir funciones PURAS;
  • no dependa de pre-procesadores u otros enfoques no Fortran para la corrección del código (etc), escriba sus aserciones y precondiciones (etc) en Fortran; los pre-procesadores (etc) no sobrevivirán mientras programas Fortran bien escritos y será una barrera importante 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;
  • planea abordar OpenMP y MPI para la paralelización, ambos encajan muy bien con Fortran; oh, y planea ir en paralelo lo antes posible, es mucho más divertido que la programación en serie;
  • este conjunto de Normas de codificación Fortran es una buena comience, pero probablemente no más que eso; la 1a 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 en el que escriba.

Y, finalmente, en estos días creo que los programas y programadores de Fortran están mejor informados por ideas de programación funcional que por ideas de programación orientada a objetos.

 45
Author: High Performance Mark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-03 16:47:38

Fortran 90/95/2003 está diseñado para que uno pueda escribir código modular, si lo desea, a través de la adición de módulos, privado/público, tipos definidos por el usuario, etc. Fortran 2003 introduce otras características orientadas a objetos. No tiene sentido conectarse a C para agregar malloc cuando Fortran 90 tiene "allocate" 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 las interfaces se comprueben. Uno puede usar las muchas opciones de depuración / comprobación de los compiladores, como la comprobación de límites de subíndice.

Un libro excelente para aprender sobre estas y otras características: "Fortran 95/2003 Explained" de Metcalf, Reid y Cohen. Definitivamente es una buena idea aprender las mejores características de Fortran moderno en lugar de continuar escribiendo FORTRAN 77 if si es necesario, escriba normas de codificación / guía.

 13
Author: M. S. B.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-03 14:49:42

En los últimos años, un compañero de trabajo y yo hemos desarrollado una biblioteca computacional bastante grande desde cero en Fortran moderno con muchas de las características que mencionas: orientación a objetos, estilo de código modular/reutilizable, consistente y más (sin embargo, no hemos hecho un gran trabajo con las pruebas unitarias, necesitamos hacerlo), y luego empaquetar 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 repetiré ellos. Mi razón para publicar es solo para decir que realmente es posible hacer estas cosas con Fortran y crear algo grande, así que quédate con él.

También señalaré lo afortunado que es de estar comenzando después de que gran parte del estándar Fortran 2003 se haya implementado en todos los compiladores principales. Encontrará que muchas de estas características (punteros de procedimiento, por ejemplo) son muy útiles.

 6
Author: Barron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-19 01:33:55

Tengo bastante prisa, así que perdóname si estoy haciendo esta respuesta en forma de puntos de control en lugar de frases razonables.

  • intente adherirse al 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 portable entre plataformas, para el cual puede estar seguro de que el compilador no dará problemas). No se donde descargué mi copia, pero estoy bastante seguro de que puedes descargue el último borrador (tenga cuidado; muchas características de fortran 2008 o 2003 aún no están implementadas en el compilador currect, aunque muchas están casi allí hoy en día ... Cray siendo uno) de página de J3
  • para todas las preguntas relacionadas con lo anterior, recomiendo encarecidamente comp.lang.fortran usenet group - no solo tiene algunas personas muy bien informadas allí (por ejemplo. sr. Richard Maine ... probablemente estará dispuesto a responder a cualquier estándar preguntas de cumplimiento que usted puede hacer, con mucho detalle, si se le pide amablemente ... lo mismo ocurre con muchos otros), pero también tiene personas que han trabajado en problemas a gran escala y seguramente sabrán y estarán dispuestos a dar consejos sobre su tema
  • libros - además de todo lo ya mencionado (Metcalf, Reid y el libro de Cohen también tiene mi recomendación, también "Fortran 2003 handbook" por Maine y otros ...), trate de encontrar una copia de Stephen J. Chapman "Fortran 95/2003 para científicos e ingenieros " ... toma una posición demasiado confiada en algunos temas, pero aún así, en general, un libro muy agradable, con muchas "buenas prácticas de programación" mencionadas)
  • además, no sé si has llegado a través de este "Programación orientada a objetos a través de Fortran 90/95"

Algunos comentarios sobre su texto:

( Todo esto puede parecer" evidente " supuestos de programación moderna, pero en un mundo fortran legado, la mayoría de estos son grandes cambios en el flujo de trabajo típico del programador )

Incluso en un mundo fortran moderno, algunas de estas suposiciones son cuestionables ... recuerde, los programadores de fortran no son programadores (estoy repitiendo esto en forma condensada; ya he escrito esto en este foro tantas veces) sino ingenieros, científicos y así sucesivamente. A ellos (nosotros?) el código no es un objetivo, sino simplemente una herramienta ... para los programadores profesionales el código es todo; no tienen nada "más allá"... por lo tanto, lo aprecian mucho. A nosotros ingenieros, es simplemente un medio para obtener el resultado que queremos ... con esto en mente, aunque las buenas prácticas de programación pagan más tarde, no es necesario insistir en ellos donde no hay necesidad obvia de ellos.

El objetivo con todo eso es tener un código confiable, mantenible 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 cambió desde entonces ! (estoy un poco bromeando aquí, pero no mucho)

Alguien dijo una vez, y no creerías lo cierto que es:{[40]]} "No hay nada más permanente que una solución temporal".

¿Algún buen URL, consejo,documento de referencia / libros sobre el tema?

Dados varios anteriores.

También, mientras escribo esta respuesta, veo un Alto Perf. Mark publicó una respuesta muy agradable, con la que estoy mayormente de acuerdo ... entra un poco más en detalle sobre la adhesión estándar.

También, mi recomendación sería definitivamente publicar esta pregunta también en comp.lang.fortran ... Deduzco que puede obtener respuestas de mucha más calidad allí, luego aquí (creo que no hay más de 20 o más programadores de fortran en todo stackoverflow).

Hubo un conjunto de directrices de escritura de código publicadas libremente por algún comité de la Unión europea; serían muy útiles como parte de esta respuesta, pero desafortunadamente, no puedo encontrarlas en mi búsqueda rápida en Google, y no tengo el tiempo para buscarlas extensamente. Intenta buscar sobre el tema ... tal vez tengas mejor suerte.

 4
Author: Rook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-03 16:59:46

Acabo de encontrar esta serie de dos partes sobre programación orientada a objetos con F2003. Un montón de grandes cosas 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.

 3
Author: Brenton Huggins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-18 20:35:53

Si desea ver un programa Fortran grande 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 sobre esto y creo que la principal característica que falta son las funciones lambda (anónimas). Por otro lado creo que para hacer paralelización es mejor ir por la ruta MPI, en lugar de OpenMP.

 1
Author: Ricardo Miranda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-11 12:39:34