Comment implémenter le bootstrapping dans golang : installez d'abord [Go 1.4] ou supérieur ; puis utilisez la chaîne d'outils Go existante pour créer une version de base de la chaîne d'outils [Go 1.5] et enfin utilisez-la pour construire [ ; go_bootstrap] et le reste de la bibliothèque standard et des composants standard.
La méthode de Golang pour implémenter le bootstrapping :
自举
(Bootstrapping) est un tel processus, "Utilisez le le langage de programmation cible à compiler écrit son compilateur (ou assembleur)". De manière générale, le bootstrap présente plusieurs avantages, tels que :
pour tester le langage en cours de bootstrap
prend en charge l'utilisation généralement de plus de compilateurs Write ; pour les langages de haut niveau qui fournissent des abstractions de plus haut niveau
Les compilateurs peuvent également bénéficier de toute amélioration au niveau du langage ;
Comme mentionné, Google a commencé ses efforts pour supprimer le code C de l'arborescence des sources Go il y a un an. Le plan de conversion est divisé en 5 étapes :
Phase 1 - Développer un traducteur du langage C vers le langage Go et traduire le compilateur C existant en langage Go. Cette étape profite du fait que le compilateur d'origine n'a pas fait un usage intensif de certaines fonctionnalités difficiles à porter vers le langage Go, telles que les macros, les unions et l'arithmétique des pointeurs.
Étape 2 - Convertir l'arborescence du code source du compilateur pour obtenir un compilateur en langage Go, mais il est relativement primitif et de style C.
Étape 3 - Convertir le compilateur obtenu précédemment en un programme conforme aux habitudes du langage Go, principalement en identifiant les packages, en ajoutant de la documentation et des tests unitaires.
Étape 4 - Optimiser le compilateur, résoudre le problème d'utilisation de la mémoire du compilateur et du CPU, et peut introduire la parallélisation. De plus, une tentative est faite pour introduire une nouvelle représentation intermédiaire entre les arbres non ordonnés indépendants de l'architecture (Node*s) et les listes ordonnées dépendant de l'architecture (Prog*s) utilisées aujourd'hui, dans le but d'améliorer la capacité du compilateur à éliminer capacités d'optimisation redondantes dans des situations telles que les contrôles nuls et les contrôles de limites.
Phase 5 - Remplacer le frontal par la dernière version de go/parser et go/types.
Russ a mentionné qu'ils avaient également envisagé certaines alternatives, mais qu'elles avaient été éliminées en fonction de divers facteurs, décrits dans ce document il y a un an.
Go's Bootstrapping
Le bootstrapping du compilateur provoque souvent un problème de "poule ou d'œuf", et un moyen doit être fourni pour nous compiler Le langage à créer.
La situation avec Go est que pour construire Go 1.5, vous devez d'abord installer Go 1.4 ou supérieur, puis utiliser la chaîne d'outils Go existante pour créer une version de base de la chaîne d'outils Go 1.5. Une fois que vous avez compilé la chaîne d'outils Go 1.5 (Go 1.4), vous pouvez l'utiliser pour se construire, et vous pouvez l'utiliser davantage pour créer go_bootstrap et le reste de la bibliothèque standard et des composants standard. Ce processus ajoute une étape intermédiaire : la chaîne d'outils résultante est ensuite utilisée pour se construire, qui peut être appliquée à n'importe quelle future version de Go.
Pour en savoir plus sur le plan de Go visant à mettre en œuvre le bootstrapping, InfoQ a interviewé Russ.
Réaliser le bootstrapping semble être une étape importante pour le langage Go. Dans l’évolution du langage, pourquoi avez-vous décidé de faire cela à ce stade ? Pouvez-vous l’expliquer en détail ?
Go est un bon langage à usage général, mais il a été conçu pour être utilisé lors de l'écriture de logiciels côté serveur à grande échelle et hautement concurrents, comme ceux exécutés sur les serveurs de Google. Si le bootstrapping est implémenté plus tôt, le compilateur Go sera le premier programme en langage Go à grande échelle. Cela aura un impact négatif sur la conception du langage et nous éloignera du véritable objectif.
Il existe également des raisons techniques pour ne pas implémenter le bootstrap plus tôt, telles que la portabilité, la compilation à partir du code source est plus facile que le bootstrapping, et nous pouvons également avoir une implémentation stable du compilateur le plus tôt possible.
Utiliser Go pour construire Go, par rapport à l'utilisation de C, dans quels domaines spécifiques pensez-vous qu'il y a des améliorations évidentes ?
Ken Thompson m'a dit un jour qu'écrire des programmes en Go semblait plus facile que d'utiliser C. L'une des raisons est que Go élimine plusieurs types courants de bogues C, tels que les pointeurs suspendus, les fuites de mémoire, les débordements de tampon, les débordements de pile lors d'une récursion profonde, l'utilisation abusive de void* et les conversions numériques inattendues.
La chaîne d'outils Go standard prend en charge la modularité, les tests unitaires et le profilage mieux que n'importe quelle chaîne d'outils C standard, mais ce qui m'excite le plus, c'est lors de la modification des API internes ou de la refactorisation.
Dans le document "Go 1.3+ Compiler Overhaul", vous décrivez le processus en 5 étapes de migration d'un compilateur existant de C vers Go. Quelles étapes ont été franchies jusqu’à présent ? Quand est-il prévu d’achever les étapes restantes ?
Pour le projet Go, il était plus important de convertir le runtime du langage de C en Go, nous l'avons donc fait en premier. Nous revenons maintenant au compilateur.
Du point de vue de la documentation, nous sommes actuellement en phase 2. Le traducteur est complet et nous a aidé à convertir le runtime. Nous appliquons cela au compilateur. Nous espérons achever la transition vers le compilateur Go 1.5. Des travaux de nettoyage seront effectués dans les projets après Go 1.5.
Recommandations d'apprentissage associées : Tutoriel de langue Go
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!