231 votes

Comment Go peut-il se compiler si rapidement ?

J'ai cherché sur Google et sur le site web de Go, mais je n'ai pas trouvé d'explication aux délais de fabrication extraordinaires de Go. Sont-ils le produit des caractéristiques du langage (ou de leur absence), d'un compilateur hautement optimisé, ou d'autre chose ? Je n'essaie pas de promouvoir Go ; je suis simplement curieux.

12 votes

@Support, je suis conscient de cela. Je pense que l'implémentation d'un compilateur de manière à ce qu'il compile avec une rapidité notable est tout sauf une optimisation prématurée. Plus que probablement, cela représente le résultat de bonnes pratiques de conception et de développement de logiciels. De plus, je ne supporte pas de voir les mots de Knuth sortis de leur contexte et appliqués de manière incorrecte.

62 votes

La version pessimiste de cette question est "Pourquoi le C++ compile-t-il si lentement ?". stackoverflow.com/questions/588884/

16 votes

J'ai voté pour la réouverture de cette question car elle n'est pas fondée sur une opinion. On peut donner un bon aperçu technique (sans opinion) des choix de langage et/ou de compilateur qui facilitent la vitesse de compilation.

201voto

Igor Krivokon Points 6999

Analyse des dépendances.

Le site Aller à la FAQ contenait la phrase suivante :

Go fournit un modèle pour les logiciels logiciel qui rend l'analyse des dépendances l'analyse des dépendances et évite la plupart des des fichiers include et des bibliothèques de style bibliothèques.

Bien que cette phrase ne figure plus dans la FAQ, ce sujet est développé dans l'exposé. Allez sur Google qui compare l'approche de l'analyse des dépendances de C/C++ et de Go.

C'est la raison principale de la compilation rapide. Et c'est à dessein.

2 votes

Cette phrase n'est plus dans la FAQ Go, mais une explication plus détaillée du sujet "analyse des dépendances" comparant l'approche C/C++ et Pascal/Modula/Go est disponible dans le talk Allez sur Google

77voto

el.pescado Points 7960

Je pense que ce n'est pas que les compilateurs de Go sont rapide c'est que d'autres compilateurs sont lent .

Les compilateurs C et C++ doivent analyser d'énormes quantités d'en-têtes - par exemple, la compilation de "hello world" en C++ nécessite la compilation de 18 000 lignes de code, ce qui représente presque un demi-mégaoctet de sources !

$ cpp hello.cpp | wc
  18364   40513  433334

Les compilateurs Java et C# fonctionnent dans une VM, ce qui signifie qu'avant de pouvoir compiler quoi que ce soit, le système d'exploitation doit charger toute la VM, puis ils doivent être compilés en JIT du bytecode au code natif, ce qui prend un certain temps.

La rapidité de la compilation dépend de plusieurs facteurs.

Certains langages sont conçus pour être compilés rapidement. Par exemple, le Pascal a été conçu pour être compilé à l'aide d'un compilateur à passe unique.

Les compilateurs eux-mêmes peuvent également être optimisés. Par exemple, le compilateur Turbo Pascal a été écrit en assembleur optimisé à la main, ce qui, combiné à la conception du langage, a permis d'obtenir un compilateur très rapide fonctionnant sur du matériel de classe 286. Je pense que même aujourd'hui, les compilateurs Pascal modernes (par exemple FreePascal) sont plus rapides que les compilateurs Go.

19 votes

Le compilateur C# de Microsoft ne fonctionne pas dans une VM. Il est toujours écrit en C++, principalement pour des raisons de performances.

22 votes

Turbo Pascal et plus tard Delphi sont les meilleurs exemples de compilateurs extrêmement rapides. Après que l'architecte de ces deux compilateurs a migré vers Microsoft, nous avons vu de grandes améliorations dans les compilateurs MS et dans les langages. Il ne s'agit pas d'une coïncidence aléatoire.

0 votes

En quoi 18 000 est "presque la moitié" de 1 000 000 (par exemple, un mégaoctet) ?

43voto

Atom Points 8739

