J'aimerais trouver un moyen d'écrire une API accessible depuis n'importe quel autre langage de programmation via des liaisons de langage (ou un autre framework). Est-il possible de faire cela? Si tel est le cas, quel langage de programmation conviendrait le mieux pour écrire une API "multilingue"? Mon objectif est de créer un ensemble unique de fonctions auxquelles je peux accéder à partir de n'importe quel langage de programmation avec lequel je travaille, afin de ne pas avoir à réécrire manuellement l'intégralité de l'API dans chaque langue.
33
Réponses:
Vous avez quelques options:
Créez une interface HTTP, presque tout peut parler HTTP, ce qui vous donnera beaucoup de langues.
Créez quelque chose qui puisse être lié à un environnement linguistique, cela prendra beaucoup de temps, car vous devrez trouver un moyen de le connecter à de nombreuses langues différentes.
la source
Je pense que C ou C ++ conviendrait le mieux à vos besoins. Vous pouvez utiliser SWIG (Simplified Wrapper and Interface Generator) pour générer des liaisons de langage à partir de votre API C ou C ++.
la source
extern "C"
une compatibilité C à l’extérieur. Vous avez donc les avantages internes du C ++ (sécurité de type supérieure, bibliothèques) mais les avantages externes du C (norme ABI de facto)Il y a à peu près 2 façons:
Le travail requis pour cette tâche change en fonction du système utilisé. Par exemple, une interface de socket fonctionnera, mais les bibliothèques côté client ont tendance à être plus simples que les bibliothèques http.
Vous pouvez essayer de trouver une bibliothèque réseau prenant en charge toutes les langues que vous souhaitez utiliser et implémenter l'API en fonction de cette bibliothèque. Par exemple, utiliser ZeroMQ vous donne beaucoup de flexibilité pour écrire votre API à l'aide d'interfaces ZeroMQ. toute langue souhaitant appeler votre API doit alors utiliser la bibliothèque cliente ZeroMQ. Choisissez une bibliothèque prenant en charge un large éventail de langues et permettant une communication in-process ou out-of-process pour des performances optimales.
la source
Si les performances et la latence des appels ne sont pas un problème, envisagez de fournir une interface de ligne de commande complète (probablement, en utilisant un langage de script par-dessus). ImageMagick peut être un bon exemple d'une telle "API". Un autre bon exemple est la boîte à outils Tk.
la source
whoami
Ubuntu pour obtenir le nom d'utilisateur), ou aviez-vous autre chose en tête?Par API, que voulez-vous dire exactement?
Sur de nombreuses plates-formes, vous pouvez créer un lien vers une DLL ou une construction similaire, mais le fait de devoir être recompilé pour une cible native particulière (Intel / ARM) ou pour l’endianisme est-il toujours admissible? Une interface binaire particulière peut toujours rencontrer des difficultés avec certaines langues en raison de problèmes de types de données ou de constructions (les pointeurs essayant d’être renvoyés vers des langues qui ne les prennent pas bien en charge). Vous devrez donc également prendre en compte la conception de l’API afin de ne pas la modifier. exclure certaines langues ou rendre son utilisation lourde de ces langues.
Quelque chose de portable, comme C, et une interface basée sur des points de terminaison binaires dans une DLL peuvent être généralement appelés et appelables sur la plupart des plateformes et de la plupart des langues, mais il peut être nécessaire de les compiler différemment et / ou de les proposer sous différentes formes ou de les lier à différentes bibliothèques statiques.
Il me semble que le choix de la langue dans laquelle vous écrivez votre bibliothèque ou votre service ou quoi que ce soit est, par définition, indissociable de la question jusqu'à ce que vous en donniez davantage sur la plate-forme / service exposée par l'API. Si vous pouvez supposer qu'une pile réseau est disponible et que les performances au niveau des fonctions liées directement ne sont pas une exigence, l'API peut facilement être basée sur HTTP avec une sorte de shim pour la langue du client afin de rendre les requêtes transparentes.
Je pense que, d’une manière générale, cette question est trop vaste pour être utile dans le monde réel, car vous n’avez pas indiqué quel type d’API pourrait convenir compte tenu du type de service offert.
la source
Pour ajouter aux réponses ci-dessus qui suggèrent l'utilisation d'un mécanisme RPC. Vous pouvez utiliser Apache Thrift. ( Http://thrift.apache.org/ ). C'est fondamentalement un framework RPC.
Selon le wiki Thrift:
la source
Demandez à n'importe quelle langue d'écrire un fichier texte avec une fonction à appeler avec des paramètres à transmettre. Demandez à votre application "Je m'entends avec tout le monde" de regarder un répertoire et une fois qu'elle verra un processus-call.txt le faire fonctionner. Aucun serveur ou protocole réseau; même une méthode en langage non informatique peut initier les fonctions. Même une personne pourrait simplement créer le fichier texte.
Le contenu pourrait ressembler à:
;) vous pourriez attendre une éternité avant d’obtenir une réponse. Vous avez juste besoin d'insérer quelques octets dans l'autre processus, mais je suis sûr que ce n'est pas tout.
la source
OpenGL est un bon exemple de ce que vous décrivez - c'est une API écrite en C, conçue de manière à ce qu'il soit facile d'écrire des liaisons dans d'autres langues.
Les bibliothèques C peuvent être appelées à partir de la plupart des langages de programmation (généralement en tant qu’extensions compilées, ou des choses comme la
ctypes
bibliothèque de PyPy, etc.)Toutes les fonctions prennent comme arguments des types de données simples (booléen, entier, virgule flottante, constantes, tableaux), car les fonctions utilisant des pointeurs peuvent être difficiles à traduire en certaines langues.
int
float
etc peut différer)L'API résultante n'est pas nécessairement l'API C la plus conviviale que vous puissiez écrire si vous ne ciblez que des utilisateurs C. Cependant, cela signifie que les fonctions peuvent être presque directement exposées à une autre langue (par exemple, la documentation de PyOpenGL répertorie les différences, dont la plupart sont plutôt minimes).
En plus de cette API prolixe, vous pouvez écrire plus de wrappers "conviviaux pour les développeurs" autour de cela (frameworks de jeu et autres).
la source