Steve Yegge a écrit un excellent article de blog qui, quelque peu indirectement, traite de cela.
Gros point n ° 1: les compilateurs englobent à peu près tous les aspects de l'informatique. Il s'agit d'un cours de niveau supérieur, car vous devez connaître toutes les autres choses que vous apprenez dans le programme d'informatique juste pour commencer. Structures de données, recherche et tri, performances asymptotiques, coloration graphique? Tout est là-dedans.
Il y a une raison pour laquelle Knuth travaille sur son monumental (et sans fin) "Art of Computer Programming" depuis plusieurs décennies, même s'il a commencé comme (juste) un manuel de compilation. De la même manière que Carl Sagan a dit "Si vous voulez faire une tarte aux pommes à partir de zéro, vous devez d'abord inventer l'univers", si vous souhaitez écrire un compilateur, vous devez d'abord traiter presque tous les aspects de l'informatique.
Cela signifie que si le compilateur est auto-hébergé, il est à peu près sûr de pouvoir faire ce dont j'ai besoin, peu importe ce que je fais. Inversement, si vous n'avez pas écrit de compilateur dans votre langage, il y a de fortes chances qu'il manque quelque chose de vraiment important pour quelqu'un, car les implémenteurs de langage n'ont jamais eu à écrire un programme qui les obligerait à réfléchir à tous ces problèmes.
Gros point n ° 2: à partir de 30 000 pieds, un nombre surprenant de problèmes ressemblent à des compilateurs.
Les compilateurs prennent un flux de symboles, déterminent leur structure selon certaines règles prédéfinies spécifiques au domaine et les transforment en un autre flux de symboles. Cela semble assez général, n'est-ce pas? Ben ouais.
Que vous soyez dans l'équipe Visual C ++ ou non, vous vous retrouverez très souvent à faire quelque chose qui ressemble à une partie d'un compilateur. Je le fais littéralement tous les jours.
Contrairement à la plupart des autres professions, les programmeurs n'utilisent pas seulement des outils, mais construisent leurs propres outils. Un programmeur qui ne peut pas (en raison du manque de compétences ou du manque d'outils utilisables pour construire d'autres outils) écrire des outils sera à jamais handicapé, limité aux outils que quelqu'un d'autre fournit.
Si un langage n'est "pas bien adapté à la création" de programmes qui peuvent prendre un flux de symboles, leur appliquer des règles et le transformer en un autre flux de symboles, cela ressemble à un langage assez limité, et pas un qui serait utile pour moi.
(Heureusement, je ne pense pas qu'il existe de nombreux langages de programmation qui ne conviennent pas à la transformation de symboles. C est probablement l'un des pires langages de ce type utilisé aujourd'hui, mais les compilateurs C sont généralement auto-hébergés, de sorte que personne n'a jamais été arrêté.)
Une troisième raison pour laquelle je terminerai, par expérience personnelle, non mentionnée par Yegge (parce qu'il n'écrivait pas sur "pourquoi s'auto-héberger"): cela fait sortir les bugs. Lorsque vous écrivez un compilateur, cela signifie que chaque fois que vous le construisez (pas seulement chaque fois que vous l' exécutez ), vous dépendez de lui pour fonctionner et pour fonctionner correctement sur une base de code de taille décente (le compilateur lui-même).
Ce mois-ci, j'utilise un compilateur non auto-hébergé relativement nouveau et célèbre (vous pouvez probablement deviner lequel), et je ne peux pas passer 2 jours sans commettre de faute. Je me demande combien les concepteurs devaient réellement l'utiliser.