11
votes

Quelles langues de haut niveau sont facilement interfacées avec C / C ++?

J'ai de l'expérience avec OCAML. Vous deviez écrire un talon pour chaque fonction que vous souhaitiez utiliser pour convertir les types même C int <-> ocaml int. Le lien était un puits douloureux. Je ne veux même pas faire de la cartographie des objets C ++.

Qu'en est-il des autres langues populaires? Est-ce toujours une douleur?

EDIT:

Veuillez éviter les doublons. Et l'état des capacités d'interfaçage C et C ++ séparément.

edit 2:

S'il vous plaît être précis. "X peut appeler c" ne donne pas trop d'informations.


2 commentaires

Ce n'est pas une langue de haut niveau mais des interfaces ASM vraiment sympa avec C et C ++! :-). L'autre conseil que je peux vous donner est que lorsque vous avez trop de problèmes liés au code C / C ++ avec votre code Python, vous pouvez toujours faire une belle DLL de votre code C / C ++. Certaines personnes aiment aussi COM dlls.


C ++ est Langue haute, événement, il n'est pas facile un


16 Réponses :


15
votes

Python a une très bonne API C. Il peut être intégré à C ++ également très facilement et facilement à l'aide de la reliure Boost :: Python C ++ pour l'API Python C.


1 commentaires

Vous devriez vous référer au module CTYPES et docs.python.org/Extending/extinal.htmlled/a >



0
votes

L'interface avec les objets C ++ sera toujours douloureux, car il n'y a pas d'interface binaire standard (interface binaire).


3 commentaires

Bien. Je suppose que vous parlez de fonctions virtuelles. Vous pouvez faire beaucoup sans eux.


Tant que l'interface utilise des offres avec des conventions d'appel, une mise en page, etc., plutôt que de vous forcer, le programmeur, de le faire, ça devrait aller.


Si vous pouvez interfacer avec ELF, vous devriez être capable d'interfacer avec des objets C ++ relativement facilement.



3
votes

Python a une excellente interface C à l'aide du module CTTYPES intégré. Afin d'interfacer des modules C ++, Swig peut être utilisé.


0 commentaires


3
votes

Python est un langage de haut niveau puissant et facile à apprendre et possède une bonne documentation de l'extension avec C et C ++:

http://docs.python.org/extending/extink.html

Utiliser cette approche est simple, mais vous écrivez vos extensions explicitement pour Python. Utilisation de Swig (voir EXTENDON PYTHON avec C ++ pour un joli petit tutoriel), vous créez le C / Code C ++ Comme si elle devait être exécutée par lui-même, plus un fichier d'interface que Swig prend pour créer un code d'emballage pour vous que vous puissiez utiliser dans Python (ou dans d'autres langues, à ce sujet).


2 commentaires

Boost.python n'est-il pas considéré comme plus la chose ces jours-ci?


Pybind11 rend la création de python liant une brise de nos jours. c'est une réécriture de boost :: python.



2
votes

Java a une belle interface native avec JNI, C # a quelque chose de très similaire.


7 commentaires

Jni est loin d'être gentil ... Essayez JNA


Oh, mes excuses si JNI n'est plus la chose "dans"; Ça fait 8 ans que je faisais Java: P


@Lukasz dans quel sens? Dans JNI (et probablement JNA) et C #, vous écrivez simplement l'en-tête de la fonction comme «externe ...», puis vous l'appelez de manière appropriée. Que cherchez-vous d'autre?


@Lukasz: Je pense que @DFA fait allusion au fait que JNI est difficile à utiliser. Si vous faites une erreur en utilisant JNI, vous risquez de vous bloquer le JVM.


Eh bien, je n'ai jamais utilisé Jni. Les problèmes standard sont les suivants: - Compatyabilité de type de paramètre de base - Types plus complexes tels que les structures - surcharge - Objet passant - Fonctions d'argumentation variable, etc. Le lien serait d'au moins utile.


@Lukazs: Par exemple, si votre C / C ++ n'est pas thread-coffre-fort (par exemple, il appelle une fonction de bibliothèque sans fil non thread-Safe), vous devez vous assurer que vous ne l'appelez que via JNI d'un fil Java.


Je ne sais pas avec certitude, mais lorsque vous utilisez JNI, n'êtes pas des problèmes avec Endian-Ness? C'est-à-dire que Java utilise Big Endian alors que les plates-formes les plus courantes (et donc c sur les plates-formes les plus courantes) utilisent peu d'Endian.



7
votes

Presque toutes les langues de script (Perl, Python, Lua, PHP, PHP, Ruby, TCL) sont destinées à être intégrées à C et C ++.

Un bon document d'enquête des mérites relatives des API: xxx

Voir aussi ce Question très similaire (et Ma réponse en particulier ;))).


5 commentaires

J'aime la syntaxe en surbrillance :)


SkilldRick: moi aussi. Je me demande pourquoi ça fait ça: meta.stackexchange.com/questions/14664/...


