web-dev-qa-db-fra.com

Comment faire interagir deux programmations différentes avec deux langages différents?

Je ne sais pas si c'est trop large ou pas, mais je suis un jeune programmeur encore au collège, c'est ma première année. Je sens que j'ai une assez bonne maîtrise de différentes langues et une assez bonne base. Mais je trébuche pour penser comment si, par exemple, j'essaie de créer un programme et je dis que j'ai écrit une partie en python juste parce que c'est facile et fait le travail, mais ce programme aurait besoin pour obtenir la sortie d'un autre programme que j'ai écrit en C et j'utilise C en raison de sa vitesse. Je ne sais pas comment faire interagir les deux programmes et langages différents pour créer un programme global global. Je pense à comme si vous pouviez écrire dans un fichier, mais que se passe-t-il si python et les programmes C accédant tous les deux à un fichier, je devrais penser aux verrous.

La plupart du temps, je l'ai fait avec l'importation de fichiers dans un programme, mais dans ce cas, ils sont la même langue, donc c'est facile J'utilise simplement la fonction d'importation, mais avec deux langues/programmes interagissant pour créer une sortie cohérente, j'ai des problèmes .

Je pensais à cette question parce que je pensais plonger dans la création d'applications Web de base juste pour apprendre, mais je ne sais pas comment dire un fichier javascript interactif avec quelque chose que j'ai écrit en python ou vice versa.

J'ai l'impression de manquer quelque chose de vraiment facile ici et de ne pas comprendre. Désolé si cette question est trop large mais je n'ai pas vraiment trouvé de réponse claire en ligne, j'essayais de regarder à travers une webapp opensource, mais je n'ai pas vraiment pu en saisir la réponse, pardonnez-moi si la question semble stupide, je pensais c'est un bon endroit pour demander j'adore lire sur stackexchange.

Merci pour toute réponse.

27

Le code écrit dans différentes langues peut interagir de plusieurs façons.

Au niveau source, la compilation croisée d'une langue dans l'autre peut être effectuée pour certaines combinaisons de langues (par exemple, le GWT de Google comprend un compilateur Java vers javascript; le compilateur Glasgow Haskell peut compiler en C; les premières versions de C++ compilé en C). La plupart du temps, cependant, ce n'est pas vraiment faisable.

Les langages qui partagent une plate-forme virtuelle, tels que la JVM ou le runtime .NET, peuvent généralement interagir via les mécanismes exposés par la plate-forme - par exemple, tous les langages JVM peuvent accéder aux bibliothèques Java et les utiliser pour communiquer) entre eux, et ils peuvent appeler des méthodes et utiliser des classes créées dans n'importe quel autre langage JVM.

De nombreux langages de programmation, y compris Python, offrent un mécanisme d'interface avec les bibliothèques natives, généralement écrit en C. En utilisant un tel mécanisme, il est possible d'appeler des fonctions natives à partir d'un autre langage, de plus haut niveau. Les bibliothèques populaires ont souvent des liaisons facilement disponibles. Cette technique est généralement appelée "Foreign Function Interface" . L'interface Python-en-C est le CFFI .

Une autre option consiste à créer deux programmes complètement distincts et à les faire interagir au moment de l'exécution. Il existe différents mécanismes pour y parvenir; le plus simple est à travers un tube (regardez dans le module subprocess pour python): fondamentalement, un programme appelle l'autre, envoyant des entrées à son stdin et relisant le résultat depuis sa stdout. Cela fait d'un programme un sous-processus de l'autre; si vous avez besoin à la fois d'une longue durée de vie et d'un démarrage indépendant, les données peuvent être transmises dans les deux sens via des canaux nommés, des sockets réseau (locaux), des fichiers partagés et (selon la plate-forme) d'autres moyens. Laquelle est la meilleure dépend.

28
tdammers

Il existe plusieurs façons bien établies pour que deux programmes communiquent entre eux. Vous en avez déjà identifié un évident, en partageant des fichiers, et une difficulté évidente avec. Mais il existe d'autres moyens.

La plupart des systèmes d'exploitation modernes contiennent un mécanisme appelé tubes nommés , qui est essentiellement un flux de données avec son extrémité d'entrée dans un programme et sa fin de sortie dans un programme différent. Si vous devez envoyer des données d'un programme à un autre programme exécuté sur le même ordinateur, cela peut être une bonne méthode à utiliser.

Si vous devez configurer une API pour un programme à utiliser pour appeler l'autre programme, vous voudrez peut-être examiner RPC (appels de procédure à distance), qui est à nouveau généralement pris en charge au niveau du système d'exploitation.

Si vous voulez communiquer entre deux programmes sur deux ordinateurs différents, les choses se compliquent. Ensuite, vous devez travailler avec la mise en réseau et les protocoles. Vous avez besoin d'un des programmes pour pouvoir ouvrir un socket et écouter les messages entrants, les décoder en un appel de méthode interne, les traiter et renvoyer une réponse. Il existe de nombreuses bibliothèques disponibles pour fournir cette fonctionnalité dans différents langages, y compris C et Python.

Fondamentalement, la méthode à utiliser dépend des spécificités de ce que vous essayez de faire. Faites des recherches sur diverses formes de communication inter-processus et de messagerie réseau, et vous devriez être en mesure de déterminer ce qui conviendrait le mieux à vos besoins.

11
Mason Wheeler

passage de message semble être le concept général ici car il existe divers exemples où l'on peut avoir différentes langues interagissant, par exemple. on pourrait utiliser le classique ASP avec des composants COM et du JavaScript pour obtenir un mélange de 3 langues différentes utilisées dans la même application.

Dans l'exemple que vous indiquez, les verrous ne seraient-ils pas quelque chose que le système d'exploitation devrait gérer sur le système de fichiers? Chaque programme ne connaît pas l'autre se souvient nécessairement.

2
JB King

La plupart des composants logiciels ne doivent pas communiquer en termes d'instructions mais envoyer et recevoir des données: interagir avec une base de données, envoyer/recevoir des requêtes JSON/XML, etc.

0
vemv

Selon votre type de problème, l'utilisation standard de tuyaux par Shell peut être suffisante (tapez dans votre Shell):

programme1 | programme2

De cette façon, la sortie du programme1 va directement à l'entrée du programme2. Bien sûr, cela ne fonctionne pas pour tous les problèmes, mais de nombreux problèmes (non interactifs) peuvent être résolus correctement en utilisant cette approche.

0
markijbema