@Justice a raison. Pour développer cela un peu, en C la seule partie délicate est de distinguer les types des variables. Plus précisément quand vous voyez ceci:
T t;
Vous devez savoir que T
est un type pour que ce soit une analyse syntaxique juridique. C'est quelque chose que vous devez rechercher dans une table de symboles. Ceci est relativement simple à comprendre tant que les types sont ajoutés à la table de symboles pendant que l'analyse se poursuit. Vous n'avez pas besoin de faire beaucoup de travail supplémentaire dans le compilateur: soit T
soit présent dans la table ou ce n'est pas le cas.
En C++ choses sont beaucoup, beaucoup plus compliqué. Il y a énormément de constructions ambiguës ou potentiellement ambiguës. La plus évidente est celle-ci:
B::C (c);
Mis à part le fait que ce n'est pas clair si B
est un class
, un typedef
ou un namespace
, il est également pas clair si C
est un type et c
un objet de cette type, ou si C
est une fonction (ou un constructeur) prenant c
en tant qu'argument (ou même si C est un objet avec operator()
surchargé). Vous avez besoin de la table de symboles pour continuer l'analyse, bien qu'il soit toujours possible de continuer assez rapidement, car le type du symbole est dans la table des symboles.
Les choses deviennent beaucoup, beaucoup, beaucoup pires que lorsque les gabarits entrent dans le mixage. Si C (c)
est dans un modèle, il est possible que vous ne connaissiez pas la définition réelle du modèle, si C est un type ou une fonction/un objet.En effet, le modèle peut déclarer C
être soit un type, soit une variable. Cela signifie que vous avez besoin de la table de symboles, mais vous n'avez pas de et vous ne pouvez pas en avoir une jusqu'à ce que le modèle soit déclaré. Pire encore, il n'est pas forcément suffisant d'avoir seulement le type du symbole: vous pouvez trouver des situations qui requièrent l'information complète du type représenté par le symbole, y compris la taille, l'alignement et d'autres informations spécifiques à la machine.
Tout cela a plusieurs effets pratiques. Les deux plus importants que je dirais sont:
- La compilation est beaucoup plus rapide. Je suppose que Go est plus rapide à compiler que C, et C++ a des temps de compilation très lents pour les situations impliquant beaucoup de modèles.
- Vous pouvez écrire des analyseurs qui ne dépendent pas d'un compilateur complet. C'est très utile pour faire de l'analyse de code et pour refactoriser.
C'est une excellente référence. –
Honnêtement, c'était juste le premier (ou deuxième) résultat de Google – hasen
Notez également les réponses à ce poste - elles aussi contiennent de très bonnes raisons pour lesquelles c'est impossible. – MSalters