Programmation déclarative – Stratégies de résolution de problèmes logiciels

De nombreux fabricants de logiciels et de matériel se vantent du rythme exponentiel du changement technologique, mais pour les utilisateurs et les consommateurs de leurs produits et services, l'obsolescence technologique rapide signifie souvent une augmentation des coûts, des frustrations et des promesses non tenues. Corporate America prévoit de faire des investissements en capital dans des biens et des installations qui devraient prendre cinq, dix, voire vingt ans, mais seulement une durée de vie de dix-huit mois pour les investissements en logiciels et en matériel n'est pas rare.

Réduire les coûts de développement de nouvelles solutions logicielles ou prolonger la durée de vie des applications logicielles sont deux approches complémentaires pour faire face aux changements technologiques. Ces objectifs peuvent souvent être atteints en adoptant une stratégie déclarative lors de la conception de systèmes logiciels indépendants de la méthodologie de programmation utilisée.

Problèmes avec la programmation impérative

La plupart des projets de programmation utilisent aujourd'hui le style de programmation impératif. Les développeurs écrivent des séquences d'opérations dans un langage, tel que C ++, Java, Visual Basic, etc., qui implémentent un algorithme ou une recette pour effectuer des tâches. L'algorithme de tâche construit des instructions logiques ou relationnelles sur la tâche à résoudre et contrôle les instructions sur la façon de calculer la solution. Les instructions logiques décrivent le "quoi faire" calculé tandis que les instructions de contrôle décrivent le "quoi faire" calculé. Le débogage de l'algorithme consiste à vérifier la précision des instructions logiques et à ajuster les instructions de contrôle, si nécessaire.

L'approche impérative pose de nombreux problèmes. La séquence d'opérations détermine de manière critique l'exactitude de l'algorithme. Des séquences d'exécution inattendues via un algorithme provoquées par des actions d'entrée utilisateur ou des événements en temps réel dans un environnement multitâche peuvent entraîner une défaillance de l'algorithme délicate ou catastrophique. L'écriture de la logique de commande est la responsabilité du programmeur et, par conséquent, est sujette à des erreurs de mise en œuvre. La compréhension de l'algorithme d'un programme est souvent difficile pour les autres développeurs sans métadonnées ou commentaires détaillés sur le code et le suivi empirique de l'exécution du programme avec des données exemplaires. L'exactitude du programme consomme une partie importante de l'effort de développement, mais elle ne parvient généralement pas à détecter un nombre important de défauts.

Pour répondre aux problèmes liés à la programmation impérative, l'industrie informatique a développé et protégé de nombreuses approches. La programmation structurée et les campagnes contre les déclarations «go in» résolvent certains des problèmes découverts avec les structures et déclarations de contrôle ad hoc. Les initiatives de modulation mettent l'accent sur les techniques de décomposition en partant du principe que les gens peuvent mieux comprendre, raisonner et conserver de plus petits morceaux de code. La programmation orientée objet protège les versions de programme à l'aide de composants, de bibliothèques et de cadres réutilisables. L'école de programmation de modèles met l'accent sur les analogies avec d'autres domaines, tels que l'architecture, la création de programmes utilisant des solutions ou des modèles bien conçus et bien conçus, qui sont reproduits dans de nombreux contextes de programmation.

Le semis est une programmation déclarative?

La programmation déclarative sépare la logique, ou quoi, d'un algorithme du contrôle, ou comment, d'un algorithme. Le programmeur spécifie toujours la logique ou les équations qui spécifient la relation de problème, mais le système de programmation est responsable du contrôle ou de la façon dont la logique est évaluée. Les exemples les plus courants sont les feuilles de calcul et les langages de requête pour les bases de données relationnelles. L'utilisateur ou le programmeur spécifie une connexion mathématique en tant que requête, par exemple en SQL, pour qu'elle puisse être récupérée, tandis que le moteur de base de données détermine comment exécuter la requête sur la base de données.

