Oui et ? GHC est un projet énorme, qui effectivement atteint les frontières de ce qu'il est possible de gérer avec darcs... Mais les problèmes fondamentaux de darcs sont de nature algorithmique ! Paresseux ou strict, un langage ne transforme pas magiquement un algorithme à complexité exponentielle en algorithme rapide...
Par ailleurs Darcs lui même est assez gros et a été l'un des pionniers des DVCS, il a ouvert une bonne partie de la route au concept, maintenant repris par des outils populaires comme git. Il continue à être utilisé pour pas mal de projets.
Il me semble que contrairement à ce que tu dis, Darcs est plutôt une preuve de l'efficacité d'Haskell pour des projets de taille réelle (surtout si l'on considère que par rapport à d'autres projets similaires, il n'a jamais attiré une foule de développeurs pour ses entrailles).
Là, je ne vois pas l'argument... GHC est lent à compiler, oui, difficile ? Pas tellement ! (tant que vous n'essayez pas de compiler le HEAD actuel : Changement de VCS, de système de build, de système d'exceptions... ça fait beaucoup en même temps)
Et une fois compilé, GHC lui-même est un compilateur pas si lent si l'on considère la quantité d'optimisations qu'il doit effectuer pour obtenir les excellentes performances qu'il obtient (il y a bien pire, GHC est parfaitement utilisable, même pour développer un gros projet, la compilation séparée marche très bien).
Il faut voir aussi que GHC est un très gros projet, avec des centaines de milliers de lignes de codes.
Les supporters informés de l'évaluation paresseuse n'ont jamais prétendu qu'elle permettait d'écrire des programmes plus rapides parce qu'elle évitait les calculs inutiles... Comme tu le dis, dans un style strict, le programmeur évite généralement de faire des choses inutiles. Mais pour cela, il doit souvent introduire de la complexité dans son algorithme, voire en changer complètement parce qu'il n'arrive pas à ne calculer que le nécessaire... En bref, le vrai argument en faveur de l'évaluation paresseuse c'est qu'en général elle permet d'exprimer plus simplement les algorithmes (et c'est un avantage parce que ça réduit le nombre d'erreurs potentielles) et permet plus de modularité, de flexibilité en fournissant des interfaces uniques qui peuvent servir à de multiples usages, là où un langage strict aurait obligé pour des raisons de performances à fournir plusieurs interfaces différentes dépendant plus directement du code l'utilisant.La paresse, c'est très bien, mais en général, un bon programmeur ne fait jamais calculer une chose par la machine si cette chose n'est jamais utilisée. Dans ce contexte-là, écrire dans un langage paresseux n'apporte strictement rien. De même pour les dead-code elemination et les super algorithmes de propagation de constante de GCC qui alourdissent énormément le compilateur.
--
Jedaï
Partager