Fortran occupe une place particulière dans la programmation numérique. Vous pouvez certes créer de bons logiciels rapides dans d’autres langues, mais Fortran continue de très bien fonctionner malgré son âge. De plus, il est plus facile de créer des programmes rapides en Fortran. J'ai créé des programmes rapides en C ++, mais vous devez faire plus attention aux choses comme les alias de pointeur. Donc, il doit y avoir une raison à cela, et très technique. Est-ce parce que le compilateur peut optimiser davantage? J'aimerais vraiment connaître les détails techniques, donc si j'utilise un autre langage, je peux prendre ces choses en considération.
Par exemple, je sais, ou plutôt je pense, qu’une chose est que la norme spécifie que les pointeurs sont contigus en mémoire, ce qui signifie un accès plus rapide à la mémoire. Je pense que vous pouvez le faire en C ++ en donnant un drapeau au compilateur. De cette façon, il est utile de savoir ce que Fortran fait de bien, de sorte que si nous utilisons une autre langue, nous pouvons l'imiter.
la source
Réponses:
Les concepteurs de langues sont confrontés à de nombreux choix. Ken Kennedy a insisté sur deux points: (1) de meilleures abstractions et (2) un code de niveau supérieur ou inférieur (plus ou moins similaire à une machine). Alors que les langages fonctionnels tels que Haskell et Scheme se concentrent sur le premier, les langages informatiques scientifiques traditionnels tels que Fortran et C / C ++ se concentrent sur le second. Dire qu'une langue est plus rapide qu'une autre est généralement trompeur: chaque langue a un domaine problématique pour lequel elle excelle. Fortran se débrouille mieux dans le domaine des codes numériques basés sur des tableaux que d’autres langages pour deux raisons fondamentales: son modèle de tableau et son caractère explicite.
Modèle de tableau
Les programmeurs Fortran font en grande partie des manipulations de tableaux. Pour cela, Fortran facilite plusieurs optimisations du compilateur qui ne sont pas disponibles dans d'autres langues. Le meilleur exemple est la vectorisation: connaître la structure des données permet au compilateur d'invoquer des éléments intrinsèques au niveau de l'assemblage sur le tableau.
Explicit du langage
Bien qu’il semble qu’un langage simple devrait compiler «mieux» qu’un langage plus complexe, ce n’est vraiment pas le cas. Quand on écrit en langage assembleur , un compilateur ne peut pas faire grand chose: il ne voit que des instructions très fines. Fortran exige explicitement (donc plus de travail de la part du programmeur) que dans les cas qui rapportent de réels avantages à l’informatique par tableaux. Fortran utilise des types de données simples, un flux de contrôle de base et des espaces de noms limités. en revanche, il n’indique pas à l’ordinateur comment charger des registres (ce qui peut être nécessaire pour le temps réel ). Là où Fortran est explicite, cela permet des choses comme l’inférence de type complète, qui aide les novices à se lancer. Cela évite aussi une chose qui ralentit souvent le C:pointeurs opaques .
Fortran peut être lent
Fortran n’est pas rapide pour toutes les tâches: c’est pourquoi peu de gens l’utilisent pour construire des interfaces utilisateur graphiques ou même pour un calcul scientifique hautement non structuré. Une fois que vous quittez le monde des tableaux pour les graphiques, les arbres de décision et autres domaines, cet avantage de vitesse disparaît rapidement. Voir les points de repère du langage informatique pour des exemples et des chiffres.
la source
La conception de Fortran permet au compilateur d'effectuer des optimisations plus fortes dans certains cas, optimisations qui ne sont généralement pas disponibles pour C.
Un exemple célèbre est la gestion du crénelage . En Fortran, vous ne pouvez accéder à une zone de mémoire spécifique que par le symbole spécifique associé à cette zone de mémoire. Cette connaissance permet au compilateur d'utiliser des astuces intelligentes lorsqu'il est temps de mettre en cache: il sait si une valeur a potentiellement changé ou non. Jusqu'à F90, cela a été vérifié facilement. Lorsque Fortran 90 a été introduit
pointers
, l'hypothèse n'était plus vraie: vous pouviez accéder à la même zone mémoire via deux symboles (ou plus). C'est la raison pour laquelle vous devez spécifiertarget
les tableaux que vous souhaitez adresser via des pointeurs.Un autre fait intéressant est que de nombreuses constructions permettent au compilateur d’effectuer une parallélisation sans intervention de l’utilisateur. Un tel luxe est possible grâce au "principe agnostique de plate-forme" de Fortran en tant que langue.
Il y a beaucoup d'autres astuces subtiles comme celle-ci. De plus, rappelez-vous que personne n'utilise Fortran aujourd'hui, à l'exception des calculs numériques, ce qui signifie que la caractéristique principale et le point de vente des compilateurs Fortran est la vitesse de code résultante. En conséquence, les fournisseurs se sont concentrés sur cela.
Néanmoins, vous pouvez produire du code performant également avec d'autres langues. Il peut toutefois nécessiter des soins spéciaux ou une intervention humaine. Le point général, cependant, est que les performances ne sont pas un problème tant qu’il n’y en a pas et que le temps de travail coûte beaucoup plus cher que le temps passé sur un ordinateur. Les pratiques de codage doivent donc mettre l’accent sur le gain de temps humain plutôt que sur le temps passé sur un ordinateur.
la source
Je ne pense pas que Fortran soit si proche du métal (voir autre réponse), mais il a tendance à s'optimiser très facilement. Les boucles sont simples et le langage supporte facilement les extensions de vectorisation (bien, quand je l’utilisais dans mon premier emploi, nous visions une large gamme de gros fer vectoriels).
Il y a aussi le grand facteur d'inertie. Fortran contient une grande partie du code numérique. Par conséquent, les constructeurs de serveurs et de superordinateurs haut de gamme veillent à ce qu'ils écrivent correctement en optimisant les compilateurs Fortran. Les compilateurs sont bons (même sur des machines avec un manque relatif de compilateurs de haute qualité), de sorte que les utilisateurs continuent à utiliser le Fortran et même à y écrire du nouveau code. Les constructeurs veillent donc à ce que leur prochaine génération dispose de bons compilateurs, etc.
la source
Attention aux mythes urbains ici. Si deux compilateurs génèrent le même code d'assembly, les programmes résultants auront les mêmes performances.
Pour toute logique, il existe un programme en langage assembleur qui minimise son temps d'exécution. Ce programme ne se soucie pas du compilateur qui l’a généré.
Cela dit, les langages compilés existent pour faciliter la vie du programmeur. Une partie du coût est qu’ils peuvent inciter l’utilisateur à utiliser des fonctionnalités qui ne nécessitent pas un temps d’exécution minimal. Le principal exemple de ceci est
new
en C ++. (Combien de temps cela pourrait-il être lent - il ne s'agit que de trois caractères?) Il vous prie pratiquement d'allouer de la mémoire de manière dynamique et de ne pas prêter attention aux coûts d'exécution. Si c'est ce que vous voulez faire, c'est génial, mais Fortran pourrait être plus rapide simplement parce que cela ne vous a pas incité à le faire.Mais au - delà, je ne l' ai jamais vu un programme qui, comme le premier écrit, n'a pas eu grande place à l' amélioration de la performance du genre que le compilateur ne pourrait jamais nettoyer pour vous. Par exemple, passer une grande partie du temps à appeler
exp
et / ou àlog
répéter le même argument. Comme autre exemple, appeler DGEMM pour multiplier les matrices et découvrir qu'une fraction importante du temps est utilisé pour appeler LSAME simplement pour déchiffrer ses arguments de caractère en entrée.C'est en même temps que les gens disent que Fortran est plus rapide en raison de l'aliasing du pointeur ou du déroulement de la boucle. C'est comme dire qu'un bus fabriqué par Porsche serait certainement plus rapide qu'un bus fabriqué par Chevrolet. Il faut un peu de bon sens.
la source