Programmation par intention
Projet:Traduction/Programmation par intention Dans la programmation informatique, la programmation par intention (PPI, en anglais intentional programming, IP) est un paradigme de programmation qui permet au code source du logiciel de refléter précisément l'information, ou intention de ce que le développeur voulait réaliser lors de la conception. En respectant le niveau d'abstraction de la pensée du programmeur, la revue et la maintenance des programmes informatiques devient plus facile.
Le concept a été introduit depuis longtemps par Charles Simonyi employé alors par Microsoft, alors qu'il dirigeait une équipe au sein de la Recherche Microsoft. Son groupe a développé un environnement de développement intégré nommé IP qui démontre ce concept. Pour des raisons encore obscures[1], Microsoft a interrompu le développement sur IP au début des années 2000.
Une présentation de la programmation par intention est disponible dans le chapitre 11 du livre [2]
Cycle de développement
Comme envisagé par Simonyi, développer une nouvelle application par l'intermédiaire du paradigme de programmation par intention procède comme suit. Un programmeur crée d'abord une boîte à outils spécifique au domaine du problème donné (par exemple l'assurance-vie). Les experts du domaine, aidés par le programmeur, décrivent alors le comportement prévu de l'application selon la manière « ce que vous voyez est ce que vous obtenez » (en anglais: WYSIWYG). En conclusion, un système automatisé utilise la description de programme et la boîte à outils pour générer le programme final. Des changements successifs sont faits seulement au niveau du « tel affichage, tel résultat » (WYSIWYG), utilisant un système appelé l'"atelier de domaine" (en anglais: domain workbench).[3]
Séparation stockage et présentation du code source
L'avantage principal de la PPI (et un obstacle probable à son acceptation par les communautés de programmeurs) est que le code source n'est pas stocké dans des fichiers textes, mais dans un fichier binaire propriétaire qui ressemble au XML.. Comme avec XML, il n'y a aucun besoin d'un analyseur syntaxique spécifique pour chaque morceau de code qui devrait travailler l'information qui forme le programme, abaissant ainsi la barrière à l'analyse d'écriture ou à la restructuration des outils. La vidéo démontre comment le système manipule les langages qui utilisent un préprocesseur basé sur le texte en examinant les utilisations spécifiques des macros dans un corps de code pour inventer une abstraction plus hygiénique.
L'intégration serrée de l'éditeur avec le format binaire apporte certaines des fonctionnalités plus jolies de normalisation de 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 dans un emplacement précisément unique. Ceci signifie qu'il est également plus facile de distinguer intrinsèquement entre les déclarations et les références, alors l'environnement montre des déclarations de type en caractères gras. L'espace n'est pas également stocké en tant qu'élément du code source et chaque programmeur travaillant sur un projet peut choisir un affichage d'indentation du source comme ils préfèrent. Des visualisations plus radicales incluent l'affichage des listes de déclarations en tant que boîtes à sous-programmes imbriqués, en éditant les expressions conditionnelles comme des portes logiques ou le re-rendu des noms en Chinois.
Le projet semble normaliser un genre de schéma de XML pour des langages populaires comme C++ et Java, tout en laissant aux utilisateurs le mélange de l'environnement et la mise en relation de cela avec les idées d'Eiffel et d'autres langages. Souvent mentionné dans le même contexte que la programmation orientée langage par l'intermédiaire des langages dédiés et la programmation orientée aspect, la PPI prétend fournir quelques percées dans la programmation générative. Ces techniques permettent à des développeurs d'étendre l'environnement de langage pour capturer les constructions spécifiques au domaine sans investir dans l'écriture d'un compilateur complet et d'un éditeur pour n'importe quel nouveau langage.
Exemple
Un programme en Java lequel écris les nombres de 1 à 10, en utilisant une syntaxe à parenthèses de programmation, peut être comme celle-ci:
for (int i = 1; i <= 10; i++)
{
System.out.println("the number is " + i);
}
Le code ci-dessus contient une construction commune de la plupart des langages informatiques, la boucle de départ, dans ce cas représenté par la construction for
. Le code, lorsqu'il est compilé, lié et exécuté, en boucle 10 fois, augmentant la valeur de i chaque fois qu'il a été imprimé.
Cependant ce code ne pas saisir les intentions du programmeur, à savoir "imprimer les numéros de 1 à 10". Dans ce cas simple, un programmeur requis pour maintenir le code pourrait probablement savoir ce qu'il est destiné à faire, mais il n'est pas toujours si facile. Les boucles qui s'étendent sur de nombreuses lignes, ou des pages, peuvent devenir très difficile à comprendre, notamment si le programmeur n'utilise pas des étiquettes claires. Traditionnellement, la seule façon d'indiquer l'intention du code est d'ajouter des commentaires au code source, mais souvent les commentaires ne sont pas ajoutés, ou ne sont pas clairs, ou il y a un écart de synchronisation avec le code source qui décrit initialement.
Dans les systèmes de programmation intentionnelle la boucle au-dessus peut être représentée, à un certain niveau, comme quelque chose d'aussi évident que "imprimer les numéros de 1 à 10
". Le système devrait alors utiliser les intentions de générer du code source, probablement quelque chose de très similaire au code ci-dessus. La principale différence est que le fait que les systèmes de programmation intentionnelle maintiennent le niveau sémantique, dont le code source manque, et qui peuvent considérablement faciliter la lisibilité dans des programmes plus longs.
Bien que la plupart des langues contiennent des mécanismes pour la capture de certains types d'abstraction, la PPI, comme la famille de langues LISP, permet l'ajout de mécanismes entièrement nouveaux. Ainsi, si un développeur a commencé avec un langage comme le [C|C (langage)], ils seraient en mesure d'étendre le langage avec des fonctionnalités comme celles en C++ sans attendre les développeurs de compilateur pour l'ajouter eux-mêmes. Par analogie, de beaucoup plus puissants mécanismes d'expression pourraient être utilisés par les programmeurs que de simples classes et procédures.
Identité
La PPI se concentre sur le concept d'identité. Comme la plupart des langages de programmation représentent le code source au format texte, les objets sont définis par nom et leur caractère unique qui doit être déduit par le compilateur. Par exemple, le même nom symbolique pourrait être utilisé pour différents nom de variables, de procédures ou encore de types. Dans le code qui s'étend sur plusieurs pages - ou, pour les noms globalement visibles, les fichiers multiples - il peut devenir très difficile de dire quel symbole se réfère à l'objet actuel. Si un nom est modifié, le code où il est utilisé doit être soigneusement examiné.
En revanche, dans un système de PPI, toutes les définitions pas seulement l'attribution des noms symboliques mais également l'identification privé unique pour les objets. Cela signifie que, dans le développement de la PPI, chaque fois que vous vous référez à une variable ou une procédure, qui n'est pas juste un nom - il y a un lien vers l'entité originale.
Le principal avantage de cette situation est que si vous renommez une entité, toutes les références qui y sont faites dans votre programme sont changées automatiquement. Cela signifie aussi que si vous utilisez le même nom pour des définitions uniques dans les différents espaces de noms (tel que ".to_string()
"), vous ne pourrez renommer les mauvaises références comme c'est parfois le cas avec la fonctionnalité de recherche/remplacement dans les éditeurs courants. Cette fonctionnalité le rend également facile d'avoir des versions multi-langages de votre programme. Vous pouvez avoir un ensemble de noms anglais pour tous vos définitions ainsi qu'une série de noms japonais qui peuvent être inversés en à volonté.
Avoir une identité unique pour chaque objet défini dans le programme, c'est également faciliter les tâches de réusinage automatisées, ainsi que la simplification de l'enregistrement du code dans les systèmes de contrôle de version. Par exemple, dans de nombreux systèmes actuels de collaboration de codage (par exemple CVS), lorsque deux programmeurs valident une modification qui est en conflit (par exemple: si un programmeur renomme une fonction et un autre un modifie des lignes de cette fonction), le système de versions pensera qu'un programmeur créé une nouvelle fonction fonction pendant qu'un autre modifie une ancienne fonction. Dans un système de version de PPI, il saura qu'un programmeur a simplement changé un nom tandis qu'un autre a changé le code.
Niveau des détails
Les systèmes de PPI offrent également plusieurs niveaux de détails, ce qui permet au programmeur de «zoomer» ou «dézoomer». Dans l'exemple ci-dessous, le programmeur peut effectuer un zoom arrière pour obtenir un niveau lequel dirait quelque chose comme:
<<print the numbers 1 to 10>>
Ainsi les systèmes de PPI sont de l'auto-documentation dans une large mesure, ce qui permet au programmeur de garder un bon niveau élevé de vue de l'ensemble dans son programme.
Travaux similaires
traduction à faire
Voir aussi
traduction à faire
Références
- ↑ "Simonyi a eu envie de prendre son idée hors du laboratoire et pour la mettre devant les clients mais c'était maladroit dans ces circonstances. Il explique, 'il était peu réaliste, quand Microsoft faisait des pas énormes avec .Net à court terme, d'envoyer d'une façon ou d'autre quelqu'un depuis de la même organisation qui indique, ceci n'est pas comment vous devriez faire les choses -- ce qui si vous faisiez des choses dans cet autre manière plus pertubatrice?'"[1] (citation de "Partie II : Quelque chose que vous pouvez faire, je peux le faire Méta: touriste de l'espace et programmeur milliardaire Charles Simonyi a conçu Microsoft Office. Maintenant il veut reprogrammer le logiciel."], Mardi 9 janvier 2007, Scott Rosenberg, Revue de Technologie de l'institut de technologie du Massachusetts (MIT).)
- ↑ "Generative Programming: Methods, Tools, and Applications", de Krzysztof Czarnecki et Ulrich Eisenecker, Addison-Wesley, Reading, MA, USA, Juin 2000
- ↑ Scott Rosenberg: "Anything You Can Do, I Can Do Meta." Revue de Technologie de l'institut de technologie du Massachusetts (MIT), 8 janvier 2007
Liens externes
- Intentional Software - La société de Charles Simonyi.
traduction à faire