Question

En ce moment je travaille sur un langage de script qui ne dispose pas encore de FFI. Je voudrais savoir quel est le moyen le plus pratique pour l'obtenir en supposant que je voudrais écrire comme les geeks frais ne -. Je voudrais écrire dans les FFI le langage de script lui-même

Le langage de programmation que je dois l'interface est C. Donc, pour base, je sais que libdl.so est mon meilleur ami. Il est évident que ce n'est pas la seule chose que je vais avoir besoin, mais le plus important d'entre eux.

Je n'ai que de légères idées sur ce que dois-je encore besoin. Je voudrais obtenir un comportement similaire de la FFI comme ce ctypes python a.

Que dois-je savoir pour en arriver là? Je sais qu'il ya quelque chose de magique sérieuse avec des structures de données, je vais devoir traiter. Comment puis-je gérer cela pour que je puisse faire le plus de cette magie grave dans le langage de script lui-même? Je dois utiliser de cette magie pour bien plus que l'interface de fonction étrangère. Par exemple, je pourrais vouloir transmettre des données binaires C comme les fichiers.

Était-ce utile?

La solution

Je pense qu'une réponse a besoin d'un essai détaillé .

En fait, il devrait y avoir des emballages pour le chargement de la bibliothèque et symbole de recherche suivant fournies par le système d'exploitation hôte. Si les types de données de base de votre langue sont représentés en interne avec une seule structure de données C, alors une exigence peut être placé sur les développeurs de bibliothèques que les paramètres et le type de retour des fonctions C exportés doivent être des objets de cette structure de données. Cela rendra l'échange de données plus simple à mettre en œuvre. Si votre langue a une certaine forme d'expressions de motif et fonctions de première classe, puis la signature des fonctions C peut être écrit dans les modèles et la bibliothèque recherchée pour une fonction correspondant à une signature équivalente. Voici quelques pseudo-code d'une fonction C et son utilisation dans le script:

/* arith.dll */
/* A sample C function callable from the scripting language. */

#include "my_script.h" // Data structures used by the script interpreter.

My_Script_Object* add(My_Script_Object* num1, My_Script_Object* num2)
{
   int a = My_Script_Object_To_Int(num1);
   int b = My_Script_Object_To_Int(num2);
   return Int_To_My_Script_Object(a + b);
}

/* End of arith.dll */

// Script using the dll
clib = open_library("arith.dll");

// if it has first-class functions
add_func = clib.find([add int int]);
if (cfunc != null)
{
   sum = add_func(10, 20);
   print(sum);
}

// otherwise
print(clib.call("add", 10 20));

Il est impossible de discuter plus de détails de mise en œuvre ici. Notez que nous avons pas dit quoi que ce soit à propos de la collecte des ordures, etc.

Les sources disponibles sur les liens suivants peuvent vous aider à aller plus loin:

http://common-lisp.net/project/cffi/ http://www.nongnu.org/cinvoke/

Autres conseils

Consultez http://sourceware.org/libffi/

Rappelez-vous les conventions d'appel vont être différents sur des architectures différentes, à savoir quelles sont les variables fonction ordre on fait claquer sur la pile. Je ne sais pas l'écrire dans votre propre langage de script, je ne sais que Java JNI utilise libffi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top