Ich möchte einen Weg finden, eine API zu schreiben, auf die von jeder anderen Programmiersprache über Sprachbindungen (oder ein anderes Framework) zugegriffen werden kann. Ist das möglich? Wenn ja, welche Programmiersprache eignet sich am besten zum Schreiben einer "sprachübergreifenden" API? Mein Ziel ist es, einen einzigen Satz von Funktionen zu erstellen, auf die ich von jeder Programmiersprache aus zugreifen kann, mit der ich arbeite, damit ich nicht die gesamte API in jeder Sprache manuell neu schreiben muss.
33
Antworten:
Sie haben einige Möglichkeiten:
Erstellen Sie eine HTTP-Schnittstelle, mit der fast alle HTTP-fähig sind, sodass Sie viele Sprachen erhalten.
Erstellen Sie etwas, das in eine Sprachlaufzeit eingebunden werden kann. Dies ist recht zeitaufwendig, da Sie einen Weg finden müssen, um es mit vielen verschiedenen Sprachen zu verbinden.
quelle
Ich denke, C oder C ++ wären für Ihren Zweck am besten geeignet. Mit SWIG (Simplified Wrapper and Interface Generator) können Sie Sprachbindungen aus Ihrer C- oder C ++ - API generieren.
quelle
extern "C"
so gesteuert werden, dass es von außen C-kompatibel ist. Daher haben Sie die internen Vorteile von C ++ (höhereEs gibt so ziemlich zwei Möglichkeiten:
Die dafür erforderliche Arbeit hängt vom verwendeten System ab, z. B. funktioniert eine Socket-Schnittstelle, clientseitige Bibliotheken sind jedoch im Vergleich zu http-Bibliotheken in der Regel niedriger.
Sie könnten versuchen, eine Netzwerkbibliothek zu finden, die alle Sprachen unterstützt, die Sie verwenden möchten, und die API in Bezug auf diese Bibliothek implementieren. Die Verwendung von ZeroMQ bietet Ihnen z Dann muss jede Sprache, die Ihre API aufrufen möchte, die ZeroMQ-Clientbibliothek verwenden, um dies zu tun. Wählen Sie eine Bibliothek, die eine breite Palette von Sprachen unterstützt und Ihnen die Möglichkeit bietet, sowohl prozessbegleitend als auch prozessunabhängig zu kommunizieren, um eine optimale Leistung zu erzielen.
quelle
Wenn die Leistung und die Anruflatenz kein Problem darstellen, sollten Sie eine umfassende Befehlszeilenschnittstelle bereitstellen (möglicherweise mithilfe einer Skriptsprache). ImageMagick kann ein gutes Beispiel für eine solche "API" sein. Ein weiteres gutes Beispiel ist das Tk-Toolkit.
quelle
whoami
unter Ubuntu, um den Benutzernamen abzurufen), oder hatten Sie etwas anderes im Sinn?Was genau meinen Sie mit API?
Auf vielen Plattformen könnten Sie eine Verknüpfung zu einer DLL oder einer ähnlichen Konstruktion herstellen, müssten aber für ein bestimmtes natives Ziel (Intel / ARM) oder Endianness noch neu kompiliert werden? Eine bestimmte Binärschnittstelle kann aufgrund von Problemen mit Datentypen oder Konstrukten (Zeiger, die versucht werden, auf Sprachen zurückzukehren, die sie nicht gut unterstützen) weiterhin Probleme mit bestimmten Sprachen haben einige Sprachen auszuschließen oder ihren Gebrauch von diesen Sprachen umständlich zu machen.
So etwas wie C und eine Schnittstelle, die auf binären Endpunkten in einer DLL basiert, können auf den meisten Plattformen und in den meisten Sprachen problemlos aufgerufen werden, müssen jedoch möglicherweise anders kompiliert und / oder in verschiedenen Varianten angeboten oder mit verschiedenen statischen Bibliotheken verknüpft werden.
Es scheint mir, dass die Wahl der Sprache, in der Sie Ihre Bibliothek oder Ihren Service schreiben, oder was auch immer per Definition nicht für die Frage von Bedeutung ist, bis Sie mehr über die Plattform / den Service erfahren, den die API bereitstellt. Wenn Sie davon ausgehen können, dass ein Netzwerkstapel verfügbar ist und keine Leistung auf Funktionsebene mit direkter Verknüpfung erforderlich ist, kann die API leicht HTTP-basiert sein, wobei die Clientsprache eine Art Shim verwendet, um die Anforderungen transparent zu machen.
Ich denke, im Allgemeinen ist diese Frage zu weit gefasst, um in der realen Welt nützlich zu sein, da Sie nicht angegeben haben, welche Art von API angesichts der Art des angebotenen Dienstes geeignet sein könnte.
quelle
Hinzufügen von Antworten, die die Verwendung eines RPC-Mechanismus vorschlagen. Sie können Apache Thrift verwenden ( http://thrift.apache.org/ ). Grundsätzlich handelt es sich um ein RPC-Framework.
Nach dem Thrift-Wiki:
quelle
Lassen Sie eine beliebige Sprache eine Textdatei mit der Funktion zum Aufrufen und Weiterleiten von Parametern ausgeben. Lassen Sie Ihre App "Ich komme mit jedem zurecht" ein Verzeichnis überwachen und sobald sie eine process-call.txt sieht, kann sie funktionieren. Keine Server oder Netzwerkprotokolle; Selbst eine Methode, die keine Computersprache ist, kann die Funktionen auslösen. Sogar eine Person könnte einfach die Textdatei erstellen.
Der Inhalt könnte folgendermaßen aussehen:
;) Sie könnten jedoch ewig warten, bis Sie eine Antwort erhalten. Sie müssen nur ein paar Bytes in den anderen Prozess verschieben, aber ich bin sicher, dass das nicht die ganze Spezifikation ist.
quelle
OpenGL ist ein gutes Beispiel für das, was Sie beschreiben - es ist eine in C geschriebene API, die so entworfen wurde, dass es einfach ist, Bindungen für andere Sprachen zu schreiben
C-Bibliotheken können aus den meisten Programmiersprachen aufgerufen werden (normalerweise als kompilierte Erweiterungen oder Dinge wie PyPys
ctypes
Bibliothek usw.).Alle Funktionen verwenden einfache Datentypen als Argumente (Boolesche Werte, Ganzzahlen, Gleitkommazahlen, Konstanten, Arrays), da es für Funktionen, die Zeiger verwenden, schwierig sein kann, diese in einige Sprachen zu übersetzen
int
float
etc unterscheiden kann)Die resultierende API ist nicht unbedingt die am besten zu verwendende C-API, die Sie schreiben könnten, wenn Sie nur C-Benutzer als Ziel haben. Dies bedeutet jedoch, dass die Funktionen fast direkt einer anderen Sprache ausgesetzt werden können (z. B. listen die PyOpenGL- Dokumente die Unterschiede auf, von denen die meisten ziemlich gering sind).
Zusätzlich zu dieser ausführlichen API können Sie weitere "entwicklerfreundliche" Wrapper schreiben (Spiel-Frameworks und dergleichen).
quelle