Je lisais le livre "Programmation fonctionnelle pour le monde réel". Cela a commencé par une comparaison entre les langages de programmation impératifs et fonctionnels. Et il a expliqué en quoi les «valeurs» et les «expressions» dans la programmation fonctionnelle sont différentes des «variables» et des «fonctions» de la programmation impérative. À partir de la discussion, j'ai en quelque sorte développé une idée qui -
Les langages de programmation fonctionnels ont plus de possibilités de faire l'optimisation du temps de compilation que leurs homologues impératifs.
Est-ce vrai?
Le fait qu'il existe en principe plus de possibilités d'optimisation du temps de compilation pour les langages fonctionnels que pour leurs homologues impératifs est probablement vrai.
Plus intéressant cependant, s'ils sont réellement implémentés dans les compilateurs actuels et dans quelle mesure ces optimisations sont pertinentes dans la pratique (c'est-à-dire les performances finales du code idiomatique de la `` vraie vie '') dans un environnement de production, avec des paramètres de compilation a priori prévisibles).
Par exemple, les soumissions de Haskell pour le tristement célèbre Computer Language Benchmarks Game (aussi mauvais soit-il - mais ce n'est pas comme si il y avait - pour le moment - quoi que ce soit de bien mieux là-bas) donnent l'impression qu'un temps considérable a été consacré à Les optimisations manuelles, confrontées à l'affirmation concernant les "optimisations possibles du compilateur en raison de
insert some property about FP languages here
" laissent penser que les optimisations sont (actuellement au moins) plus une possibilité théorique qu'une réalité pertinente.Je serais cependant heureux de me tromper sur ce point.
la source
Dans un style fonctionnel, le flux de valeurs à travers un programme est très, très visible (à la fois pour le compilateur et le programmeur). Cela donne au compilateur une grande latitude pour décider où stocker les valeurs, combien de temps pour les conserver, etc.
Dans un langage impératif, le compilateur promet au programmeur un modèle où la plupart des variables correspondent à des emplacements réels en mémoire qui restent autour pendant une durée de vie définie. Potentiellement, n'importe quelle instruction peut lire (ou écrire dans!) N'importe lequel de ces emplacements, de sorte que le compilateur ne peut remplacer les emplacements de mémoire par l'allocation de registres, fusionner deux variables en un seul emplacement de stockage ou effectuer des optimisations similaires après avoir effectué une analyse minutieuse de l'endroit où sinon dans le programme, cette variable peut être référencée.
Maintenant, il y a deux mises en garde:
Mais pour répondre à la question générale, oui, un paradigme fonctionnel donne au compilateur beaucoup de liberté pour l'optimiser qu'il n'a pas dans un cadre impératif.
la source
main
êtes une fonction de transformation d'état plutôt que quelque chose qui utilise l'état lui-même.