Les flots de données sont la réponse d'Ada 95 à un problème quasi-insoluble en Ada 83: la manipulation de fichiers de données hétérogènes (contenant des valeurs de types différents).
Un flot de données est un type descendant du type (étiqueté)
Root_Stream_Type défini dans le paquetage Ada.Streams.
Conceptuellement, c'est une suite d'octets, muni de procédures Read
et Write permettant de lire et d'écrire dans le
flot des tableaux d'octets (appartenant au type Stream_Element_Array,
défini dans le même paquetage). Physiquement, un flot peut être
une structure de donnée en mémoire, un fichier, une interface réseau...
Ada fournit une implémentation des flots de données dans un
fichier binaire (paquetage Ada.Streams.Stream_IO),
ainsi qu'une implémentation dans un fichier texte (paquetage Ada.Text_IO.Text_Streams).
Evidemment, écrire des tableaux d'octets dans un fichier n'est
pas passionnant... Le grand intérêt des flots de données vient
du fait que le langage fournit automatiquement (sous forme d'attributs)
des procédures (T'Read et T'Write)
permettant de lire et d'écrire tout type de donnée (non limité)
depuis ou vers un flot de données. Par exemple:
with Ada.Streams.Stream_IO; use Ada.Streams.Stream_IO; procedure Essai is F : File_Type; V1 : Integer; V2 : Float; begin Open (F, ....); -- On écrit les données Integer'Write (Stream(F), V1); Float'Write (Stream(F), V2); -- On les relit Reset (F); Integer'Read (Stream(F), V1); Float'Read (Stream(F), V2); end Essai;
Les T'Read et T'Write prédéfinis
peuvent être redéfinis par l'utilisateur (et même fournis pour
des types limités) s'il souhaite une représentation externe
différente:
type T is...;
procedure My_Read
(Stream : access Ada.Streams.Root_Stream_Type'Class;
Item : in T) is ...
for T'Read use My_Read;
Ainsi, on peut définir un format externe portable pour des machines d'architecture différente. Et comme c'est une clause de représentation, elle est liée au type et fonctionnera aussi bien pour des tableaux de T, des articles contenant des T, etc.
En plus de ces attributs de base, il existe des attributs T'Input
et T'Output qui stockent automatiquement l'information
sur les bornes des tableaux et sur les discriminants, ainsi que T'Class'Input
et T'Class'Output qui conservent l'étiquette d'un
type étiqueté.
En résumé, le flots permettent de passer de façon sûre et portable d'une vue abstraite d'un type de donnée vers un simple ensemble d'octets, que l'on peut stocker dans un fichier, envoyer sur un réseau, etc. Et comme le contenu physique est un ensemble d'octets, mais que les fonctionnalités des flots permettent de les convertir depuis/vers n'importe quel type, cela permet de créer des fichiers de données hétérogènes sans perdre les avantages du typage fort.
Copyright © 1997 Adalog / J-P. Rosen