SAS, l'envers du décor

Comment travaille SAS en arrière-plan lors de l'exécution d'un programme

Nous avons évoqué lors d'un précèdent article l'étape DATA. Nous allons ici nous en servir pour étudier ce qui se passe concrètement lors de l'exécution.
Nous évoquerons à plusieurs reprises la phase de compilation or il faut savoir que le code SAS est retranscrit en C, ce terme est donc quelque peu erroné. Nous l'emploierons tout de même, notre propos étant de nous focaliser sur l'action de SAS. Il conviendra néanmoins de garder ceci à l'esprit.

Une action en 3 phases

Lorsque nous demandons à SAS d'exécuter un programme, une étape DATA par exemple, 3 phases vont se succéder :
- une première phase de pré-compilation pendant laquelle SAS va analyser la syntaxe du code,
- une phase de compilation pendant laquelle un buffer nommé PDV (Program Data Vector) est initialisé, cette phase gère l'aspect structurel du programme,
- enfin une dernière phase d'exécution qui va gérer cette fois les données.

Programme de travail

Nous allons illustrer nos propos à l'aide d'une étape DATA très simple qui va se contenter de filtrer la table standard CARS (librairie SASHELP) via une instruction WHERE, ne retenir que quelques variables et en ajouter une nouvelle, le revendeur.
Le tout sera redirigé vers une nouvelle table MYCARS :


data mycars;
  set sashelp.cars;
  keep Make Model Type Cylinders Horsepower Seller;
  Seller = 'Auto PARIS';
  where (type='Sedan' or type='Sports') and horsepower between 350 and 400;
run;

Compilation

Nous n'évoquerons pas la phase de pré-compilation dans la mesure où il s'agit avant tout d'un contrôle syntaxique. Nous passons donc directement à la phase de compilation.
La phase de compilation ne va être réalisée qu'une seule fois. Dans le cadre de l'exécution de notre étape DATA, la phase de compilation va créer un buffer mémoire, nommé Program Data Vector (PDV) afin d'y stocker toutes les variables rencontrées.
Les variables traitées sont aussi bien les variables héritées de la table d'origine que les nouvelles variables explicitement déclarées dans l'étape DATA. Toutes les variables ajoutées au PDV le sont avec leurs attributs (type, nom, longueur, etc ...).
Enfin il faut savoir que le PDV va constituer, en fin de phase, le bloc descripteur de la table nouvellement créée.

Déroulé ligne a ligne de la phase de compilation :


data mycars;

SAS va venir initialiser un espace mémoire dans la bibliothèque temporaire de travail WORK afin d'y créer la nouvelle table WORK.MYCARS


set sashelp.cars;

SAS va rencontrer ici l'instruction SET et donc ses premières variables. SAS va lire le bloc descripteur de la table SASHELP.CARS, en reprendre toutes les variables, ainsi que leurs attributs, et les copier dans le PDV.


keep Make Model Type Cylinders Horsepower Seller;

Le bloc descripteur temporaire stocké dans le PDV est mis à jour, seules les variables standard MAKE, MODEL, TYPE, CYLINDERS et HORSEPOWER sont conservées. Par ailleurs une nouvelle variable est ajoutée : SELLER.
La nouvelle variable Seller est initialisée avec une chaine de 10 caractères, elle aura donc un type chaine et une longueur de 10.


Seller = 'Auto PARIS';
where (type='Sedan' or type='Sports') and horsepower between 350 and 400;

Ces deux instructions concernent les données, elles ne sont pas traitées dans la phase de compilation.


run;

Enfin, l'instruction run qui marque la début de la phase d'exécution et donc, la fin de la phase de compilation. SAS va copier le PDV dans le bloc descripteur de l'objet WORK.MYCARS qui devient alors une table.

SAS etape step data run compilation PDV program vector

SAS passe à l'exécution du programme.

Exécution

Nous l'avons précisé précédemment, l'exécution se rapporte aux données. SAS va boucler sur chacune des observations issues de la table désignée par l'instruction SET. Nous aurons donc autant d'exécutions que d'observations répondant aux divers filtres ou instructions conditionnelles.

Lors de la première exécution, deux variables sont créées : une variable numérique _N_ initialisée à 1, qui constitue l'indice de la boucle, incrémentée à chaque itération, puis une variable booléenne _ERROR_ initialisée à 0 qui prendra la valeur 1 si une erreur est levée au cours de l'itération courante.
De même, c'est à la première exécution que SAS initialise dans le PDV les variables héritées à "valeur manquante" (missing).

A chaque nouvelle exécution, la variable _N_ sera donc incrémentée de 1. Par ailleurs le PDV initialisera les nouvelles variables à missing. Les variables héritées prendront la valeur de l'observation courante.

Déroulé ligne à ligne de la phase d'exécution :


data mycars;

Il s'agit de la première exécution, SAS initialise dans le PDV les variables _N_ à 1 et _ERROR_ à 0. Par ailleurs il initialise également toutes les variables à missing.

SAS etape step data run compilation PDV program vector

set sashelp.cars;
keep Make Model Type Cylinders Horsepower Seller;
Seller = 'Auto PARIS';
where (type='Sedan' or type='Sports') and horsepower between 350 and 400;

SAS va lire dans la table d'origine CARS les observations qui répondent au filtre WHERE. A la différence d'un filtre conditionnel IF, la clause WHERE est appliquée en entrée. Ainsi, on ne peut appliquer un filtre WHERE sur une nouvelle variable, seules les variables héritées sont reconnues. Par ailleurs, dans le cas d'une instruction IF, si la condition n'est pas vérifiée, SAS passera directement à l'instruction run pour terminer l'itération en cours.

SAS etape step data run compilation PDV program vector

run;

C'est la fin de la première itération. L'observation stockée dans le PDV est copiée dans la zone de données de la table WORK.MYCARS à l'exception des variables de travail _N_ et _ERROR_. Une nouvelle boucle débute et SAS repart sur l'instruction DATA, la variable _N_ est incrémentée. Seule la nouvelle variable SELLER est réinitialisée à missing, les variables héritées gardent en effet leur valeur précédente jusqu'à la sélection d'une nouvelle observation.


Retrouvez dans la rubrique "Nos datasets" toutes les données dont vous aurez besoin pour tester et pratiquer !