Programmation intentionnelle - Intentional programming

Dans la programmation informatique , la programmation Intentional est un paradigme de programmation développé par Charles Simonyi qui code dans le logiciel code source Precise intention que les programmeurs (ou les utilisateurs) ont à l' esprit lors de la conception de leur travail. En utilisant le niveau d' abstraction approprié auquel le programmeur pense, la création et la maintenance de programmes informatiques deviennent plus faciles. En séparant les préoccupations concernant les intentions et la manière dont elles sont exploitées, le logiciel devient plus modulaire et permet un code logiciel plus réutilisable.

La programmation intentionnelle a été développée par l'ancien architecte en chef de Microsoft Charles Simonyi , qui a dirigé une équipe de Microsoft Research , qui a développé le paradigme et construit un environnement de développement intégré (IDE) appelé IP (pour Intentional Programming) qui a démontré le paradigme. Microsoft a décidé de ne pas produire le paradigme de la programmation intentionnelle, car au début des années 2000, Microsoft déployait C# et .NET pour contrer l'adoption de Java. Charles Simonyi a décidé, avec l'approbation de Microsoft, de retirer son idée de Microsoft et de la commercialiser lui-même. Il a fondé la société Intentional Software pour poursuivre cet objectif. Microsoft a concédé sous licence les brevets de programmation intentionnelle que Simonyi avait acquis chez Microsoft, mais aucun code source, à Intentional Software.

Un aperçu de la programmation intentionnelle telle qu'elle a été développée chez Microsoft Research est donné au chapitre 11 du livre Programmation générative : méthodes, outils et applications .

Cycle de développement

Comme envisagé par Simonyi, le développement d'une nouvelle application via le paradigme de la programmation intentionnelle se déroule comme suit. Un programmeur construit un environnement de type WYSIWYG prenant en charge le schéma et la notation des connaissances commerciales pour un domaine de problème donné (comme les applications de productivité ou l'assurance-vie). Les utilisateurs utilisent ensuite cet environnement pour capturer leurs intentions, qui sont enregistrées à un niveau d'abstraction élevé. L'environnement peut fonctionner sur ces intentions et aider l'utilisateur à créer des documents sémantiquement plus riches qui peuvent être traités et exécutés, à la manière d'un tableur . Les connaissances enregistrées sont exécutées par un évaluateur ou sont compilées pour générer le programme final. Les changements successifs sont effectués au niveau WYSIWYG uniquement. Contrairement aux traitements de texte, aux tableurs ou aux logiciels de présentation, un environnement intentionnel prend davantage en charge la structure et la sémantique des intentions à exprimer et peut créer des documents interactifs qui capturent plus richement ce que l'utilisateur essaie d'accomplir. Un cas particulier est lorsque le contenu est du code de programme et que l'environnement devient un IDE intelligent.

Séparation du stockage et de la présentation du code source

La clé des avantages de la programmation intentionnelle est que le code de domaine qui capture les intentions n'est pas stocké dans des fichiers texte de code source , mais dans un stockage arborescent (peut être binaire ou XML). L'intégration étroite de l'environnement avec le format de stockage apporte certaines des fonctionnalités les plus intéressantes de la normalisation de la base de données au code source . La redondance est éliminée en donnant à chaque définition une identité unique et en stockant le nom des variables et des opérateurs exactement à un seul endroit. Cela facilite la distinction intrinsèque des déclarations des références , et l'environnement peut les afficher différemment.

Les espaces blancs dans un programme ne sont pas non plus stockés dans le code source et chaque programmeur travaillant sur un projet peut choisir un affichage en retrait de la source. Des visualisations plus radicales incluent l'affichage de listes d'instructions sous forme de boîtes imbriquées, la modification d' expressions conditionnelles sous forme de portes logiques ou le réaffichage des noms en chinois.

Le système utilise un langage normalisé pour les langages populaires tels que C++ et Java , tout en permettant aux utilisateurs de l'environnement de les mélanger et de les assortir aux idées d' Eiffel et d'autres langages. Souvent mentionné dans le même contexte que la programmation orientée langage via des langages spécifiques à un domaine et la programmation orientée aspect , IP prétend apporter des percées dans la programmation générative . Ces techniques permettent aux développeurs d'étendre l'environnement du langage pour capturer des constructions spécifiques au domaine sans investir dans l'écriture d'un compilateur et d'un éditeur complets pour de nouveaux langages.

Exemple de programmation

Un programme Java qui écrit les nombres de 1 à 10, en utilisant une syntaxe d' accolades , pourrait ressembler à ceci :

 for (int i = 1; i <= 10; i++) {
    System.out.println("the number is " + i);
 }

Le code ci-dessus contient une construction commune à la plupart des langages de programmation , la boucle bornée, dans ce cas représentée par la forconstruction. Le code, une fois compilé, lié et exécuté, bouclera 10 fois, incrémentant la valeur de i à chaque fois après l'avoir imprimé.

