Je suis C'est une question assez générale mais je travaille personnellement sur Linux. P>
Ce que je veux comprendre, c'est le processus par lequel différentes langages de programmation peuvent être
Combiné, j'ai trouvé un bon article sur la combinaison de C / C ++ / Fortran:
http://www-h.eng.cam.ac .uk / Help / TPL / Langues / MixingLangs.html . P>
De ce que je comprends, la plupart des compilateurs effectuent deux étapes: P>
traduire les fichiers de langue en fichiers d'objet contenant du code de machine mais toujours
contenir des symboles (éventuellement des noms de fonction?) p> li>
lier les fichiers d'objet ensemble, uniquement à ce stade, la liaison vérifie que les fonctions
dans les fichiers d'objet sont appelables. p> li>
ol>
Je pense que le problème de la combinaison de langues différentes est le nom de mangling qui signifie
que les noms des fonctions sont modifiés lorsqu'ils sont transformés en code d'objet. P>
Les questions sont: p>
Vous ne pouvez pas en quelque sorte découvrir les noms de fonction mutilé à l'avance et que les spécifier explicitement dans la langue de programmation ou mieux éteint, n'est-ce pas un logiciel qui le fait déjà? P> LI>
Je ne comprends pas complètement la manière dont les bibliothèques dynamiques sont liées mais que des langues peuvent être différentes
interagir par la même méthode que les programmes interagissent avec des bibliothèques dynamiques? P> LI>
ol>
P.S L'intention principale consiste à appeler des fonctions écrites dans une autre langue. P>
4 Réponses :
Le "standard" consiste à utiliser des noms non mutilés lors de la combinaison de programmes de différentes langues. Nom Mangling peut être désactivé pour des symboles spécifiques en C ++ en les déclarant avec externe "c" code>. C ne manque pas de noms. P>
Tous les exécutables de la bibliothèque contiennent un type d'interface. S'ils ne l'ont pas fait, aucun logiciel ne serait capable de travailler avec eux. Il est plus probable que les méthodes internes sont modifiées pour être plus efficaces. De plus, de nombreuses langues vous permettent de désactiver "Mangling" au niveau du compilateur. P>
liaison, comme une explication simple (je vais probablement être dinké pour cela?), est emballage dans un seul fichier. Les classes conservent la même interface que les bibliothèques non liées, du moins d'un point de vue de la programmation externe. P>
Différentes langues peuvent certainement utiliser les mêmes bibliothèques. Sur l'ancienne Windows Visual Basic, il était assez courant de charger de manière dynamique les fonctions de l'API Windows, par exemple. P>
Tout ce dont vous avez besoin pour la liaison entre langage est un accord sur les conventions d'appel de la fonction, ainsi que la connaissance des noms de fonction. Le premier doit être fait en examinant la documentation; Ce dernier doit être levé dans le compilateur qui a créé les objets ou les bibliothèques. Par exemple, Fondamentalement, tant que vos objets ou bibliothèques n'exposent que le C ABI, il devrait exister un soutien généralisé pour la liaison à d'autres langues. Il est beaucoup plus difficile si vous souhaitez utiliser une bibliothèque native C ++, par exemple, car dans ce cas, vos langues étrangères doivent mettre en œuvre le C ++ ABI correct. Il est similaire à l'exportation de code de, par exemple, Fortran, mais je crois que l'on peut être fait pour simplement utiliser le C abi. P> gcc code> compilera C sans noms de mangling. Vous pouvez donc vous reporter directement aux noms de fonctions telles qu'elles figurent dans votre source C, tandis que
g ++ code> compilera C ++ Code avec mutilé Noms et vous êtes le meilleur de l'exposition des fonctions C via
extern "C" code> Déclarations. P>
Je ne comprends pas tout à fait la dernière partie, que voulez-vous dire par "vos objets ou bibliothèques exposant uniquement le C abi"
Eh bien, vos bibliothèques pourraient utiliser toutes sortes de choses internes différentes (comme C ++ Stuff) que vous ne pouviez pas facilement donner un sens à l'extérieur, mais aussi longtemps que les fonctions que vous souhaitez exposer aux autres suivent le C ABI, d'autres programmes peuvent Liez-les de manière dynamique.
Comment puis-je savoir si le compilateur / la langue que j'utilise est compatible avec le C ABI, existe-t-il un moyen de le savoir?
Vous devrez vérifier la documentation du compilateur. Je pense que GCC fait la bonne chose pour toutes les fonctions C, pour les fonctions C ++ avec extern "c" code>, et probablement (bien que je ne sache pas) pour FORTRAN, et vous pouvez probablement obtenir l'autre GCC frontend Langues à émettre des fonctions de style C aussi.
C'est une bonne réponse, de clarifier, je vous serais reconnaissant si vous pouviez me dire si ce qui suit est correct: seule la convention ABI / Calling comporte de même que vous pouvez relier des objets différents, si je veux avoir un haut. Le langage de niveau comme Perl ou PHP (écrit en C) peut appeler ma fonction que tant que la fonction utilise le C ABI, cela fonctionnera. J'ai juste besoin d'ajouter l'objet partagé au fichier de configuration (comme php.ini) ou de le lier d'une autre manière.
Le problème avec la liaison des différents fichiers d'objet ensemble se résume généralement aux conventions d'appel de sous-programme. Fondamentalement, lorsque vous appelez un appel à une routine située dans un autre fichier d'objet, votre compilateur devra savoir ce que cet autre fichier d'objet nomme sa routine en interne, comment transmettre tous ses paramètres et quoi (le cas échéant (le cas échéant) la routine nécessitera. Tout ce genre de choses est généralement regroupée sous la position de Convention d'appel art. P>
Chaque compilateur a ses propres conventions d'appel qu'il aime utiliser pour les sous-routines. NOTE J'ai dit "compilateur", pas la langue. La convention C appelant à Linux est différente de la convention C appelant sur Windows. P>
Ainsi, lorsque vous mélangez des langues, vous devez avoir un moyen de dire au compilateur de l'appelant ou du sous-programme appelé pour utiliser la convention appelante de la langue. La convention de C est populaire à utiliser comme une sorte de «lingua franca», comme à peu près toutes les plateformes dispose d'un compilateur C. Cependant, certaines plates-formes (par exemple: Windows) ont plusieurs conventions d'appel populaires. P>
Alors maintenant, nous posons la question que vous avez posée dans les commentaires: p>
Y a-t-il un moyen courant de "dire au compilateur d'utiliser la convention d'appel de l'autre langue"? P> blockQuote>
et la réponse est: "Non, pas vraiment". Certaines langues ont défini des moyens d'utiliser des conventions d'appel spécifiques d'une autre langue. Par exemple, C ++ vous permet de mettre
externe "C" code> sur les déclarations pour dire au compilateur que la ou les déclarations en question utilisent la convention C appelant C. Ada accomplit la même chose avec
Convention de Pragma (x, ...) code>, où x est le nom de la convention.
c code>,
fortran code> et
COBOL code> est défini par la langue, mais quoi que ce soit d'autre prise en charge (par exemple: Windows '
stdcall code> ) La mise en œuvre est-elle définie. P>
Cependant, si vous avez une paire de langues dont les écrivains compilateurs n'ont jamais pensé l'un l'autre, vous n'avez pas d'autre choix que de dire à la fois à utiliser une troisième convention qu'elles connaissent toutes les deux (généralement C). Par exemple, pour obtenir standard em> C ++ et ADA à interopérer, vous auriez le code de serveur exportant ses routines à l'aide de la Convention C et indiquez au code du client que les routines à apposer utilisent la Convention C . p>
Thanx beaucoup pour la réponse, existe-t-il un moyen courant de "dire au compilateur d'utiliser la convention d'appel de l'autre langue"?
C'est une bonne réponse, de clarifier, je vous serais reconnaissant si vous pouviez me dire si ce qui suit est correct: seule la convention ABI / Calling comporte de même que vous pouvez relier des objets différents, si je veux avoir un haut. Le langage de niveau comme Perl ou PHP (écrit en C) peut appeler ma fonction que tant que la fonction utilise le C ABI, cela fonctionnera. J'ai juste besoin d'ajouter l'objet partagé au fichier de configuration (comme php.ini) ou de le lier d'une autre manière.
@FIFTYEight, pour Perl, jetez un coup d'œil à Inline: : C code>
. Tant que vous utilisez le C ABI, il y aura un moyen ou un autre pour le faire fonctionner pour un langage de script donné dans la plupart des cas. Les moyens de faire fonctionneront les détails de la situation. Mais notez que la plupart des langues de script sont écrites dans C. Pour ceux mis en œuvre au-dessus de la JVM, vous devrez recourir aux installations de la JVM pour le code natif Interop (JNI et NAUST).