Article de reference

Type de données abstrait

( Learn how and when to remove this message ) En informatique , un type abstrait de données ( TAD ) est un modèle mathématique de types de données , défini par son comportement ...

informatique , un type abstrait de données ( TAD ) est un modèle mathématique de types de données , défini par son comportement ( sémantique ) du point de vue de l' utilisateur , notamment en termes de valeurs possibles, d'opérations possibles sur les données de ce type et du comportement de ces opérations. Ce modèle mathématique contraste avec les structures de données , qui sont des représentations concrètes des données et représentent le point de vue de l'implémenteur, et non celui de l'utilisateur. Par exemple, une pile possède des opérations d'empilement et de dépilement qui suivent la règle du dernier entré, premier sorti (LIFO) et peut être implémentée concrètement à l'aide d'une liste chaînée ou d'un tableau. Un ensemble en est un autre exemple : il stocke des valeurs sans ordre particulier et sans doublons. Les valeurs elles-mêmes ne sont pas extraites des ensembles ; on teste plutôt l'appartenance d'une valeur à l'ensemble pour obtenir un booléen « appartient » ou « n'appartient pas ».

Les types abstraits de données (TAD) sont un concept théorique utilisé en sémantique formelle et en vérification de programmes , et, de façon moins stricte, dans la conception et l'analyse d' algorithmes , de structures de données et de systèmes logiciels . La plupart des langages informatiques courants ne permettent pas de spécifier formellement les TAD. Cependant, diverses fonctionnalités des langages de programmation correspondent à certains aspects de l'implémentation des TAD et sont souvent confondues avec les TAD eux-mêmes ; il s'agit notamment des types abstraits , des types de données opaques , des protocoles et de la conception par contrat . Par exemple, en programmation modulaire , le module déclare des procédures qui correspondent aux opérations du TAD, souvent accompagnées de commentaires décrivant les contraintes. Cette stratégie d'encapsulation permet de modifier l'implémentation du module sans perturber les programmes clients , mais le module ne définit un TAD qu'informellement. La notion de types abstraits de données est liée au concept d' abstraction des données , important en programmation orientée objet et dans les méthodologies de conception par contrat en génie logiciel .

Barbara Liskov et Stephen N. Zilles en 1974, dans le cadre du développement du langage CLU . La spécification algébrique était un sujet de recherche important en informatique autour de 1980 et était alors presque synonyme de types de données abstraits. Elle repose sur des fondements mathématiques en algèbre universelle .

Définition

Formellement, un type abstrait de données (TAD) est analogue à une structure algébrique en mathématiques , composée d'un domaine, d'un ensemble d'opérations et d'un ensemble de contraintes que ces opérations doivent satisfaire . Le domaine est souvent défini implicitement, par exemple comme l' objet libre sur l'ensemble des opérations du TAD. L' interface du TAD se réfère généralement uniquement au domaine et aux opérations, et éventuellement à certaines contraintes sur ces opérations, telles que les préconditions et les postconditions ; mais pas aux autres contraintes, comme les relations entre les opérations, qui relèvent du comportement. Il existe deux principaux styles de spécification formelle du comportement : la sémantique axiomatique et la sémantique opérationnelle .

Bien que n'appartenant pas à l'interface, les contraintes restent essentielles à la définition du type abstrait de données (TAD) ; par exemple, une pile et une file d'attente possèdent des interfaces d'ajout/suppression d'éléments similaires, mais ce sont les contraintes qui distinguent le comportement « dernier entré, premier sorti » du comportement « premier entré, premier sorti ». Les contraintes ne se limitent pas à des équations, des formules logiques .

sémantique axiomatique

Dans l'esprit de la programmation fonctionnelle , chaque état d'une structure de données abstraite est une entité ou une valeur distincte. Dans cette perspective, chaque opération est modélisée comme une fonction mathématique sans effet de bord . Les opérations modifiant la structure de données abstraite sont modélisées comme des fonctions prenant l'ancien état comme argument et renvoyant le nouvel état. L'ordre d'évaluation des opérations est sans importance ; une même opération appliquée aux mêmes arguments (y compris les mêmes états d'entrée) renverra toujours les mêmes résultats (et états de sortie). Les contraintes sont spécifiées sous forme d'axiomes ou de lois algébriques que les opérations doivent respecter.