La programmation déclarative présente de nombreux avantages par rapport au style impératif. Dans les langages déclaratifs, les programmeurs ne spécifient pas les séquences d'opérations, mais uniquement les définitions ou équations qui spécifient les relations. Contrairement à la programmation impérative, les relations logiques dans la programmation déclarative sont des ordres d'exécution indépendants sans effets secondaires d'évaluation et d'inspection visuelle sémantique.

La famille déclarative des langages de programmation a une longue histoire dans la communauté universitaire en informatique et dans les domaines spécialisés d'application commerciale, tels que la construction de compilateurs, les systèmes experts et les bases de données. Les langages déclaratifs ont deux arbres généalogiques principaux. Les langages déclaratifs logiques, tels que le Prologue, sont basés sur le calcul de prédicats de premier ordre, qui généralisent les notions de valeurs vraies ou fausses d'Aristote dans des déclarations ou des dénonciations, qui incluent les relations entre chaque entité. L'autre branche de la famille se compose de langages déclaratifs fonctionnels, tels que Miranda, Haskell et SML. Les langages déclaratifs fonctionnels sont basés sur le calcul l développé par le mathématicien Alonzo Church dans les années 1930. Le calcul L formalise les notions d'application récursive de fonctions pures à des problèmes de calcul. Bien qu'il ne soit pas largement reconnu comme tel, le dernier mode de programmation, XSLT, un langage de style étendu pour convertir XML, est également un langage fonctionnel déclaratif.

Malgré les avantages théoriques des langages de programmation déclaratifs, ils ne sont pas largement utilisés dans la pratique de la programmation commerciale, malgré une tentative de Borland dans les années 1980 de commercialiser en masse une version PC de Prolog avec le très populaire Turbo Pascal. De nombreux facteurs contribuent à l'utilisation rare des langages déclaratifs. Un contributeur majeur est le manque de formation d'égal à égal en langage déclaratif, mais la syntaxe désagréable de certains langages, le compilateur et le temps d'exécution inefficaces, et les domaines d'application limités des mécanismes généraux "as-to" sont des contributeurs.

Utilisation de stratégies déclaratives dans les programmes de négociation

Bien que les langages de programmation déclaratifs n'aient pas reçu une utilisation commerciale répandue, une stratégie de partage logique ou quoi, hors de contrôle, ou comment, dans un algorithme est une technique puissante, généralisée pour augmenter la facilité d'utilisation et prolonger la durée de vie utile de logiciel. Les techniques statutaires sont particulièrement puissantes dans les interfaces utilisateur et les interfaces de programmation d'applications (API) qui ont un ensemble riche et complexe d'entrées sur une gamme relativement petite de comportements d'exécution.

DriverLINX et ExceLINX sont deux exemples de logiciels commerciaux qui illustrent l'applicabilité des techniques déclaratives dans le domaine de l'acquisition de données et du contrôle des instruments de test.

Utilisation d'instructions d'acquisition de données

DriverLINX est une API de contrôle de dispositif d'acquisition de données utilisée pour mesurer et générer des signaux analogiques et numériques interférant avec tous les types d'émetteurs externes. Les applications pour l'acquisition de données comprennent la recherche en laboratoire, les instruments médicaux et le contrôle des processus industriels.

Traditionnellement, les API d'acquisition de données modélisaient les caractéristiques de conception matérielle et possédaient un grand nombre de fonctions d'un ou plusieurs paramètres pour configurer l'appareil et contrôler le flux de données à travers le système. L'ordre des séquences d'opérations était souvent important pour une programmation et un contrôle précis de l'appareil. La mise à jour du nouveau dispositif d'acquisition de données était souvent coûteuse, car le matériel nécessitait des modifications de la séquence des séquences d'opérations pour programmer les modifications logicielles coûteuses nécessaires.

