?>
L'action 'addPrototypes' est un outil puissant de l'action set FCMP (Function Compiler) qui agit comme un pont entre l'environnement CAS et des bibliothèques de code externes (généralement écrites en C/C++). Son rôle principal est d'enregistrer les 'prototypes' de fonctions externes. Un prototype est une déclaration qui informe SAS sur la signature d'une fonction externe : son nom, ses arguments, son type de retour, et où trouver le code compilé (bibliothèque partagée .so ou .dll). Une fois le prototype ajouté à une table CAS via cette action, la fonction externe devient appelable directement depuis du code DS2 ou des expressions DATA Step exécutées sur le serveur CAS, permettant d'étendre les capacités de SAS avec des logiques personnalisées et performantes.
| Paramètre | Description |
|---|---|
| bridgeCatchSignals | Spécifie si le fichier de pont (bridge file) doit inclure du code pour installer et gérer les signaux du système d'exploitation. Utile pour le débogage avancé. La valeur par défaut est FALSE. |
| bridgeFile | Spécifie le chemin d'accès complet sur le serveur CAS vers la bibliothèque partagée (.so sur Linux, .dll sur Windows) contenant le code compilé des fonctions externes que vous souhaitez appeler. |
| encode | Si TRUE, les définitions des prototypes sont encodées (obfusquées) dans la table de fonctions de sortie. C'est une mesure de sécurité pour masquer la logique ou la structure des fonctions. Les alias sont 'encrypt' ou 'hide'. La valeur par défaut est FALSE. |
| funcTable | Paramètre obligatoire qui spécifie la table CAS de sortie où les définitions des prototypes seront stockées. C'est cette table qui sert de bibliothèque de fonctions pour CAS. |
| library | Spécifie le nom d'une bibliothèque FCMP existante (une table CAS créée précédemment) à laquelle ajouter les nouveaux prototypes. Si non spécifié, une nouvelle bibliothèque est créée. |
| package | Spécifie un nom de 'package' pour organiser les prototypes au sein de la bibliothèque FCMP. Cela aide à éviter les conflits de noms et à structurer le code. Toutes les fonctions définies dans un même appel seront regroupées sous ce package. |
| routineCode | Paramètre obligatoire contenant le code de déclaration des prototypes (syntaxe PROTO). C'est ici que vous déclarez la signature des fonctions externes. L'alias est 'code'. |
| saveTable | Si TRUE, la table de fonctions (spécifiée dans funcTable) est sauvegardée de manière permanente dans sa caslib source (généralement sous forme de fichier .sashdat). Par défaut (FALSE), la table est une table en mémoire de portée session. |
| stdcall | Spécifie que les fonctions doivent être appelées en utilisant la convention d'appel '__stdcall'. Ceci est pertinent uniquement pour les environnements Windows. La valeur par défaut est FALSE. |
Pour utiliser 'addPrototypes', nous avons besoin d'une fonction externe compilée. Les commandes ci-dessous créent un simple fichier source C contenant deux fonctions ('myadd' et 'mystring'), le compilent en une bibliothèque partagée ('myfuncs.so') et la placent dans un répertoire accessible par CAS. NOTE : L'exécution de commandes shell est requise pour cet exemple.
1 PROC CAS; 2 /* Étape 1: Créer le code source C */ 3 RUN; 4 %let c_code = " 5 #include <stdio.h> 6 #include <string.h> 7 #include <stdlib.h> 8 9 /* Fonction pour additionner deux entiers */ 10 int myadd(int a, int b) { 11 return a + b; 12 } 13 14 /* Fonction pour concaténer une chaîne avec un entier */ 15 char* mystring(char* str, int num) { 16 char* result = malloc(100); 17 sprintf(result, \"%s-%d\", str, num); 18 return result; 19 } 20 "; 21 22 /* Étape 2: Écrire le code C dans un fichier sur le serveur */ 23 DATA _null_; 24 file '/tmp/myfuncs.c'; 25 put &c_code.; 26 RUN; 27 28 /* Étape 3: Compiler le code C en bibliothèque partagée (.so) */ 29 PROC CAS; 30 SESSION casauto; 31 system "gcc -shared -o /tmp/myfuncs.so -fPIC /tmp/myfuncs.c"; 32 QUIT; 33
Cet exemple enregistre le prototype de la fonction 'myadd' (créée à l'étape de préparation des données) dans une nouvelle table CAS nommée 'myprotos' dans la caslib 'casuser'.
| 1 | PROC CAS; |
| 2 | fcmpact.addPrototypes / |
| 3 | bridgeFile="/tmp/myfuncs.so", |
| 4 | routineCode={"proto myadd(int, int) language=c library='myadd';"}, |
| 5 | funcTable={name='myprotos', caslib='casuser', replace=true}; |
| 6 | RUN; |
Cet exemple montre comment enregistrer plusieurs prototypes dans un 'package' nommé 'mytools'. Il utilise également l'option 'encode' pour obfusquer les définitions et 'saveTable=TRUE' pour sauvegarder la bibliothèque de fonctions de manière permanente dans la caslib CASUSER.
| 1 | PROC CAS; |
| 2 | fcmpact.addPrototypes / |
| 3 | bridgeFile="/tmp/myfuncs.so", |
| 4 | routineCode={"proto myadd(int, int) language=c library='myadd';", |
| 5 | "proto mystring(char[*], int) returns char[*] language=c library='mystring';"}, |
| 6 | package='mytools', |
| 7 | encode=true, |
| 8 | saveTable=true, |
| 9 | funcTable={name='myprotolib', caslib='casuser', replace=true}; |
| 10 | RUN; |
Ce scénario montre comment ajouter un nouveau prototype à une bibliothèque de fonctions FCMP déjà existante. On charge d'abord la bibliothèque 'myprotolib' (créée dans l'exemple précédent) puis on y ajoute un nouveau prototype avec l'option 'library'.
| 1 | PROC CAS; |
| 2 | /* Étape 1: S'assurer que la librairie est chargée en mémoire */ |
| 3 | TABLE.loadTable / caslib='casuser' path='myprotolib.sashdat'; |
| 4 | |
| 5 | /* Étape 2: Ajouter un nouveau prototype à la librairie existante */ |
| 6 | fcmpact.addPrototypes / |
| 7 | bridgeFile="/tmp/myfuncs.so", |
| 8 | library='myprotolib', |
| 9 | routineCode={"proto anotherfunc(double) returns double language=c library='another';"}, |
| 10 | package='mytools', |
| 11 | funcTable={name='myprotolib', caslib='casuser', replace=true}, |
| 12 | saveTable=true; |
| 13 | RUN; |
Une banque d'investissement souhaite utiliser son algorithme de calcul de risque de crédit, développé en C++ pour des raisons de performance et de secret industriel. L'objectif ...
Une usine de fabrication utilise une bibliothèque C++ custom, basée sur OpenCV, pour l'assurance qualité via l'analyse d'images. De nombreuses fonctions (détection de flou, mesu...
Une équipe de R&D intègre une nouvelle bibliothèque C de simulation physique qui est encore en phase de test et potentiellement instable. Il est crucial de s'assurer que l'envir...