Je lance également mes deux cents en retard, mais je viens tout juste de voir ce fil et je sens que, pour la postérité, il y a quelques points qui doivent absolument être abordés.
Notez dans la suite que je parlerai de C et non de C ++. Pourquoi? Autrement, c’est aux pommes et aux oranges de comparer un langage orienté objet à typage dynamique à part entière avec un objet aussi statique que Fortran. Certes, certaines implémentations modernes des dernières normes Fortran peuvent faire plus que cela, mais très peu de personnes les utilisent réellement. Ainsi, lorsque nous parlons de Fortran, nous pensons à un langage simple, statique et impératif. C est là où C est aussi, je vais donc remplacer C par C ++ pour ce qui suit.
Tout d’abord, toute discussion sur le fait que Fortran / C ait de meilleurs compilateurs est sans objet. Les compilateurs C / Fortran dédiés appartiennent au passé. Gcc / gfortran et icc / ifc ne sont que deux frontaux distincts, c’est-à-dire que votre programme sera transformé en une description abstraite par le front-end, puis optimisé et assemblé par le back-end. Si vous écrivez sémantiquement le même code en Fortran ou en C, le compilateur produira dans les deux cas le même assemblage qui fonctionnera tout aussi rapidement.
Ceci mène maintenant à mon deuxième point: pourquoi voyons-nous encore des différences? Le problème est que la plupart des comparaisons sont faites par les programmeurs Fortran qui essayent quelque chose en C ou vice-versa. Avez-vous déjà remarqué comment la plupart des auteurs ou des poètes préfèrent écrire dans leur langue maternelle? Voudriez-vous écrire de la poésie dans une langue dans laquelle vous ne vous sentez pas totalement confiant ou chez vous? Bien sûr que non ... Je considère moi-même que C est mon langage de programmation "natif". Cependant, j'ai également passé trois ans à travailler dans un groupe utilisant uniquement le Fortran, dans lequel j'ai atteint un certain niveau de fluence. Cependant, je n’écrirais jamais rien seul à Fortran car je suis plus à l’aise avec C et, par conséquent, le code obtenu sera meilleur , quelle que soit votre définition.
Donc, la principale différence réside dans le programmeur, pas dans la langue. Donc, il n'y a pas de différences? Pas tout à fait. Voici quelques exemples:
SIMD: Qu'il s'agisse de SSE, SSE3 ou AltiVec, si vous souhaitez les utiliser dans Fortran, espérez mieux que le compilateur devine exactement ce que vous voulez et le fasse ainsi. Bonne chance. En C, vous avez généralement des fonctions intrinsèques pour chaque architecture ou, plus récemment, des types de vecteurs SIMD généraux dans gcc . La plupart des compilateurs Fortran n'utilisent que les instructions SIMD pour dérouler les boucles, mais si vous avez un noyau qui fonctionne sur des vecteurs courts de données de manière non évidente, le compilateur ne le verra probablement pas.
Différentes architectures matérielles: Toute l'architecture CUDA est construite autour de noyaux en C. Le groupe Portland dispose désormais d'un compilateur fortran compatible CUDA , mais il est commercial et surtout, il ne provient pas de NVIDIA. Il en va de même pour OpenCL, pour lequel le meilleur que j'ai pu trouver est un projet récent qui ne prend en charge que quelques appels de base.
Programmation parallèle: Oui, MPI et OpenMP fonctionnent parfaitement avec C et Fortran. Cependant, si vous voulez un réel contrôle de vos threads, c'est-à-dire que si vous avez un calcul de mémoire partagée entièrement dynamique, vous serez dans le froid avec Fortran. En C, vous avez les pthreads standards qui, sans être chauds et confus, vous permettront quand même de traverser la tempête. En général, la plupart des calculs reposant sur l'accès au système d'exploitation, tels que les threads, les processus, le système de fichiers, etc., sont mieux gérés avec C. Oh, et n'essayez pas de créer votre propre réseau avec Fortran.
Facilité d'utilisation: Fortran est plus proche de Matlab que C Une fois que vous avez défini tous les différents mots-clés et comment déclarer des variables, le reste du code ressemble à Matlab, ce qui le rend plus accessible aux utilisateurs ayant une expérience limitée de la programmation.
Interopérabilité: lorsque vous créez une structure en C, la présentation des données réelles est directe et déterministe. En Fortran, si vous utilisez des tableaux de pointeurs ou des données structurées, la présentation réelle des données dépend fortement du compilateur, non directe, et est généralement non documentée. Vous pouvez appeler C depuis Fortran et vice-versa, mais ne commencez pas à penser qu'il peut être aussi facile de faire passer autre chose qu'un tableau statique de l'un à l'autre et inversement.
Tout cela est un peu geek, de bas niveau, mais c'est de l'informatique haute performance dont nous parlons, n'est-ce pas? Si vous ne souhaitez pas exploiter au mieux les paradigmes matériels sous-jacents, c'est-à-dire implémenter et / ou développer les meilleurs algorithmes pour la mémoire partagée / distribuée, les threads, la vectorisation SIMD, les GPU utilisant SIMT, etc. je fais juste des maths sur un ordinateur.
Cela a pris beaucoup plus de temps que tout ce que je pensais, alors voici un résumé - un ensemble de messages à emporter:
- Vous écrirez le meilleur code que vous pouvez dans la langue que vous connaissez le mieux.
- Il n'y a aucune différence dans la qualité du code produit par deux compilateurs qui utilisent le même back-end - c'est nous qui écrivons du mauvais code dans une langue ou une autre.
- Bien qu’il se sente plus bas niveau, Fortran est une abstraction assez élevée et ne vous permettra pas d’accéder directement à certaines fonctionnalités matérielles / OS, telles que SIMD, threads, réseaux, etc.