Sémantique opérationnelle

Dans l'esprit de la programmation impérative , une structure de données abstraite est conçue comme une entité mutable ; autrement dit, le temps y est pris en compte et la structure peut se trouver dans différents états à différents moments. Les opérations modifient alors l'état de la structure au fil du temps ; par conséquent, l'ordre d'évaluation des opérations est important, et une même opération sur une même entité peut avoir des effets différents selon le moment où elle est exécutée. Ceci est analogue aux instructions d'un ordinateur ou aux commandes et procédures d'un langage impératif. Pour souligner cette conception, on parle généralement d' exécution ou d'application des opérations , plutôt que d'évaluation , à l'instar du style impératif souvent employé pour décrire les algorithmes abstraits. Les contraintes sont généralement spécifiées sous forme de texte.

Opérations auxiliaires

Les présentations des types abstraits de données (TAD) se limitent souvent aux opérations essentielles. Les présentations plus complètes précisent généralement les opérations auxiliaires sur les TAD, telles que :

  • fonction de hachage standard à partir de l'état de l'instance ;
  • l'analyse des algorithmes , et améliorer leur lisibilité.

Aliasage

Dans le style opérationnel, la gestion de plusieurs instances et l'impact potentiel de la modification d'une instance sur les autres restent souvent flous. Une pratique courante pour définir les types abstraits de données (TAD) consiste à décrire les opérations comme si une seule instance existait lors de l'exécution de l'algorithme, et que toutes les opérations s'appliquaient à cette instance. Par exemple, une pile peut avoir des opérations d'aliasing , stipulant que le résultat de les enregistrements abstraits , les opérations sur un champ F d'une variable d'enregistrement R impliquent clairement F , qui est distinct de R , mais en fait également partie . Un axiome d'aliasing partiel stipulerait que la modification d'un champ d'une variable d'enregistrement n'affecte aucun autre enregistrement.

Analyse de la complexité

Certains auteurs incluent également la complexité algorithmique (« coût ») de chaque opération, tant en termes de temps (pour les calculs) que d'espace (pour la représentation des valeurs), afin de faciliter l' analyse des algorithmes . Par exemple, on peut spécifier que chaque opération prend le même temps et que chaque valeur occupe le même espace, quel que soit l'état du type abstrait de données (TAD), ou encore que le TAD possède une « taille » et que les opérations sont linéaires, quadratiques, etc., par rapport à cette taille. Alexander Stepanov , concepteur de la bibliothèque standard de modèles ( STL) C++ , a inclus des garanties de complexité dans la spécification de la STL, en argumentant :

L'introduction de la notion de types de données abstraits visait à permettre l'interchangeabilité des modules logiciels. Or, l'interchangeabilité n'est possible que si les modules présentent un comportement de complexité similaire. Remplacer un module par un autre aux fonctionnalités identiques, mais avec des compromis de complexité différents, risque de décevoir l'utilisateur. Même en lui expliquant en détail l'abstraction des données, il refuserait d'utiliser le code. Les assertions de complexité doivent donc impérativement figurer dans l'interface.

— Alexandre Stepanov

D'autres auteurs ne partagent pas cet avis, arguant qu'un type abstrait de données (TAD) de type pile est identique, qu'il soit implémenté avec une liste chaînée ou un tableau, malgré la différence de coûts d'opération, et qu'une spécification de TAD devrait être indépendante de l'implémentation.

Exemples

Variable abstraite

Une variable abstraite peut être considérée comme le type abstrait de données non trivial le plus simple, avec la sémantique d'une variable impérative. Elle admet deux opérations : `x`

null est le neutre gauche et droit pour un arbreajouter(null,A) = A, ajouter(A,null) = A.
Les listes ajoutent que l'ajout est associatifajouter(ajouter(A,B),C) = ajouter(A,ajouter(B,C)).
Les sacs ajoutent de la commutativitéajouter(B,A) = ajouter(A,B).
Enfin, les ensembles sont également idempotents.ajouter(A,A) = A.

membre(X,single(Y)) = eq(X,Y)
membre(X,null) = faux
membre(X,ajouter(A,B)) = ou(membre(X,A), membre(X,B))