Dans les langages de programmation, les fermetures sont une fonctionnalité populaire et souvent souhaitée. Wikipédia dit (c'est moi qui souligne):
En informatique, une fermeture (...) est une fonction associée à un environnement de référence pour les variables non locales de cette fonction. Une fermeture permet à une fonction d'accéder à des variables en dehors de sa portée lexicale immédiate.
Une fermeture est donc essentiellement une valeur de fonction (anonyme?) Qui peut utiliser des variables en dehors de sa propre portée. D'après mon expérience, cela signifie qu'il peut accéder aux variables qui sont dans la portée à son point de définition.
Dans la pratique, le concept semble cependant divergent, du moins en dehors de la programmation fonctionnelle. Différentes langues implémentent des sémantiques différentes, il semble même y avoir des guerres d'opinions sur. De nombreux programmeurs ne semblent pas savoir ce que sont les fermetures, les considérant comme un peu plus que des fonctions anonymes.
En outre, il semble exister des obstacles majeurs lors de la mise en œuvre des fermetures. Plus notable, Java 7 était censé les inclure, mais la fonctionnalité a été repoussée à une future version.
Pourquoi les fermetures sont-elles si difficiles (à comprendre et) à réaliser? C'est une question trop large et trop vague, alors permettez-moi de me concentrer davantage sur ces questions interconnectées:
- Existe-t-il des problèmes d'expression des fermetures dans les formalismes sémantiques courants (petit pas, grand pas, ...)?
- Les systèmes de type existants ne conviennent-ils pas aux fermetures et ne peuvent-ils pas être étendus facilement?
- Est-il problématique d'aligner les fermetures sur une traduction de procédure traditionnelle basée sur la pile?
Notez que la question concerne principalement les langages procéduraux, orientés objet et de script en général. Pour autant que je sache, les langages fonctionnels n'ont aucun problème.