Pour surmonter ces problèmes, DriverLINX adopte une approche abstraite et déclarative de la programmation d'acquisition de données. Au lieu de modéliser des modèles spécifiques aux cartes, DriverLINX résume les sous-systèmes de dispositifs fonctionnels pour l'acquisition de données en attributs et capacités généralisés. Les programmes nécessitent la tâche de mesure qu'ils souhaitent effectuer en paramétrant une instruction "demande de service". Le temps d'exécution DriverLINX détermine la manière de traiter la demande de service à l'aide de l'appareil disponible et renvoie les mesures sous forme de courant programmé. Le programmeur d'acquisition de données est dégagé de toute responsabilité quant au contrôle de l'algorithme d'acquisition de données.

En plus de faciliter la responsabilité du programmeur du contrôleur, l'approche déclarative abstraite de DriverLINX donne au programme un échange syntaxique et sémantique lors de la migration vers des produits matériels équivalents. L'approche abstraite et déclarative permet également d'isoler le fournisseur de logiciels de l'obsolescence technologique du changement dans l'industrie informatique en se concentrant sur la logique immuable des relations d'acquisition de données à mesure que les mécanismes de contrôle changent avec les développements logiciels. DriverLINX est une approche viable de la programmation d'acquisition de données depuis plus de 12 ans malgré l'évolution du marché de Windows 16 bits vers NET aujourd'hui.

Utilisation des déclarations d'instruments de test

Les instruments de test, tels que les voltmètres et les électromètres numériques, sont passés de simples appareils dotés d'un commutateur et d'un écran d'affichage sur le panneau avant à des processeurs de mesure sophistiqués qui exécutent des dizaines de fonctions de mesure et de contrôle. Comme les appareils d'acquisition de données, les développeurs envoient généralement une séquence de commandes soigneusement ordonnées à un instrument pour définir la mesure, puis envoient des séquences de commandes supplémentaires pour contrôler le flux de données de mesure de l'instrument. Les problèmes susmentionnés pour les développeurs utilisant des approches de contrôle d'instruments indispensables limitent considérablement la facilité d'utilisation et entravent les solutions d'instrumentation rapides pour les besoins de mesure à court terme.

ExceLINX est un complément Microsoft Excel qui permet de spécifier rapidement les configurations de test d'instruments à l'aide de formulaires de feuille de calcul. Les utilisateurs spécifient ou déclarent des canaux, des configurations, des taux d'échantillonnage, des déclencheurs et des emplacements de données pour les mesures qu'ils souhaitent effectuer en remplissant une feuille de calcul Excel. Lorsque l'utilisateur sélectionne le bouton "démarrer" dans la barre d'outils, ExceLINX traduit les spécifications dans la séquence de commandes correcte pour l'instrument cible, démarre la mesure et renvoie les données vers la feuille de calcul requise. Les utilisateurs peuvent configurer et collecter eux-mêmes des mesures en quelques minutes en utilisant des spécifications logiques, par opposition à des jours ou des semaines en utilisant le temps du programmeur pour les spécifications nécessaires.

En interne, ExceLINX utilise également une approche déclarative pour résoudre le problème complexe de validation de champ pour les formulaires de feuille de calcul. Les instruments ont des centaines de paramètres avec un chevauchement complexe entre les paramètres. Pour valider si l'instrument prend en charge le jeu de paramètres défini par l'utilisateur, ExceLINX contient un arbre de dépendance de paramètres autorisé, autorisé et inutilisé pour chaque cellule d'entrée de la feuille de calcul. Chaque nœud de l'arborescence maintient également une relation logique entre l'ensemble de paramètres sélectionné qu'ExceLINX évalue en temps opportun pour transmettre la validité des choix d'entrée utilisateur. L'instrument de modèle Modeldo pris en charge a des sémantiques de paramètres différentes, mais ExceLINX peut facilement gérer cette complexité en changeant d'arborescence de modèle car la logique spécifique du modèle dans l'arborescence de validation est distincte de l'implémentation du contrôle partagé dans le code ExceLINX.

Les stratégies de programmation déclarative qui séparent la logique du contrôle en algorithmes sont des techniques puissantes qui peuvent être utilisées avec les langages impératifs d'aujourd'hui. Ces techniques peuvent rendre les logiciels plus échangeables, maintenables, utilisables et durables.

Copyright Roy Furman, M.D., Ph.D. 2005