Je ne sais pas à quoi ressemblera le langage de programmation en 2000, mais je sais qu’il s’appellera FORTRAN.
- Charles Anthony Richard Hoar, env. 1982
Dans l'industrie, le Fortran est rarement utilisé aujourd'hui - dans l'une des listes de langues populaires, il occupait la 28e place . Mais Fortran est toujours le langage principal pour les simulations à grande échelle de systèmes physiques - c'est-à-dire pour des choses comme la modélisation astrophysique des étoiles et des galaxies (par exemple Flash ), la dynamique moléculaire à grande échelle, les codes de comptage de structures électroniques ( SIESTA ), les modèles climatiques, etc. Dans le domaine du calcul haute performance, dont un sous-ensemble est constitué de simulations numériques à grande échelle, seuls deux langages sont aujourd'hui utilisés - C / C ++ et «modern Fortran» (Fortran 90/95/03/08). Bibliothèques MPI ouvertes populairesdes outils de parallélisation de code ont été développés pour ces deux langages. En général, si vous avez besoin d'un code rapide qui s'exécute sur plusieurs processeurs, vous n'avez que deux options. Dans le Fortran moderne, il existe une fonctionnalité telle que " coarray ", qui permet de travailler directement avec le langage dans une programmation parallèle. Coarray est apparu dans l'extension Fortran 95 et a ensuite été inclus dans Fortran 2008.L'utilisation active de Fortran par les physiciens confond souvent les informaticiens et d'autres personnes sans rapport avec ce domaine qui pensent que Fortran est un anachronisme historique.Je voudrais expliquer pourquoi Fortran est toujours utile. Je n'encourage pas les étudiants qui étudient la physique à enseigner le Fortran - puisque la plupart d'entre eux feront de la recherche, ils devraient étudier le C / C ++ (ou s'arrêter à Matlab / Octave / Python). Je voudrais expliquer pourquoi Fortran est toujours utilisé et prouver que ce n'est pas seulement parce que les physiciens sont «en retard» (bien que ce soit parfois le cas - l'année dernière, j'ai vu un étudiant en physique travailler avec du code Fortran 77, alors que ni lui ni son manager n'ont entendu parler de Fortran 90). Les informaticiens devraient considérer la domination de Fortran dans l'informatique numérique comme un défi.Avant de me plonger dans le sujet, je veux discuter de l'histoire, car lorsque les gens entendent le mot "Fortran", ils imaginent immédiatement des cartes perforées et du code avec des lignes numérotées. La première spécification Fortran a été écrite en 1954. Le premier Fortran (alors son nom était écrit en majuscules, FORTRAN) était, selon les normes modernes, une langue infernale, mais c'était un pas en avant incroyable par rapport à la programmation précédente des assembleurs. FORTRAN était souvent programmé avec des cartes perforées, comme le rappelle le professeur Miriam Forman de l'Université Stony Brook sans plaisir. Fortran avait de nombreuses versions, dont les plus célèbres sont les normes 66, 77, 90, 95, 03 et 08.On dit souvent que Fortran est toujours utilisé en raison de sa vitesse. Mais est-il le plus rapide? À benchmarksgame.alioth.debian.orgil y a une comparaison de C et Fortrandans plusieurs tests parmi de nombreuses langues. Dans la plupart des cas, Fortran et C / C ++ sont les plus rapides. Les programmeurs Python préférés sont souvent en retard de vitesse 100 fois, mais c'est dans l'ordre des choses pour le code interprété. Python ne convient pas aux calculs numériques complexes, mais convient bien à un autre. Fait intéressant, C / C ++ surpasse Fortran dans tous les tests sauf deux, bien qu'en général ils diffèrent peu dans les résultats. Les tests où Fortran gagne, les plus «physiques» sont la simulation d'un système de n corps et le calcul du spectre. Les résultats dépendent du nombre de cœurs de processeur, par exemple, Fortran est en retard sur C / C ++ sur le quad core. Les tests, dans lesquels Fortran est loin derrière C / C ++, lisent et écrivent des données la plupart du temps, et à cet égard, la lenteur de Fortran est connue.Le C / C ++ est donc aussi rapide que Fortran, et parfois un peu plus rapide. Nous sommes intéressés par "pourquoi les professeurs de physique continuent-ils à conseiller à leurs étudiants d'utiliser Fortran au lieu de C / C ++?"Fortran a un code hérité
Grâce à la longue histoire de Fortran, il n’est pas surprenant que des montagnes de code physique y soient écrites. Les physiciens essaient de minimiser le temps de programmation, donc s'ils trouvent du code antérieur, ils l'utiliseront. Même si l'ancien code est illisible, mal documenté et pas le plus efficace, il est plus susceptible d'utiliser l'ancien code éprouvé que d'en écrire un nouveau. La tâche des physiciens n'est pas d'écrire du code, ils essaient de comprendre la nature de la réalité. Les professeurs ont toujours le code hérité à portée de main (souvent ils ont écrit ce code il y a des décennies), et ils le transmettent à leurs étudiants. Cela leur fait gagner du temps et supprime les incertitudes du processus de correction d'erreurs.Les étudiants en physique apprennent le Fortran plus facilement que le C / C ++
Je pense que Fortran est plus facile à apprendre que C / C ++. Fortran 90 et C sont très similaires, mais Fortran est plus facile à écrire. Le C est un langage relativement primitif, donc les physiciens qui choisissent le C / C ++ sont engagés dans une programmation orientée objet. La POO peut être utile, en particulier dans les grands projets logiciels, mais étudiez-la beaucoup plus longtemps. Vous devez étudier les abstractions comme les classes et l'héritage. Le paradigme OOP est très différent de celui procédural utilisé par Fortran. Fortran est basé sur un paradigme procédural simple qui est plus proche de ce qui se passe sous le capot d'un ordinateur. Lorsque vous optimisez / vectorisez du code pour augmenter la vitesse, le paradigme procédural est plus facile à utiliser. Les physiciens comprennent généralement le fonctionnement des ordinateurs et pensent en termes de processus physiques, par exemple, le transfert de données du disque vers la RAM et de la RAM vers le cache du processeur.Ils diffèrent des mathématiciens qui préfèrent penser en termes de fonctions abstraites et de logique. En outre, cette pensée est différente de celle orientée objet. L'optimisation du code POO est plus compliquée de mon point de vue que procédurale. Les objets sont des structures très volumineuses par rapport aux structures de données préférées des physiciens: les tableaux.Légèreté One: Fortran Array Work
Les matrices, ou, comme les physiciens les appellent, les matrices, sont au cœur de tout calcul physique. Dans Fortran 90+, vous pouvez trouver de nombreuses opportunités de travailler avec eux, comme APL et Matlab / Octave. Les tableaux peuvent être copiés, multipliés par un scalaire, multipliés entre eux de manière très intuitive:A = B
A = 3.24*B
C = A*B
B = exp(A)
norm = sqrt(sum(A**2))
Ici, A, B, C sont des tableaux d'une certaine dimension (disons, 10x10x10). C = A * B nous donne la multiplication élémentaire des matrices si A et B sont de la même taille. Pour la multiplication matricielle, C = matmul (A, B) est utilisé. Presque toutes les fonctions internes de Fortran (Sin (), Exp (), Abs (), Floor (), etc.) prennent des tableaux comme arguments, ce qui conduit à un code simple et propre. Il n'y a tout simplement pas de code similaire en C / C ++. Dans une implémentation C / C ++ de base, la simple copie d'un tableau nécessite l'exécution de boucles sur tous les éléments ou l'appel d'une fonction de bibliothèque. Si vous alimentez un tableau de la mauvaise fonction de bibliothèque en C, une erreur se produit. La nécessité d'utiliser des bibliothèques au lieu de fonctions internes signifie que le code résultant ne sera pas propre et portable, ni facile à apprendre.Dans Fortran, l'accès aux éléments d'un tableau fonctionne à travers la syntaxe simple A [x, y, z], quand en C / C ++ vous devez écrire A [x] [y] [z]. Les éléments des tableaux commencent par 1, ce qui correspond à la compréhension des physiciens des matrices, et dans les tableaux C / C ++, la numérotation commence à zéro. Voici quelques fonctionnalités supplémentaires pour travailler avec des tableaux dans Fortran.A = (/ i , i = 1,100 /)
B = A(1:100:10)
C(10:) = B
Premièrement, le vecteur A est créé via une boucle do implicite, également connue sous le nom de constructeur de tableau. Ensuite, un vecteur B est créé, composé de chaque 10e élément de A, en utilisant une étape de 10. Et, enfin, le tableau B est copié dans le tableau C, à partir du 10e élément. Fortran prend en charge la déclaration de tableaux avec des indices nuls ou négatifs:double precision, dimension(-1:10) :: myArray
Un indice négatif semble à première vue idiot, mais j'ai entendu parler de leur utilité - par exemple, imaginez que c'est un domaine supplémentaire pour publier des clarifications. Fortran prend également en charge les index vectoriels . Par exemple, vous pouvez transférer les éléments 1, 5 et 7 d'un tableau A de dimension N x 1 vers un tableau B de dimension 3 x 1:subscripts = (/ 1, 5, 7 /)
B = A(subscripts)
Fortran prend en charge les masques de tableau dans toutes les fonctions internes. Par exemple, si nous devons calculer le logarithme de tous les éléments de matrice supérieurs à zéro, nous utilisons:log_of_A = log(A, mask= A .gt. 0)
Ou nous pouvons annuler tous les éléments négatifs du tableau sur une seule ligne:where(my_array .lt. 0.0) my_array = 0.0
Fortran facilite l'allocation dynamique et la disponibilité de tableaux. Par exemple, pour placer un tableau à deux dimensions:real, dimension(:,:), allocatable :: name_of_array
allocate(name_of_array(xdim, ydim))
En C / C ++, cela nécessite l'entrée suivante :int **array;
array = malloc(nrows * sizeof(double *));
for(i = 0; i < nrows; i++){
array[i] = malloc(ncolumns * sizeof(double));
}
Pour libérer un tableau à Fortrandeallocate(name_of_array)
En C / C ++ pour celafor(i = 0; i < nrows; i++){
free(array[i]);
}
free(array);
:
Dans des langages comme C / C ++, toutes les variables sont passées par valeur, à l'exception des tableaux qui sont passés par référence. Mais dans de nombreux cas, le passage d'un tableau par valeur a plus de sens. Par exemple, laissez les données se composer de positions de 100 molécules à différentes périodes. Nous devons analyser le mouvement d'une molécule. Nous prenons une tranche du tableau (sous-tableau) correspondant aux coordonnées des atomes de cette molécule et la passons à la fonction. Nous y traiterons une analyse complexe du sous-réseau transmis. Si nous le transmettions par référence, les données transférées ne seraient pas localisées en mémoire dans une rangée. En raison de la nature de l'accès à la mémoire, travailler avec un tel tableau serait lent. Si nous le transmettons par valeur, nous créerons en mémoire un nouveau tableau disposé en ligne. Pour le plus grand plaisir des physiciens, le compilateur se charge de tout le sale travail d'optimisation de la mémoire.Dans Fortran, les variables sont généralement transmises par référence, et non par valeur. Sous le capot, le compilateur Fortran optimise automatiquement leur transmission pour une efficacité accrue. Du point de vue du professeur dans le domaine de l'optimisation de l'utilisation de la mémoire, le compilateur doit faire plus confiance qu'à l'étudiant! En conséquence, les physiciens utilisent rarement des pointeurs, bien que Fortran-90 + ils ont .Quelques exemples supplémentaires des différences entre Fortran et C
Fortran dispose de plusieurs options pour gérer le compilateur lors du dépannage et de l'optimisation. Des erreurs dans le code peuvent être détectées au stade de la compilation et non lors de l'exécution. Par exemple, toute variable peut être déclarée en tant que paramètre, c'est-à-dire une constante.double precision, parameter :: hbar = 6.63e-34
Si le paramètre du code change, le compilateur renvoie une erreur. En C, cela s'appelle constdouble const hbar = 6.63e-34
Le problème est que const real est différent du simple real. Si une fonction acceptant real devient const real, elle retournera une erreur. Il est facile d'imaginer comment cela peut entraîner des problèmes d'interopérabilité dans le code.Fortran a également une spécification d'intention qui indique au compilateur si l'argument passé à la fonction est une entrée, une sortie ou à la fois une entrée et un paramètre de sortie. Cela aide le compilateur à optimiser le code et augmente sa lisibilité et sa fiabilité.Fortran possède d'autres fonctionnalités qui sont utilisées à différentes fréquences. Par exemple, Fortran 95 a la capacité de déclarer des fonctions avec le modificateur pur. Une telle fonction n'a pas d'effets secondaires - elle modifie uniquement ses arguments et ne modifie pas les variables globales. Un cas particulier d'une telle fonction est la fonction élémentaire, qui accepte et renvoie des scalaires. Il est utilisé pour traiter les éléments du tableau. Le fait que la fonction soit pure ou élémentaire permet au compilateur d'effectuer une optimisation supplémentaire, en particulier lors de la parallélisation du code.À quoi s'attendre à l'avenir?
Dans les calculs scientifiques, le Fortran reste la langue principale et ne va pas disparaître dans un futur proche. Dans l' enquêteParmi les visiteurs de la conférence 2014 Supercomputing Convention utilisant cette langue, 100% d'entre eux ont déclaré qu'ils allaient l'utiliser dans les 5 prochaines années. Il ressort également de l'enquête que 90% ont utilisé un mélange de Fortran et C. Anticipant une augmentation du mélange de ces langages, les créateurs de la spécification Fortran 2015 incluent plus de fonctionnalités pour l'interopérabilité du code. Le code Fortran est de plus en plus appelé à partir du code Python. Les informaticiens qui critiquent l'utilisation de Fortran ne comprennent pas que ce langage reste uniquement adapté à son nom - FOrmula TRANslation, traduisant des formules, c'est-à-dire convertissant des formules physiques en code. Beaucoup d'entre eux ne savent pas que le langage évolue et inclut constamment de nouvelles fonctionnalités.Appeler l'ancien Fortran 90+ moderne est le même que d'appeler l'ancien C ++ car C a été développé en 1973. D'autre part, même la nouvelle norme Fortran 2008 a une compatibilité descendante avec Fortran 77 et la plupart de Fortran 66. Par conséquent, le développement de la langue est associé à certaines difficultés. Récemment, des chercheurs du MIT ont décidé de surmonter ces difficultés en développant à partir de zéro un langage pour HPC appelé Julia , sorti pour la première fois en 2012. Reste à savoir si Julia prendra la place de Fortran. En tout cas, je soupçonne que cela prendra très longtemps.