Mais ce code ne capte pas les intentions du programmeur, à savoir "imprimer les nombres 1 à 10". Dans ce cas simple, un programmeur chargé de maintenir le code pourrait probablement comprendre ce qu'il est destiné à faire, mais ce n'est pas toujours si facile. Les boucles qui s'étendent sur de nombreuses lignes, ou pages, peuvent devenir très difficiles à comprendre, notamment si le programmeur d'origine utilise des étiquettes peu claires. Traditionnellement, la seule façon d'indiquer l'intention du code était d'ajouter des commentaires sur le code source , mais souvent les commentaires ne sont pas ajoutés, ou ne sont pas clairs, ou ne sont pas synchronisés avec le code source qu'ils ont décrit à l'origine.

Dans les systèmes de programmation intentionnelle, la boucle ci-dessus pourrait être représentée, à un certain niveau, comme quelque chose d'aussi évident que " print the numbers 1 to 10". Le système utiliserait ensuite les intentions pour générer du code source, probablement quelque chose de très similaire au code ci-dessus. La principale différence est que les systèmes de programmation intentionnelle maintiennent le niveau sémantique, qui fait défaut au code source, et qui peut considérablement faciliter la lisibilité dans les programmes plus volumineux.

Bien que la plupart des langages contiennent des mécanismes pour capturer certains types d' abstraction , IP, comme la famille de langages Lisp , permet l'ajout de mécanismes entièrement nouveaux. Ainsi, si un développeur commençait avec un langage comme C , il serait capable d'étendre le langage avec des fonctionnalités telles que celles du C++ sans attendre que les développeurs du compilateur les ajoutent. Par analogie, de nombreux mécanismes d'expression plus puissants pourraient être utilisés par les programmeurs que de simples classes et procédures .

Identité

IP se concentre sur le concept d' identité . Étant donné que la plupart des langages de programmation représentent le code source sous forme de texte brut , les objets sont définis par des noms et leur unicité doit être déduite par le compilateur . Par exemple, le même nom symbolique peut être utilisé pour nommer différentes variables, procédures ou même types. Dans un code qui s'étend sur plusieurs pages - ou, pour les noms globalement visibles, sur plusieurs fichiers - il peut devenir très difficile de dire quel symbole fait référence à quel objet réel. Si un nom est modifié, le code dans lequel il est utilisé doit être soigneusement examiné.

En revanche, dans un système IP, toutes les définitions attribuent non seulement des noms symboliques, mais également des identifiants privés uniques aux objets. Cela signifie que dans l'environnement de développement IP, chaque référence à une variable ou à une procédure n'est pas simplement un nom - c'est un lien vers l'entité d'origine.

L'avantage majeur de ceci est que si une entité est renommée, toutes les références à celle-ci dans le programme restent valides (on parle d' intégrité référentielle ). Cela signifie également que si le même nom est utilisé pour des définitions uniques dans différents espaces de noms (comme " .to_string()"), les références portant le même nom mais une identité différente ne seront pas renommées, comme cela arrive parfois avec la recherche/le remplacement dans les éditeurs actuels. Cette fonctionnalité permet également d'avoir facilement des versions multilingues du programme ; il peut avoir un ensemble de noms en anglais pour toutes les définitions ainsi qu'un ensemble de noms en japonais qui peuvent être échangés à volonté.

Le fait d'avoir une identité unique pour chaque objet défini dans le programme facilite également l'exécution de tâches de refactorisation automatisées , ainsi que la simplification des archivages de code dans les systèmes de gestion des versions . Par exemple, dans de nombreux systèmes de collaboration de code actuels (par exemple Git ), lorsque deux programmeurs valident des modifications qui entrent en conflit (c'est-à-dire si un programmeur renomme une fonction tandis qu'un autre modifie l'une des lignes de cette fonction), le système de gestion des versions pensera qu'un programmeur a créé une nouvelle fonction tandis qu'un autre modifiait une ancienne fonction. Dans un système de gestion de version IP, il saura qu'un programmeur a simplement changé un nom tandis qu'un autre a changé le code.

Niveaux de détail

Les systèmes IP offrent également plusieurs niveaux de détail, permettant au programmeur de "zoomer" ou de dézoomer. Dans l'exemple ci-dessus, le programmeur pourrait effectuer un zoom arrière pour obtenir un niveau qui dirait quelque chose comme :

<<print the numbers 1 to 10>>

Ainsi, les systèmes IP s'auto-documentent dans une large mesure, ce qui permet au programmeur de conserver une bonne image de haut niveau du programme dans son ensemble.

Ouvrages similaires

Il existe des projets qui exploitent des idées similaires pour créer du code avec un niveau d'abstraction plus élevé. Parmi eux se trouvent :

Voir également

Les références

Liens externes