Outils pour utilisateurs

Outils du site


cours:informatique:dev:golang:demarrer_avec_go:110_pourquoi_apprendre_go

Notes et transcriptions du cours “Démarrer avec Go” proposée par University of California, Irvine disponible sur la plateforme coursera.

Pourquoi devrais-je apprendre le go ? (Avantages du Go)

Alors, pourquoi devriez-vous apprendre le Go ? Qu'y a-t-il d'unique et de bon dans le langage Go ? Je vais passer en revue certains des points saillants de cette question. Différentes personnes ont des opinions différentes, mais certaines fonctionnalités sont considérées de manière assez uniforme comme des avantages du langage Go. Voici donc certains des avantages de Go.

Tout d'abord, il s’exécute rapidement. OK, c'est toujours une bonne chose, et je vais expliquer un peu plus en détail dans les diapositives pourquoi il fonctionne vite, et plus vite que quoi… Il ne s'exécute pas plus vite que tout, mais il va plus vite que beaucoup de choses, et nous verrons pourquoi.

Le ramasse miettes (garbage collector) est une autre de ses fonctionnalités. Les langages similaires, c'est-à-dire des langages qui fonctionnent vite comme le fait Go, n'ont pas de ramasse miettes. Donc, le ramasse miettes est une fonctionnalité vraiment utile, je vais décrire ce que c'est.

Des objets plus simples, cela peut être un avantage ou un inconvénient, mais l'idée est que Go est essentiellement orienté objet, même si certains pourraient ne pas être d'accord, mais il a ce concept d'objets, et ces objets le sont généralement, l'orientation des objets est un peu simplifiée par rapport aux autres langages. Donc, c'est bien, cela facilite le codage. Vous n'avez pas à utiliser ces fonctionnalités compliquées, bien sûr, vous n'avez jamais eu à les utiliser de quelque façon que ce soit, mais cela les rend plus rapides et plus simples à utiliser. Je sais que quelques un pourrait dire que ces fonctionnalités sont utiles, et qu'ils les voulaient. OK. Mais Go est en fait une implémentation orientée objet plus simple que celle que l'on pourrait voir dans d'autres langages comme le C++.

Une autre caractéristique de Go est qu'il intègre au langage les traitements en concurrence, une implémentation efficace de la concurrence. Beaucoup de ces primitives de concurrence sont donc intégrées au langage et mises en œuvre efficacement, et nous en parlerons.

Rapidité d’exécution

Donc, pour commencer, examinons ce code qui s'exécute rapidement et expliquons pourquoi c'est le cas. Pour en parler, nous devons parler un peu des langages en général, des différences entre les langages.

J'ai donc trois grandes catégories de langages pour les machines :

  • le langage machine ;
  • le langage d'assemblage (assembleur) ;
  • le langage de haut niveau.

C'est une très grande catégorie, mais laissez-moi vous expliquer. Pour commencer, le langage machine est le langage de niveau le plus bas, et il est directement exécuté sur le processeur, sur le processeur. Les instructions en langage machine sont donc très, très directes et simples : ajouter, multiplier, ajouter peut ajouter du contenu au registre, placer le résultat dans un autre registre, quelque chose comme ça,avec de très nombreuses petites étapes élémentaires, pour chaque instruction en langage machine. Maintenant, cela fonctionne directement sur le processeur.

Il existe un langage d'assemblage et le langage d'assemblage est essentiellement un langage machine, presque un mappage individuel vers le langage machine. Donc, en langage machine, supposons que vous deviez ajouter une instruction qui pourrait être représentée par une séquence de zéros et de uns comme 11110000 (un opcode pour un ajout). Ainsi, dans le langage d'assemblage, vous utiliseriez le mot ADD. Donc, il correspondance un à un, un équivalent en langage machine, mais vous pouvez le lire parce que c'est de l'anglais. Maintenant, c'est un anglais concis, je dirais que c'est difficile à lire, mais c'est un langage mnémotechnique anglais, donc un humain pourrait le lire et corriger cela s'il le voulait, et les gens le font parfois. Si vous voulez que quelque chose fonctionne vraiment très rapidement et très efficacement, vous devez l'écrire directement en langage d'assemblage. C'est hors du cadre de ce cours, c'est du hardcore, je dirais. Ce n'est pas quelque chose que nous allons vraiment aborder dans ce cours, mais parfois vous écrivez directement en langage d'assemblage. Il y a donc un compilateur pour l'assembleur, et le langage d'assemblage est essentiellement un mappage un à un vers le langage machine, pas complètement, mais très proche. Donc, fondamentalement, ils ont la même complexité. Il s'agit du même langage que le langage machine, mais le langage d'assemblage est plus facile à lire.

