fcmpact

addPrototypes

##backup ##set_fcmpact

Description

L'action `addPrototypes` de l'action setGemini said

Groupe logique de fonctionnalités CAS (Cloud Analytic Services) contenant des actions spécifiques (statistiques, data mining, etc.) pour traiter les données en mémoire de manière optimisée.
`fcmpact` permet d'ajouter des définitions de prototypes (les fameux PROTOPROTO est une interface de programmation permettant d'appeler des fonctions C externes à partir de SAS. Elle facilite l'intégration de bibliothèques tierces pour étendre les capacités de traitement. de la procédure FCMPProcédure de création de fonctions et sous-programmes personnalisés réutilisables. Elle permet d'étendre le langage SAS et de partager des logiques métier complexes entre différentes étapes DATA.) et de les sauvegarder judicieusement dans une table CAS. C'est l'outil idéal pour déclarer des fonctions externes (comme des fonctions C/C++) et les rendre utilisables directement dans vos programmes SAS sur Viya. Ne vous inquiétez pas, ça a l'air complexe comme ça, mais c'est magique une fois en place ! Les pros du code natif vont adorer. N'oubliez pas de consulter la doc officielle pour plus de détails.

Syntaxe Officielle
proc cas;
fcmpact.addPrototypes /
bridgeCatchSignals=TRUE | FALSE
bridgeFile="chaine"
encode=TRUE | FALSE
funcTable={caslib="chaine", name="nom-table", promote=TRUE | FALSE, replace=TRUE | FALSE, ...}
library="chaine"
package="chaine"
routineCode={"chaine-1", "chaine-2", ...}
saveTable=TRUE | FALSE
stdcall=TRUE | FALSE;
quit;

Paramètres Clés

Nom du paramètre Description
bridgeCatchSignals Indique si le fichier bridge doit contenir le code nécessaire pour installer et gérer les signaux système (par défaut à FALSE).
bridgeFile Spécifie le chemin d'accès au module source du fichier bridge PROTO.
encode Permet d'encoder (chiffrer) les définitions de prototypes dans la table de fonctions sauvegardée, histoire de cacher vos secrets de fabrication (Alias : encrypt, hide).
funcTable Paramètre obligatoire ! Spécifie la table de sortie CAS (casouttable) dans laquelle les définitions PROTO seront écrites.
library Spécifie le nom d'une bibliothèque FCMP existante à charger.
package Spécifie le nom du package FCMP utilisé pour stocker les définitions PROTO.
routineCode Paramètre obligatoire ! Le code source brut de la définition PROTO à enregistrer dans la table (Alias : code).
saveTable Indique si la table FCMP générée doit être sauvegardée sur disque (par défaut à FALSE).
stdcall Indique si les fonctions doivent être appelées en utilisant la convention __stdcall (spécifique aux PC Windows).

Préparation des données

Préparation de l'environnement

Création d'une session CAS et définition des bibliothèques nécessaires avant de lancer l'intégration de nos fonctions externes.

1cas mycas sessopts=(caslib='casuser');
2LIBNAME casuser cas caslib='casuser';

Exemples d'utilisation

Ajout d'un prototype simple

Cet exemple montre comment addPrototypes compile un module C externe via routineCode. La table CAS my_protos générée est persistée (saveTable=TRUE) pour exécuter ce code distribué in-memory.

1PROC CAS;
2 fcmpact.addPrototypes /
3 routineCode={"double my_multiplier(double x);", "externc my_multiplier;", "double my_multiplier(double x) { return x * 2.0; }"}
4 funcTable={name="my_protos", caslib="casuser", replace=TRUE}
5 package="pkg1"
6 saveTable=TRUE;
7QUIT;
Résultat Attendu :
Une table CAS nommée `my_protos` est créée dans la caslib `casuser`. Elle contient le prototype compilé de `my_multiplier`. La table est également sauvegardée physiquement sur le système de fichiers pour une réutilisation ultérieure.
Prototypage avancé avec chiffrement et promotion

Cet exemple pour l'action CAS addPrototypes implémente l'obfuscation via encode et la persistance globale (promote), sécurisant ainsi vos fonctions FCMP compilées en environnement multi-utilisateurs.

1PROC CAS;
2 fcmpact.addPrototypes /
3 routineCode={"double secure_calc(double a, double b);", "externc secure_calc;", "double secure_calc(double a, double b) { return a + b; }"}
4 funcTable={name="secure_protos", caslib="casuser", promote=TRUE}
5 package="secpkg"
6 library="seclib"
7 encode=TRUE
8 saveTable=TRUE
9 bridgeCatchSignals=TRUE;
10QUIT;
Résultat Attendu :
La table `secure_protos` est générée et promue (accessible globalement). Les définitions internes sont chiffrées de manière illisible pour un utilisateur essayant d'explorer la table directement.