web-dev-qa-db-fra.com

Ecrire du code fortrain robuste et "moderne"

Dans certains environnements scientifiques, vous ne pouvez souvent pas aller sans Fortran, car la plupart des développeurs ne savent que l'idiome, et il y a beaucoup de code hérité et d'expérience associée. Et franchement, il n'y a pas beaucoup d'autres options multi-plateformes pour Programmation haute performance (C++ ferait la tâche, mais la syntaxe, les tableaux de démarrage zéro, et les pointeurs ne sont pas compatibles avec certaines personnes).

Ainsi, supposons que un nouveau projet doit Utilisez Fortran 90, mais je souhaite construire l'architecture logicielle la plus moderne, tout en étant compatible avec le plus récent compilateurs (Intel Ifort, mais également comprenant les compilateurs Sun/HP/IBM)

Je pense donc à imposer des choses qui sont largement connues comme un bon sens commun, mais pas encore une norme dans mon environnement:

  • variable globale interdite, pas de gotos, pas d'étiquettes de saut, implicit none, etc.
  • "Programmation orientée objet" (modules avec dataTypes et sous-programmes associés)
  • fonctions modulaires/réutilisables, bien documentées, bibliothèques réutilisables
  • assertions/Conditions préalables/Invariants (mis en œuvre à l'aide de déclarations de préprocesseur)
  • tests unitaires pour tous les sous-programmes (la plupart) et "objets"
  • un "mode de débogage intense" (#ifdef DEBUG) Avec plus de vérifications et de tous les compilateurs Intel possibles possibles (limites de tableau, interfaces de sous-programme, etc.)
  • style de codage lisible uniforme et appliqué, utilisant des aides à outils de traitement de code.

Le but avec tout ce qui est d'avoir un code digne de confiance, maintenu et modulaire. ATTENDU QUE, dans de nombreux codes hérités, la réévaluation n'était pas une cible importante.

J'ai cherché des références sur le Fortran orienté objet, la programmation par contrat (assertions/conditions préalables/etc.), Et n'a trouvé que des documents laids et obsolètes, des syntaxes et des papiers effectués par des personnes sans implication de projet à grande échelle et des projets morts .

Toutes les bonnes URL, conseils, papier de référence/livres sur ce sujet?

64
Blklight

Mes 5 cents.

Le wiki Fortran est un bon point de départ. Il contient des articles sur différents aspects de la programmation à l'aide Fortran moderne. Test de l'unité, débogage, programmation générique, etc. Traitement très intéressant tablea sur prise en charge du compilateur pour la norme FORTRAN 2003 est disponible. (Comme Blklight déjà mentionné, certaines fonctionnalités de 2003 ne sont pas disponibles dans les compilateurs. C'est un bon endroit pour comparer différents compilateurs.)

Je suis un gars C++ mais je suis coincé avec des projets F90.

Je recommande de lire ce cours: Introduction à Modern Fortran . M. S. B. mentionné fameux " Fortran 95/2003 Explained ", mais ce livre est assez grand et plein de détails. Le cours mentionné ci-dessus au contraire est un bon endroit pour commencer. Jetez également un coup d'œil à n cours de programmation interactif de 90 9 de l'Université de Liverpool.

erreurs dans les programmes de Fortran 90 qui pourraient vous surprendre . Ce titre de page se dit sur lui-même. =)

Hmmm ... Je aussi ai dans mes favoris un lien vers PSTI RECHERCHE SÉRIE DE CONFÉRENCES " SCIENTIFIQUE AVEC COMPUTING FORTRAN 95 " . Essaie.

J.f. Sebastian a mentionné F2py et donner conseil à l'apprentissage de Python. Je m'abonne à son avis. Python n'est pas ma langue préférée. Mais il est suffisamment utile pour l'enseigner. En l'addition à déjà mentionné les préprocesseurs (dont beaucoup écrit en python) et F2py ne pas passer Scons - Outil de construction de logiciels moderne.

P.s. La semaine dernière, j'ai acheté un e-book à lulu.com. Développement de logiciels scientifiques en Fortran par Drew McCormack. J'espère que c'est une bonne lecture mais soudainement n'a pas de temps. L'auteur est le développeur de FORPEDO (un des préprocesseurs spécifiques à la Fortrane mentionnés dans Fortran Wiki) et auteur de nombreux livres et tutoriels sur Objective-C et Python programmation.

39
Wildcat

Je suggère que l'OP goutte à l'attitude que Fortran est quelque chose de méchant d'être enduré dans l'informatique scientifique et les plongées scientifiques hautes performances avec enthousiasme. Si OP conserve que l'état d'esprit plutôt reconditionnel, sa carrière de codage de Fortran est une lutte. Et vraiment, il n'y a rien que vous puissiez faire avec Fortran que vous ne pouvez pas faire avec C++ alors pourquoi déranger si vous ne voulez vraiment pas?

Il n'y a rien dans la liste des balles de l'OP que beaucoup d'entre nous qui travaillaient avec Fortran depuis 30 ans n'ont pas fait (depuis la disponibilité généralisée des compilateurs de Fortran 90, mais une partie de cela avant alors). Oui, il existe des scientifiques informatiques et des ingénieurs en logiciels scientifiques, qui comprennent les pointeurs, sachent que beaucoup de personnes (égarées) commencent à compter à 0 et que les variables mondiales sont une mauvaise chose.

Comme @MSB, je recommanderais METCALF et al 's livre comme une source d'informations sur les capacités et les caractéristiques de Modern Fortran. Et, comme @MSB, je soulevais un sourcil à l'idée d'utiliser C ou C++ pour envelopper des bibliothèques pour lesquelles il existe soit des équivalents de mandache, soit de meilleures approches. L'interopérabilité de la norme de 2003 avec des caractéristiques C, qui sont implémentées dans Intel Fortran, facilitent la tâche que jamais d'appeler des bibliothèques C directement.

Je prendrais un problème avec OP que le code modulaire est un objectif à part entière. Les objectifs sont, je suggère, correct, vérifiable et validable, du code robuste et fiable. La modularité est une façon de soutenir la réalisation de ces objectifs, mais c'est une tactique et non un point final. Si je pensais que nous pouvions écrire de bons programmes (dans les sens précédents), composé de 10 ^ 6 lignes de code sans modularité, je ne me soucierais pas de la modularité.

Ok, maintenant quelques conseils concrets pour ajouter à quel point l'opte a déjà l'intention de faire ou a été informé:

  • utilisez des types sur les déclarations variables pour appliquer la précision dont vous avez besoin; Ne laissez pas ceci aux options de compilateur ou devines de ce que ce compilateur pourrait faire sur ce processeur;
  • utiliser des opérations de tableau dans la mesure du possible plutôt que des boucles explicites; Cela aide à rendre le code plus sûr - parfois au détriment des performances, mais vous devez vérifier cela au cas par cas;
  • écrire des fonctions pures;
  • ne comptez pas sur les pré-processeurs ou d'autres approches non fortraines de la correction de code (etc.), écrivez vos assertions et conditions préalables (etc.) en Fortran; Les pré-processeurs (etc.) ne survivront pas aussi longtemps que les programmes de fortrange bien écrits et seront un obstacle majeur à la portabilité maintenant et à l'avenir;
  • si vous avez accès à Intel ForTran, accédez à Intel MKL (et à IPP) et utilisez ces bibliothèques plutôt que d'écrire votre propre code;
  • prévoyez de s'attaquer à OpenMP et MPI pour la parallélisation, ils conviennent très bien au Fortran; Oh, et prévoyez d'aller parallèlement dès que possible, c'est beaucoup plus amusant que la programmation en série;
  • cet ensemble de normes de codage de Fortran est un bon début, mais probablement pas plus que cela; La 1ère édition de Code complète En avait beaucoup plus sur la programmation de Fortran (77) que l'édition actuelle, mais la plupart de ses conseils peuvent être appliqués quelle que soit la langue inscrire.

Et enfin, ces jours-ci, je pense que les programmes et les programmeurs Fortrans sont mieux informés par des idées de la programmation fonctionnelle que des idées de la programmation orientée objet.

45

Fortran 90/95/2003 est conçu de sorte que l'on puisse écrire un code modulaire, si l'on veut, via l'ajout de modules, des types définis par l'utilisateur privé/public, etc. ForTran 2003 introduit des fonctionnalités orientées d'objet. Cela n'a aucun sens de se connecter à C pour ajouter MALLOC lorsque FORTRAN 90 a "allouer" à allouer directement de manière dynamique des tableaux de fortrane de manière plus sûre. Placer vos procédures (fonctions et sous-programmes) dans les modules, puis sur "Utilisation" Les modules feront vérifier les interfaces. On peut utiliser les nombreuses options de débogage/de vérification des compilateurs, telles que la vérification des bornes de l'indice.

Un excellent livre pour en savoir plus sur ces fonctionnalités et d'autres: "Fortran 95/2003 a expliqué" par Metcalf, Reid et Cohen. Il est certainement une bonne idée d'apprendre les meilleures caractéristiques du Fortran moderne plutôt que de continuer à écrire Fortran 77 - si nécessaire, d'écriture de normes de codage/guide.

13
M. S. B.

Au cours des dernières années, un collègue et j'ai développé une bibliothèque de calcul assez importante à partir de zéro entran moderne avec de nombreuses fonctionnalités que vous mentionnez - Orientation de l'objet, modulaire/réutilisable, style de code cohérent et plus (nous n'avons pas fait de super Job avec des tests unitaires, mais doit-il y arriver), puis enveloppez tout cela pour fournir des interfaces avec C++, Python et plus encore. D'autres ici ont indiqué que tous les livres et liens que je recommanderais (et plus), donc je ne les répète pas. Ma raison de poster est juste de dire que cela est vraiment possible de faire ces choses avec Fortran et de créer quelque chose de grand, alors soyez-vous.

Je vais également souligner à quel point vous devez commencer une chance après une grande partie de la norme Fortran 2003 a été mise en œuvre dans tous les compilateurs principaux. Vous trouverez beaucoup de ces fonctionnalités (les pointeurs de procédure par exemple) seront très utiles.

6
Barron

Je suis assez pressé, alors pardonnez-moi si je fais cette réponse sous forme de points de contrôle au lieu de phrases raisonnables.

  • essayez d'adhérer à la norme (Fortran est une langue standardisée et en adhérant aux fonctionnalités de langue standard et en évitant les extensions spécifiques au fournisseur, vous aurez un portable. Entre le programme Platforms, pour lequel vous pouvez être sûr que le compilateur ne posera aucun problème). Je ne sais pas où j'ai téléchargé ma copie, mais je suis sûr que vous pouvez télécharger le dernier brouillon (méfiez-vous; de nombreuses fonctionnalités de Fortran 2008 ou 2003 sont toujours activées dans le compilateur CODRECT, bien que beaucoup soient Presque là-bas De nos jours ... Cray en être un) de page de J
  • pour toutes les questions concernant ce qui précède, je vous recommande chaleureusement Comp.lang.fortran GROUPE USENET - Non seulement il a des personnes très compétentes là-bas (par exemple. M. RICHARD Maine ... sera probablement disposé à répondre à toutes les questions de conformité standard que vous pouvez poser, avec beaucoup de détails, si vous demandez bien ... pars pour beaucoup d'autres) mais il a aussi des personnes qui ont des problèmes de grande échelle et savoir certanément et soyez prêt à donner des conseils sur votre sujet
  • livres - En plus de tous les membres déjà mentionnés (Book de Metcalf, Reid et Cohen a également ma recommandation, également "Manuel de Fortran 2003" de Maine et d'autres ...), essayez de vous retrouver une copie de Stephen J. Chapman's "Fortran 95/2003 pour scientifiques et ingénieurs" ... Prend un peu trop confiant sur certains sujets, mais toujours, dans l'ensemble, un très bon livre, avec de nombreuses "bonnes pratiques de programmation" mentionnées)
  • en outre, je ne sais pas si vous êtes entré sur celui-ci "Programmation orientée objet via Fortran 90/95"

Quelques commentaires sur votre texte:

(Ceci peut tous sembler des hypothèses de programmation modernes "évidentes", mais dans un monde de la Héritage pour le fortrange, la plupart d'entre eux sont de gros changements dans le flux de travail de programmeur typique)

Même dans un monde fortrain moderne, certaines de ces hypothèses sont discutables ... N'oubliez pas que les programmeurs de Fortran ne sont pas des programmeurs (je le répète sous forme condensée; j'ai déjà écrit cela sur ce forum tant) mais des ingénieurs, des scientifiques etc. Pour eux (US?) Le code n'est pas un objectif, mais simplement un outil ... au code des programmeurs professionnels est tout; Ils n'ont rien "au-delà" ... Par conséquent, ils le chérissent tellement. Pour les ingénieurs américains, il est simplement un moyen d'obtenir le résultat que nous voulons ... avec cela à l'esprit, bien que de bonnes pratiques de programmation payent plus tard, ne pas l'insister sur eux où il n'y a pas de besoin évident pour eux.

Le but avec tout ce qui est d'avoir un code digne de confiance, maintenu et modulaire. ATTENDU QUE, dans la modularité typique, la modularité n'est souvent pas un objectif principal et que le code est digne de confiance que si le développeur original était très intelligent et que le code n'a pas été changé depuis! (Je suis un peu plaisant ici, mais pas beaucoup)

Quelqu'un a dit une fois, et vous ne croyez pas à quel point c'est vrai:
[.____] "Il n'y a rien de plus permanent qu'un correctif temporaire".

Toute bonne URL, conseils, papier de référence/livres sur le sujet?

Donné plusieurs ci-dessus.

En outre, en écrivant cette réponse, je vois haute perf. Mark a posté une très belle réponse, avec laquelle je suis surtout d'accord ... cela va un peu plus en détail à propos de l'adhérence standard.

En outre, ma recommandation serait de publier définitivement cette question également sur Comp.lang.fortran ... Je rassemble, vous pouvez obtenir beaucoup plus de réponses de qualité là-bas, puis ici (je crois qu'il n'y a pas plus de 20 programmeurs Fortrans sur ensemble de Stackoverflow).

Il y avait un ensemble de directives écrivantes de code publiées librement par un comité de l'Union européenne; Ils seraient très utiles dans le cadre de cette réponse, mais malheureux, je ne peux pas les trouver dans ma recherche de Google rapide et je n'ai pas le temps de regarder de manière approfondie. Essayez de la recherche ... Peut-être que tu auras mieux chanceux.

4
Rook

Je viens de trouver cette série en deux parties sur la programmation orientée objet avec F2003. Beaucoup de choses intéressantes ici:

Partie 1: http://www.pgroup.com/lit/articles/Insider/v3n1a3.htm

Partie 2: http://www.pgroup.com/lit/articles/Insider/v3n2a2.htm

Il a de grands exemples et explique tout très clairement.

3
Brenton Huggins

Si vous souhaitez regarder un grand programme Fortran in OO Go sur www.mohid.com. C'est GPL. Je suis d'accord que d'écrire Fortran moderne OO= n'est plus suffisant, il est obligatoire d'incorporer des concepts de programmation fonctionnelle. Je fais des recherches à ce sujet et je pense que la principale caractéristique manquante est la fonction Lambda (anonyme). De l'autre côté, je pense que faire la parallélisation, il vaut mieux aller le MPI route plutôt que OpenMP.

1
Ricardo Miranda