Les langages de haut niveau : c'est tout le reste. C'est une vaste catégorie. Un langage de haut niveau est un langage que les humains utilisent couramment pour programmer. Ils sont beaucoup plus faciles à utiliser que le langage d'assemblage ou le langage machine. Ils vous fournissent de nombreuses abstractions utilisées par tout programme, par exemple des variables. Le langage assembleur et le langage machine n'ont pas de variables, ils ont de la mémoire, et vous pouvez y mettre des éléments, en retirer. Il n'y a aucune idée d'un type ou de quelque chose comme ça en langage assembleur ou en langage machine, mais les langages de haut niveau vous le permettent.

A propos des conditions. Le langage assembleur, le langage machine, ils ont des branches conditionnelles, etc., mais elles sont généralement beaucoup plus difficiles à utiliser que votre instruction if standard que vous pourriez voir dans n'importe quel langage normal de haut niveau ou dans des boucles. Vous pouvez créer ces éléments en assembleur et en langage machine, mais ils sont plus difficiles à écrire que dans un langage de haut niveau. Ainsi, les langages de haut niveau sont essentiellement tout ce dans quoi la plupart des gens programment.

Vous pouvez donc imaginer ces différentes catégories. Maintenant, le langage dont nous parlons est Go. Le go est bien entendu un langage de haut niveau dans cet ensemble de trois catégories, il sera considéré comme un langage de haut niveau. Rappelez-vous que le terme « haut niveau » est subjectif, d'accord ? Mais je dirais que c'est du haut niveau. Ainsi, tous les logiciels que j'ai mis en évidence dans la diapositive doivent être traduits dans le langage machine du processeur pour être exécutés (C, C++, Java, Python, GO). Donc, cela signifie que si vous avez un processeur quelconque, un i7 ou tout autre processeur avec lequel vous travaillez, ce processeur ne connaît pas le C, le Java, le Python, le Go ou le C++, n'est-ce pas ? Tout ce qu'il sait, c'est son propre langage machine, disons le langage machine x86, s'il s'agit d'un processeur Intel ou d'un processeur AMD ou quelque chose comme ça, il connaît donc ce langage machine. Ainsi, pour que le code puisse s'exécuter sur le processeur, il doit d'abord être traduit dans le langage machine du processeur. Donc, même s'il s'agit de C, Python, Java, peu importe ce que c'est, il doit être traduit. Il y a donc cette étape de traduction logicielle qui doit être faite.

Cette étape de traduction peut se dérouler de deux manières différentes : cela peut être une compilation ou une interprétation. Un langage compilé est un langage dans lequel la traduction d'un langage de haut niveau en code machine se fait une fois avant que vous n'exécutiez le code, avant que vous ne déployiez le code : comme dans C, C++, Go, Java partiellement, il y a un compilateur, et vous compilez le code. Donc, quelqu'un écrit le code source, le compile, puis il l'exécute, et il exécute l'exécutable compilé. L'exécutable compilé est essentiellement du code en langage machine et d'autres éléments, mais c'est essentiellement du code en langage machine.

L'idée qui sous-tend les langages compilés, l'élément clé que nous voulons faire ressortir de toute façon est le fait que cette traduction ne se produit qu'une seule fois, elle ne se produit pas pendant que vous exécutez le code. Cela se produit avant d'exécuter le code, puis lorsque vous exécutez le code, vous exécutez simplement les instructions en langage machine directement, car elles sont déjà compilées en langage machine par le compilateur.

L'autre façon de procéder est l'interprétation Dans un langage interprété, les instructions sont traduites pendant que le code est exécuté. Ce qui se passe, c'est que cela ajoute du temps à l'exécution, car chaque fois que vous voyez une instruction, disons Python, ce code doit être traduit en code machine à la volée, et cela prend un certain temps juste pour effectuer cette traduction. Donc, en plus d'exécuter réellement l'instruction, vous devez effectuer cette traduction de l'instruction dans le code machine équivalent, ce qui vous ralentit. Ainsi, la traduction a lieu chaque fois que vous exécutez le code Python, ou Java (le byte code Java).

