Les flots de données (streams).


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