-1: "Conçu pour être intégré à C et C ++." est faux (comme dans, ce n'est pas la vérité) pour toutes les langues citées mais Lua. Seul Lua a été conçu pour cela, les autres sont des adaptations rendues possibles. Il y a une condition difficile dans le processus d'intégration d'une langue conçue pour être intégrée et incorporer une langue qu'elle n'était pas l'objectif de conception principal.


Klaim: Je suis d'accord. Je n'ai pas l'intention de dire que c'était l'intention initiale de toutes ces langues. Pour beaucoup, c'est devenu un objectif explicite plus tard dans la vie. Cependant, c'est un objectif pour que toutes ces langues soient intégrées à C. a ajouté une meilleure formulation que je pense.


Désolé, Klaim, TCL a également été conçu dès le départ pour être embormeable dans C - voir TCL.TK/ABout /history.html .



0
votes

J'ai relié des bibliothèques de fortrand en une fois. Je vous en dirai plus, mais il est temps de ma sieste.


0 commentaires

0
votes

TCL peut appeler C / C ++ Code


0 commentaires

3
votes

Vous pouvez aimer ce Filetage récent Comp.comPilers sur divers interfaces de fonction à l'étranger. Il a été suggéré que Haskell avait l'un des plus gentils.


0 commentaires

2
votes

d est Conçu Pour être facilement ineffacté à c.

d 2.0 a un Interface limitée sur Code C ++.


0 commentaires

1
votes

R est extensible via C, C ++ et Fortran, ceci est décrit dans le R Extensions Manuel et le contribué Le paquet RCPP facilite l'appel de fonctions C ++.


0 commentaires

5
votes

Ce problème a été important depuis plus de 20 ans. L'état de la technique en résolvant qu'il est de définir une langue de définition d'interface ou IDL. Vous avez ensuite un outil qui génère automatiquement ces fonctions que vous avez utilisées pour écrire à la main. L'autre terme d'utilisation commune est interface de fonction étrangère ou ffi.

Malheureusement, la plupart d'entre eux ne sont pas très bons. De l'expérience personnelle:

  • tolua et Swig ne vaut pas la peine d'être utilisé pour Lua et C; Il est plus facile d'écrire les fonctions de liaison à la main. L'IDL pour Tolua en particulier est un fichier d'en-tête presque mais pas tout à fait un fichier C. Vous allez donc maintenant entretenir deux versions de chaque déclaration.

  • tolua ++ peut valoir la peine d'être utilisé pour la liaison LUA et C ++ - la valeur de nuisance des objets C ++ simulés à la main est considérable.

  • Swig couvre beaucoup de langues, mais j'ai toujours trouvé difficile à utiliser.

    de la lecture sur l'expérience des autres:

    • le Glasgow Haskell Compiler semble avoir la plus belle interface de fonction étrangère et si Je me souviens bien, l'IDL est gratifiant simple: vous venez de donner le type de haskell de la fonction C que vous essayez d'importer.

    • standard ml de New Jersey semble également avoir une très belle interface de fonction à l'étranger; Il y avait un papier à Babel-01 à ce sujet.

      Pour une langue donnée que vous souhaitez interagérez avec C, vous devriez Demander sur l'interface de fonction à l'étranger et Demandez s'il existe un IDL et des outils associés.


1 commentaires

Swig peut être une douleur, mais cela bénéficie d'un avantage de simplement l'apprendre une fois.



0
votes

Les capacités d'intégration de Lua avec C (et par extension C ++) sont absolument première classe. C'est une merveilleuse petite langue aussi. Je ne pense pas que ça devienne presque l'amour qu'il mérite.

Link: http://www.lua.org/


0 commentaires

0
votes

Les implémentations de LISP communes auront souvent un FFI qui fonctionne très bien avec C. La bonne chose est que vous n'avez pas à écrire de code C pour utiliser les bibliothèques C; Tout ce que vous avez à faire est d'écrire la déclaration de la fonction C est LISP.

facteur a copié ce système FFI de LISP.


0 commentaires

3
votes

Je n'utiliserais pas Python dans ce cas, même s'il y a Boost.python pour vous aider à intégrer. Même les gens de Python disent qu'il est plus logique d'intégrer C en python que l'inverse, tout simplement parce que Python n'est pas conçu pour être intégré.

J'aime utiliser des langues spécialement conçues pour être incorporées dans C ++ ou C, comme Lua Lua Falcon ou chaiscript . Cependant, j'aime aussi avoir une langue complète disponible. Si je veux écrire une application sous de lourdes contraintes (comme des jeux sur les consoles), je préfère utiliser Lua conçu pour cela. Sinon, je préfère utiliser Falcon ou chassumscript .

Falcon est une bonne alternative à Python dans ce cas (incorporation d'une langue de haut niveau en C ++): http://falconpl.org
Il est conçu pour fonctionner avec C ++ et même les bibliothèques standard sont implémentées en C ++.

J'aime aussi utiliser châtieux lorsque je veux simplement inclure les en-têtes et aller avec une langue de scriptrage: http://chaiscript.org Il est conçu pour être en-tête uniquement et facilement intégré au code C ++. En fait, il est fait fonctionner avec C ++ uniquement.

Les deux sont des langues de haut niveau. Falcon ressemble plus à Python et à Ruby mais avoir l'avantage de proposer beaucoup plus de paradigmes de programmation que ces deux. Chaiscript ressemble à un C ++ simplifié afin qu'il ne soit peut-être pas le meilleur choix pour les personnes qui ne sont pas utilisées à une telle syntaxe, mais sinon, il est facilement lié à votre code véritable C ++. Falcon aussi, mais pas de la même manière et la syntaxe est plus facile sur les non-programmeurs.


0 commentaires