J'ai classé Java partiellement dans les deux catégories parce que Java est compilé, mais il génère ce qu'on appelle du byte code, pas du code machine réel, puis le byte code doit être interprété au moment de l'exécution. Il existe donc également un interpréteur dans la machine virtuelle Java, mais ces langages d'interprétation nécessitent l' exécution d'un interpréteur pendant que vous exécutez votre code, car il doit effectuer cette traduction au fur et à mesure que vous exécutez le code, ce qui vous ralentit. Il s'agit cependant d'un compromis entre le code compilé et le code interprété.

Le premier niveau (la compilation du byte code) est le compromis. L'une des grandes différences que vous pouvez constater est que son code compilé est généralement plus rapide à exécuter, car vous n'avez pas à faire la traduction à chaque fois que vous exécutez le code, il sera donc plus rapide. Certains diront le contraire, mais en général, le code compilé est beaucoup plus rapide.

D'un autre côté, les interpréteurs facilitent le codage. L'interpréteur, le programme qui fait la traduction de votre code, peut vous aider, il peut gérer des choses que vous ( en tant que programmeur) ne voulez pas gérer. Par exemple, en Python, je n'ai pas besoin de déclarer mes types de variables. Je peux simplement commencer à utiliser une variable et l'interpréteur dira : « On dirait qu'il l'utilise comme un entier, j'en fais un entier. » C'est donc une chose à laquelle le programmeur n'a pas à penser.

Une autre chose que les interpréteurs utilisent souvent est la gestion de la mémoire. En fait, ils l'ont presque toujours. Ils peuvent gérer leur mémoire, c'est-à-dire se débarrasser des variables et autres éléments de données lorsque vous ne les utilisez pas. Ainsi, lorsque vous utilisez une variable, cette variable doit être mise en mémoire quelque part, et cette mémoire, si vous continuez à créer des variables et à utiliser un espace mémoire, vous finirez par en manquer, les choses ralentiront et vous manquerez de mémoire. Vous devez donc gérer votre mémoire, c'est-à-dire lorsque vous avez fini d'utiliser un objet, vous devez vous en débarrasser, le déallouer de la mémoire, et cela se produit automatiquement dans un langage interprété, donc l'interpréteur s'en charge. C'est donc une bonne chose proposée par les interpréteurs.

Go est donc un bon compromis entre ce type de langage compilé et interprété. C'est un langage compilé, mais il possède certaines des fonctionnalités intéressantes du langage interprété, notamment le ramasse miettes. Le ramasse miettes est donc la gestion automatique de la mémoire dont je parle. Cette gestion de la mémoire, où la mémoire doit-elle être allouée : « J'ai besoin d'une variable x. Où dois-je la mettre en mémoire ? Dans quel type de mémoire dois-je la mettre ? » Nous en reparlerons un peu plus tard, mais aussi “quand en aurai-je fini avec cet espace mémoire ?” Parce que lorsque vous en avez fini avec la mémoire, vous pouvez vous en débarrasser. Vous n'avez plus besoin de l'utiliser, vous pouvez l'utiliser pour autre chose. C'est la gestion de la mémoire et cela se fait automatiquement. Le ramasse-miettes peut le découvrir, il dit : « Oh, il semblerait que ce programme en ait terminé avec la variable x, je vais libérer cette mémoire maintenant », et cela se produit automatiquement.

La gestion manuelle de la mémoire est une tâche difficile. Si vous avez déjà fait du C ou équivalent, vous le savez, désallouez de la mémoire trop tôt et tenter d' y accéder provoquera des erreurs. A contrario, si vous le désallouez trop tard, vous gaspillez de la mémoire, vous pouvez avoir ce que l'on appelle une fuite de mémoire, où vous avez de plus en plus de mémoire qui n'est pas réellement utilisée, mais qui est bloquée parce que votre machine pense qu'elle est utilisée. Donc, la gestion manuelle de la mémoire est très difficile, et favaorise beaucoup d'erreurs, y compris des erreurs de sécurité.

Go inclut donc un code de ramasse miettes. Ainsi, lorsqu'il compile votre code, il compile également automatiquement le ramasse miette dans votre code, et cela n'est généralement effectué que par un interpréteur. Il s'agit donc d'un langage compilé qui intègre en fait le ramasse miettes, qui est une très bonne fonctionnalité. L' inconvénient, c'est que cela ralentit un peu l'exécution, mais c'est une fonctionnalité efficace, donc elle ne ralentit pas beaucoup et vous bénéficiez de nombreux avantages de cette gestion avancée de la mémoire.

◁ Précédent | ⌂ Retour au sommaire | Suivant ▷

cours/informatique/dev/golang/demarrer_avec_go/110_pourquoi_apprendre_go.txt · Dernière modification : 2024/05/02 18:04 de yoann