Frage

Im Moment arbeite ich an einer Skriptsprache, die noch keinen FFI hat. Ich würde gerne wissen, wie es der bequemste Weg ist, um es zu bekommen, vorausgesetzt, ich würde es gerne wie coole Geeks schreiben - ich möchte den FFI in der Skriptsprache selbst schreiben.

Die Programmiersprache, die ich für die Schnittstelle benötige. Offensichtlich ist es nicht das einzige, was ich brauche, aber das wichtigste von ihnen.

Ich habe nur leichte Vorstellungen darüber, was ich sonst noch brauche. Ich würde gerne ein ähnliches Verhalten vom FFI wie das, was Python Ctypes hat, bekommen.

Was sollte ich wissen müssen, um so weit zu kommen? Ich weiß, dass es ernsthafte Magie mit Datenstrukturen gibt, mit denen ich mich befassen muss. Wie schaffe ich es, damit ich den größten Teil dieser ernsthaften Magie in der Skriptsprache selbst tun kann? Ich hätte von solch Magie für viel mehr als nur die Fremdfunktionsschnittstelle verwendet. Zum Beispiel möchte ich C-ähnliche Binärdaten an Dateien übergeben.

War es hilfreich?

Lösung

Ich denke, eine angemessene Antwort erfordert a detaillierter Aufsatz.

Grundsätzlich sollten Wrapper für die vom Host -Betriebssystem bereitgestellten Lade- und Symbol -Sucheinrichtungen vorhanden sein. Wenn die Kerndatenatypen Ihrer Sprache intern mit einer einzelnen C -Datenstruktur dargestellt werden, kann die Bibliotheksentwickler eine Anforderung gestellt werden, dass die Parameter und der Rückgabetyp der exportierten C -Funktionen Objekte dieser Datenstruktur sein sollten. Dadurch wird der Datenaustausch einfacher zu implementieren. Wenn Ihre Sprache irgendeine Form von Musterausdrücken und erstklassigen Funktionen hat, kann die Signatur von C -Funktionen in Mustern geschrieben werden und die Bibliothek nach einer Funktion gesucht, die einer äquivalenten Signatur entspricht. Hier ist ein Pseudocode einer C -Funktion und ihre Verwendung im Skript:

/* 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));

Es ist nicht möglich, hier weitere Implementierungsdetails zu diskutieren. Beachten Sie, dass wir nichts über Müllsammlung usw. gesagt haben.

Die bei folgenden Links verfügbaren Quellen können Ihnen helfen, weiter zu gehen:

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

Andere Tipps

Kasse http://sourceware.org/libffi/

Denken Sie daran, dass die Anrufkonventionen bei verschiedenen Architekturen unterschiedlich sein werden, dh, welche Auftragsfunktionsvariablen auf dem Stapel gekommen sind. Ich weiß nicht, dass ich es in deine eigene Skriptsprache schreibe, ich weiß, dass Java Jni Libffi verwendet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top