?> addPrototypes - WeAreCAS
fcmpact

addPrototypes

Description

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.

fcmpact.addPrototypes <result=results> <status=rc> / bridgeCatchSignals=TRUE | FALSE, bridgeFile="string", encode=TRUE | FALSE, funcTable={...}, library="string", package="string", routineCode={"string-1" <, "string-2", ...>}, saveTable=TRUE | FALSE, stdcall=TRUE | FALSE;
Paramètres
ParamètreDescription
bridgeCatchSignalsSpé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.
bridgeFileSpé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.
encodeSi 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.
funcTableParamè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.
librarySpé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.
packageSpé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.
routineCodeParamè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'.
saveTableSi 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.
stdcallSpé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.
Préparation des Données
Création d'une fonction externe en C

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.

1PROC 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 

Exemples

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'.

Code SAS® / CAS
Copié !
1PROC 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};
6RUN;
Résultat :
L'action s'exécute avec succès. Le log CAS affichera une note confirmant la création de la table 'myprotos' dans la caslib 'casuser'. Cette table contient les métadonnées du prototype de la fonction 'myadd'.

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.

Code SAS® / CAS
Copié !
1PROC 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};
10RUN;
Résultat :
Une table nommée 'myprotolib' est créée et sauvegardée en tant que fichier (probablement 'myprotolib.sashdat') dans le répertoire physique de la caslib CASUSER. Les prototypes pour 'myadd' et 'mystring' y sont stockés de manière encodée sous le package 'mytools'. La bibliothèque est maintenant persistante et peut être chargée dans d'autres sessions CAS.

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'.

Code SAS® / CAS
Copié !
1PROC 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;
13RUN;
Résultat :
La table 'myprotolib' est mise à jour. Elle contient maintenant les prototypes originaux ('myadd', 'mystring') ainsi que le nouveau ('anotherfunc'), tous sous le package 'mytools'. Le fichier .sashdat est écrasé avec la nouvelle version de la bibliothèque.

FAQ

Quelle est la fonction principale de l'action `addPrototypes` ?
Quel paramètre est obligatoire pour fournir le code des prototypes ?
Comment spécifier la table de sortie où les définitions seront stockées ?
Est-il possible de masquer ou de chiffrer les définitions de prototypes dans la table de sortie ?
Comment organiser les prototypes dans un package FCMP spécifique ?
À quoi sert le paramètre `bridgeFile` ?
L'action `addPrototypes` sauvegarde-t-elle la table FCMP par défaut ?
Quelle est la fonction de l'action addPrototypes ?
Quels sont les paramètres requis pour l'action addPrototypes ?
Comment puis-je spécifier le code pour les définitions PROTO ?
Où les définitions PROTO sont-elles stockées ?
Est-il possible d'encoder les définitions de prototypes ?

Scénarios associés

Cas d'usage
Scénario Standard : Intégration d'un Algorithme de Scoring Propriétaire en C++

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 ...

Cas d'usage
Scénario Volumétrie : Enregistrement en Masse de Prototypes pour l'Analyse d'Images

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...

Cas d'usage
Scénario Cas Limite : Gestion d'Erreurs et Débogage d'une Librairie Externe Instable

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...