Il existe de multiples raisons pour lesquelles le compilateur Go est beaucoup plus rapide que la plupart des compilateurs C/C++ :

  • Raison principale : La plupart des compilateurs C/C++ présentent des conceptions exceptionnellement mauvaises (du point de vue de la vitesse de compilation). De même, du point de vue de la vitesse de compilation, certaines parties de l'écosystème C/C++ (comme les éditeurs dans lesquels les programmeurs écrivent leurs codes) ne sont pas conçues en fonction de la vitesse de compilation.

  • Raison principale : La vitesse de compilation rapide a été un choix conscient dans le compilateur Go et également dans le langage Go.

  • Le compilateur Go possède un optimiseur plus simple que les compilateurs C/C++.

  • Contrairement au C++, le Go n'a pas de templates et pas de fonctions inline. Cela signifie que Go n'a pas besoin d'effectuer d'instanciation de modèle ou de fonction.

  • Le compilateur Go génère plus tôt du code assembleur de bas niveau et l'optimiseur travaille sur le code assembleur, alors que dans un compilateur C/C++ typique, les passes d'optimisation travaillent sur une représentation interne du code source original. La surcharge du compilateur C/C++ provient du fait que la représentation interne doit être générée.

  • L'édition finale (5l/6l/8l) d'un programme Go peut être plus lente que l'édition d'un programme C/C++, car le compilateur Go passe en revue tout le code d'assemblage utilisé et effectue peut-être d'autres actions supplémentaires que les éditeurs de liens C/C++ ne font pas.

  • Certains compilateurs C/C++ (GCC) génèrent des instructions sous forme de texte (à transmettre à l'assembleur), tandis que le compilateur Go génère des instructions sous forme binaire. Un travail supplémentaire (mais pas beaucoup) doit être effectué afin de transformer le texte en binaire.

  • Le compilateur Go ne cible qu'un petit nombre d'architectures de CPU, tandis que le compilateur GCC cible un grand nombre de CPU.

  • Les compilateurs qui ont été conçus dans le but d'obtenir une vitesse de compilation élevée, comme Jikes, sont rapides. Sur un processeur de 2 GHz, Jikes peut compiler plus de 20 000 lignes de code Java par seconde (et le mode incrémental de compilation est encore plus efficace).

20 votes

Le compilateur de Go inline les petites fonctions. Je ne vois pas en quoi cibler un petit nombre de CPUs vous rend plus rapide, plus lent... Je suppose que gcc ne génère pas de code PPC alors que je compile pour x86.

1 votes

@BradFitzpatrick Je déteste ressusciter un vieux commentaire mais en ciblant un plus petit nombre de plateformes, les développeurs du compilateur peuvent passer plus de temps à l'optimiser pour chacune d'elles.

0 votes

L'utilisation d'un formulaire intermédiaire permet de prendre en charge un plus grand nombre d'architectures, puisqu'il suffit désormais d'écrire un nouveau backend pour chaque nouvelle architecture.

35voto

Larry OBrien Points 5058

L'efficacité de la compilation était un objectif majeur de la conception :

Enfin, il est censé être rapide : il devrait prendre tout au plus quelques secondes pour construire un gros exécutable sur un seul ordinateur. Pour atteindre ces objectifs, il a fallu résoudre un certain nombre de problèmes linguistiques : un système de types expressif mais léger, la concurrence et le ramassage des déchets, une spécification rigide des dépendances, etc. FAQ

La FAQ du langage est assez intéressante en ce qui concerne les caractéristiques spécifiques du langage relatives à l'analyse syntaxique :

Deuxièmement, le langage a été conçu pour être facile à analyser et peut être analysé sans table de symboles.

6 votes

Ce n'est pas vrai. Vous ne pouvez pas analyser complètement le code source Go sans une table de symboles.

13 votes

Je ne vois pas non plus pourquoi le garbage collection améliore les temps de compilation. Ce n'est pas le cas.

4 votes

Ce sont des citations de la FAQ : golang.org/doc/go_faq.html Je ne peux pas dire s'ils ont échoué à atteindre leurs objectifs (tableau des symboles) ou si leur logique est défectueuse (GC).

31voto

Kosta Points 141

Bien que la plupart de ce qui précède soit vrai, il y a un point très important qui n'a pas vraiment été mentionné : la gestion des dépendances.

Go ne doit inclure que les paquets que vous importez. directement (comme ceux qui ont déjà importé ce que ils besoin). C'est un contraste frappant avec C/C++, où chaque fichier unique commence à inclure des en-têtes x, qui incluent des en-têtes y, etc. En résumé : La compilation de Go prend un temps linéaire par rapport au nombre de paquets importés, alors que C/C++ prend un temps exponentiel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X