L'apprentissage FORTRAN Dans l'Ère Moderne
J'ai récemment maintenir une grande quantité de calcul scientifique intensif code FORTRAN. Je vais avoir des difficultés à obtenir une poignée sur tous les de la, dire, de nuances, de quarante ans de langue, en dépit de google & deux niveau d'introduction des livres. Le code est en proie à "l'amélioration de la performance des améliorations". Quelqu'un aurait-il des guides ou des conseils pratiques pour de-optimisation de FORTRAN dans CS 101 niveaux? Quelqu'un aurait-il connaissance de la façon dont FORTRAN optimisation de code opérés? Y a-typique FORTRAN 'pièges' qui pourrait ne pas se produire à un Java/C++/.NET soulevées développeur de la prise de FORTRAN 77/90 base de code?
- Serait-ce texte peut-être intéressant pour vous? fortranrefactoring.com.ar/documents/...
- J'ai apprécié l'écoute de vous sur le dinosaure TDL podcast, surtout avec cette question pour le contexte 🙂 Remarque, le podcast ne parle pas de cela, je viens de me rappeler de le voir après l'écoute.
- Le lien ci-dessus est mort, le document est maintenant ici: fortranrefactoring.org/papers/...
Vous devez vous connecter pour publier un commentaire.
Que vous avez pour obtenir une "sensation" pour ce que les programmeurs ont dû faire retour dans la journée. La grande majorité du code, je travaille avec est plus âgé que moi et a couru sur des machines qui étaient "nouveaux" quand mes parents étaient au lycée.
Commune FORTRAN-ismes, j'ai traiter avec, qui nuisent à la lisibilité sont:
Des stratégies pour la résolution de ces impliquent:
Convertir tous FAIRE des boucles à la nouvelle F90 syntaxe
Convertir equivalenced commune bloc membres AFFECTABLES la mémoire allouée dans un module, ou de leur véritable caractère routines si c'est Hollerith être stockés dans un VÉRITABLE
Si vous avait des questions plus précises quant à la façon d'accomplir une partie de la lisibilité des tâches, je peux donner des conseils. J'ai un code de base de quelques centaines de milliers de lignes de Fortran qui a été écrit sur une période de 40 ans que je suis en quelque sorte responsable, donc j'ai probablement courir à travers toutes les "problèmes" que vous pourriez avoir trouvé.
Héritage Fortran Soapbox
J'ai aidé à maintenir/améliorer un héritage code Fortran de base pour un bon moment et pour la plupart pense que sixlettervariables est sur l'argent. Des conseils que si, tend à la technique; un durcissement de la ligne à la houe est dans la mise en œuvre de "bonnes pratiques".
Ces peut sembler évident choses ces jours-ci, mais au risque de généraliser, j'affirme que la plupart des code Fortran magasins ont une culture bien ancrée, certains ont commencé avant que le terme "génie logiciel" existait, et qu'au fil du temps ce qui vient de dominer est "le faire maintenant". (Ce n'est pas unique à Fortran magasins par tous les moyens.)
Embrassant Pièges
Mais que faire avec une déjà existante, grotty vieil héritage de la base de code? Je suis d'accord avec Joel Spolsky sur la réécriture, ne pas. Cependant, à mon avis sixlettervariables ne point autorisés exception: Utilisation des outils logiciels permettant la transition vers une meilleure Fortran constructions. Beaucoup de choses peuvent être pris/corrigés par des analyseurs de code (FORCHECK) et le code graveurs (plusFORT). Si vous devez le faire à la main, assurez-vous que vous avez une raison impérieuse. (Je souhaite que j'avais sous la main une référence pour le nombre de bugs logiciels qui sont venus de la correction de bugs, c'est une leçon d'humilité. Je pense que certains de ces statistiques est en Expert De La Programmation En C.)
Probablement la meilleure attaque en train de gagner le jeu de Fortran pièges est d'avoir la meilleure défense: la connaissance de la langue assez bien. À cette fin, je recommande ... des livres!
Fortran Arbre Mort Bibliothèque
Je n'ai eu qu'un succès modeste comme un "QA harceler" au fil des ans, mais j'ai trouvé que l'éducation n'travail, quelques fois, par inadvertance, et que l'un des plus influents des choses est un livre de référence que quelqu'un a sous la main. J'aime et je recommande fortement
Fortran 90/95 pour les Scientifiques et les Ingénieurs, par Stephen J. Chapman
Le livre est également bon avec Fortran 77 en ce qu'il identifie précisément les constructions qui ne devrait pas être utilisé et donne la meilleure des alternatives. Cependant, il est en fait un manuel et peut fonctionner en dehors de la vapeur lorsque vous voulez vraiment connaître les détails de Fortran 95, c'est pourquoi je recommande
Fortran 90/95 Expliqué, par Michael Metcalf & John K. Reid
que votre go-to de référence (sic) pour Fortran 95. Attention, il n'est pas le plus lucide de l'écriture, mais le voile se lever quand vous voulez vraiment obtenir les la plupart hors d'une nouvelle Fortran 95 fonctionnalité.
Pour se concentrer sur les questions des cours de Fortran 77 pour Fortran 90, j'ai apprécié
La migration vers le Fortran 90, par Jim Kerrigan
mais le livre est maintenant épuisé. (Je ne comprends pas O'Reilly utilisation de Safari, pourquoi n'est-elle pas chacun de leurs livres imprimés disponibles?)
Enfin, comme à l'héritier du merveilleux, merveilleux classique, Des Outils Logiciels, je proposer
Classique FORTRAN, par Michael Kupferschmid
Ce livre ne montre pas seulement ce que l'on peut faire avec "seulement" Fortran 77, mais il parle aussi de certains des plus subtiles questions qui se posent (par exemple, devraient ou ne devraient pas utiliser la déclaration EXTERNE). Ce livre n'est pas exactement couvrir le même espace que les "Outils Logiciels", mais ils sont deux des trois programmation Fortran livres que je balise comme "fun".... (voici la troisième).
Divers Conseils qui s'applique à presque chaque compilateur Fortran
Il y a quelque chose dans la question d'origine que j'aurais de la prudence. Vous dites que le code est en proie à "l'amélioration de la performance des améliorations". Depuis le Fortran problèmes sont généralement d'un scientifique et mathématique de la nature, de ne pas assumer ces astuces sont là pour améliorer la compilation. Ce n'est probablement pas à propos de la langue. En Fortran, la solution est rarement au sujet de l'efficacité du code lui-même, mais les mathématiques sous-jacentes à résoudre le problème. Les options peuvent faire la compilation plus lent, peut même faire de la logique apparaissent en désordre, mais l'intention est de rendre la solution plus rapidement. Sauf si vous savez exactement ce qu'il fait et pourquoi, le laisser seul.
Même simple, comme le changement du muet à la recherche de noms de variables peuvent être un gros piège. Historiquement standard des équations mathématiques dans un domaine donné de la science ont utilisé un abrégée depuis les jours de Maxwell. Donc, pour voir un tableau nommé B(:) dans l'électromagnétisme indique tous les Emag ingénieurs exactement ce qui est en train d'être résolu. Changement à vos risques et périls. Morale, apprendre à connaître la norme de la nomenclature de la science avant de le renommer trop.
Comme quelqu'un ayant de l'expérience dans les deux FORTRAN (77 saveur bien qu'il a été un moment depuis que je l'ai utilisé au sérieux) et C/C++ l'élément à surveiller qui saute immédiatement à l'esprit sont des tableaux. FORTRAN tableaux de commencer avec un indice de 1 au lieu de 0 comme ils le font en C/C++/Java. Aussi, la mémoire, l'arrangement est inversé. Donc incrémenter le premier indice vous donne séquentielle emplacements de mémoire.
Ma femme utilise encore FORTRAN régulièrement et a quelques de code C++, elle a besoin de travailler avec, maintenant que je suis sur le point de commencer à aider son avec. Que de questions lors de sa conversion, je vais essayer de vous les montrer. Peut-être qu'ils vont vous aider.
J'ai utilisé Fortran en commençant par l'66 version depuis 1967 (sur un IBM 7090 avec 32 k mots de mémoire). J'ai ensuite utilisé PL/1 pour un certain temps, mais revint plus tard à Fortran 95, car il est idéalement adapté pour la matrice/complexe-nombre des problèmes que nous avons. Je voudrais ajouter aux considérations qu'une grande partie de la structure alambiquée de vieux codes est tout simplement en raison de la faible quantité de mémoire disponible, forçant une telle chose comme la réutilisation de quelques lignes de code via calculées ou affectés
GOTO
s. Un autre problème est l'optimisation par la définition des variables auxiliaires pour chaque sous-expression répétée - les compilateurs n'ont tout simplement pas optimiser pour cela. En outre, il n'était pas autorisé à écrireDO i=1,n+1
; on devait écriren1=n+1
;DO i=1,n1
. En conséquence vieux codes sont débordés avec superflu des variables. Quand j'ai réécrit un code en Fortran 95, 10% seulement des variables survécu. Si vous voulez rendre le code plus lisible, je recommande fortement la recherche de variables qui peuvent facilement être éliminés.Une autre chose que je pourrais mentionner, c'est que pendant de nombreuses années complexe de l'arithmétique et de tableaux multidimensionnels ont été très inefficace. C'est pourquoi vous trouverez souvent des code réécrit pour effectuer des calculs complexes en utilisant uniquement des variables réelles, et les matrices traitées avec un seul linéaire de l'indice.
Bien, en un sens, vous avez de la chance, parce que le Fortran n'a pas beaucoup de la manière de flux subtil de contrôle des constructions ou à l'héritage ou la comme. De l'autre, il y a des choses vraiment incroyable de pièges, comme l'arithmétique calculée branche-de-numérique-étiquette de trucs, du implicitement-les variables de type qui ne nécessitent pas de déclaration, l'absence de véritables mots-clés.
Je ne sais pas à propos de la "amélioration de la performance des améliorations". Je l'avais devine que la plupart d'entre eux sont probablement inefficace, comme un couple de décennies de technologie de compilation ont fait plus allusion inutiles. Malheureusement, vous aurez probablement de laisser les choses comme elles sont, sauf si vous avez l'intention de faire un massif de réécriture.
De toute façon, la base de calcul scientifique de code devrait être assez lisible. Tout langage de programmation à l'aide de infix arithmétique serait une bonne préparation pour la lecture Fortran de l'arithmétique et de l'affectation de code.
Pourriez-vous expliquer ce que vous avez à faire dans le maintien du code? Avez-vous vraiment modifier le code? Si vous pouvez vous en sortir en modifiant juste l'interface de ce code, plutôt que le code lui-même, qui serait le meilleur.
Le problème inhérent lorsqu'ils traitent avec un grand scientifique de code (et pas seulement FORTRAN), c'est que les mathématiques sous-jacentes et la mise en œuvre sont à la fois complexes. Presque par défaut, la mise en œuvre a pour comprennent l'optimisation du code, afin de l'exécuter dans des délais raisonnables. Cette situation est aggravée par le fait que beaucoup de code dans ce champ est créé par les scientifiques, les ingénieurs qui sont des experts dans leur domaine, mais pas dans le développement de logiciels. Disons simplement que "facile à comprendre" n'est pas la première priorité pour eux (j'étais l'un d'entre eux, encore à apprendre à être un meilleur développeur de logiciels).
En raison de la nature du problème, je ne pense pas que d'une manière générale, la question et la réponse est assez pour être utile. Je vous suggère de poster une série de questions spécifiques extrait de code ci-joint. Peut-être en commençant par celui qui vous donne le plus de maux de tête?
J'ai adoré FORTRAN, j'ai l'habitude d'enseigner et de code. Voulais juste jeter que dans. N'ai pas touché depuis des années.
J'ai commencé le COBOL, quand j'ai déménagé à FORTRAN j'ai senti que je a été libéré. Tout est relatif, hein?
J'avais deuxième ce qui a été dit ci - dessus reconnaître que c'est un langage PROCÉDURAL - pas de subtelties - prenez donc comme vous le voyez.
Probablement vous frustrer pour commencer.
J'ai commencé sur le Fortran IV (WATFIV) sur des cartes perforées, et mes premières années de travail ont été VS FORTRAN v1 (IBM, Fortran 77 niveau). Beaucoup de bons conseils dans ce fil.
Je voudrais ajouter que vous avez à distinguer entre les choses faire pour amener la bête du tout, par rapport à des choses qui "optimiser" le code, par rapport à des choses qui sont à la fois plus lisible et maintenable. Je me souviens de traiter avec VAX superpositions en essayant d'obtenir DOE code de simulation pour fonctionner sur IBM avec de la mémoire virtuelle (ils devaient être supprimés et le tout tourné en un seul espace d'adressage).
Je doute de commencer par prendre soin de bien la restructuration FORTRAN IV structures de contrôle d'au moins FORTRAN 77 niveau, avec une bonne indentation et de la commenter. Essayer de se débarrasser de la primitive de structures de contrôle comme ASSIGN et CALCULÉE GOTO et à l'arithmétique, SI, et bien sûr, comme de nombreux GOTOs comme vous pouvez le (à l'aide de if-then-ELSE-ENDIF). Certainement utiliser IMPLICIT NONE dans chaque routine, à force de vous pour bien déclarer toutes les variables (vous ne croiriez pas combien de bugs que j'ai pris dans d'autres gens du code -- les fautes de frappe dans les noms de variables). Faites attention à la "prématuré optimisations" que vous êtes mieux de laisser le compilateur gérer par lui-même.
Si ce code est de continuer à vivre et être facile à entretenir, vous le devez à vous-même et vos ayants droit, pour le rendre lisible et compréhensible. Juste être certain de ce que vous faites comme vous le modifiez le code! FORTRAN a beaucoup de particulières les constructions qui peuvent facilement trébucher quelqu'un venant du côté C de le monde de la programmation. Rappelez-vous que le FORTRAN remonte à la mi-fin des années 50, quand il n'y a pas une telle chose comme une science de la langue et de la conception du compilateur, juste ad hoc piratage ensemble de quelque chose (désolé, le Dr B!).
En voici un autre qui a peu moi de temps en temps. Lorsque vous travaillez sur code FORTRAN assurez-vous de passer tous les six premiers colonnes. À chaque fois, je ne vais obtenir le code en retrait de cinq espaces et rien ne fonctionne. À première vue, tout semble ok et puis je me rend finalement compte que toutes les lignes commencent à la colonne 6 au lieu de la colonne 7.
Pour quiconque n'est pas familier avec FORTRAN, les 5 premières colonnes sont les numéros de ligne (=étiquettes), la 6e colonne est d'un caractère de continuation dans le cas où vous avez une ligne de plus de 80 caractères (juste mettre quelque chose ici, et le compilateur sait que cette ligne est en fait une partie de l'avant) et le code commence toujours dans la colonne 7.