OCaml intègre depuis la 4.02.0 l'extension d'un type algébrique qui était déjà présente avec le type exception
notamment.
Maintenant, que le compilateur te signale que si tu changes un type algébrique, il faut changer tout le code qui en dépends est, selon mon expérience, un bienfait qu'une contrainte.
L'isolation d'extensions d'une AST (qui s'apparente forcément à des extensions du langage) en omettant arbitrairement ses dépendances (puisque tu parles d'isolation) permet juste de te tirer une balle dans le pied car tu casses la cohérence d'un pan de tes règles sémantiques dans ton langage. Et c'est pour cette raison qu'OCaml et Haskell auront toujours de l'avance dans ce domaine d'application par rapport à tout les autres langages - ils sont fait pour vérifier l'homogénéité de se qui reste être de la transformation d'un type à un autre et donc assure non seulement l'exhaustivité du traitement et la cohérence en interdisant le patch hack et l'ajout brutal d'informations sans prendre en compte l'ensemble.
Concernant la multitude de branchement conditionnel, si tu regardes bien le travaille qui a été fait sur le pattern matching et son optimisation et si tu regardes la sémantique du C++ et sa compilation, il est raisonnable de dire qu'OCaml ou Haskell (je ne sais pas trop ce dernier ne sachant pas comment il compile réellement le pattern matching) serait plus rapide sur ce point pour une seule raison, il n'est pas possible de faire du polymorphique ad-hoc (le simple fait que tu mettes les visiteurs en virtual
plombe la vitesse puisque la décision est calculé au runtime avec la vtable
, non plus par le compilateur) qui facilite le travail de décision du compilateur. En somme, il y aurait au temps de branchement conditionnel en C++ qu'en OCaml (dans le meilleur des cas), la seule différence c'est que l'un est déporter de manière implicite sur son modèle objet, tandis que l'autre est déporter de manière implicite sur son pattern-matching.
Enfin l'aspect objet et l'héritage dans ce genre de conception n'est pas un bienfait selon moi. Dans ce domaine, on assure que les éléments qui forment le langage sont définis de manière atomique et une extension de son comportement reviendrait souvent à être du sucre syntaxique si on parle de non-dépendance ou a une désambiguïsation des règles sémantiques qui nous amène souvent à re-atomiser l'élément en question (ce qui permet alors d'assurer l'application de manière exhaustive à nos nouvelles règles sémantique). Si on évite cette aspect là, on se retrouve alors avec un traitement in-décisionnel puisqu'il est humain d'oublier certains détails dans la conception - et c'est là où la contrainte qu'amène un compilateur comme celui d'OCaml devient intéressante.