Comment faire interagir deux programmations différentes avec deux langues différentes?

26

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 devrait 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 langues différents pour créer un programme global global. Je pense que vous pouvez sûrement écrire dans un fichier, mais que se passe-t-il si les programmes python et C accèdent 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.

Anatoly Torchinsky
la source
Je sais qu'il y a Swig , il semble faire ce que tu veux, mais je ne l'ai pas utilisé. Alors essayez-le et voyez :).
user712092
1
Veuillez noter que votre question contient deux sujets complètement indépendants, l'un est la communication générale entre 2 processus / applications sur le même hôte, l'autre est l'architecture serveur / client Web habituelle, utilisant JS sur le client et python sur le serveur.
João Pinto
Avez-vous revu le concept LAMP? Vous pouvez faire beaucoup de communications via des bases de données.
SDsolar

Réponses:

28

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-to-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 tout 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 «interface de fonction étrangère» . 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 subprocessmodule 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.

tdammers
la source
Très bonne réponse. Une autre possibilité consiste à intégrer un interpréteur dans le programme principal, généralement utilisé entre disons C ++ et Lua pour le développement de jeux. Ou, voir la dixième règle de Greenspun: en.wikipedia.org/wiki/Greenspun%27s_tenth_rule
Andrew
11

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é canaux 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 deviennent plus compliquées. Ensuite, vous devez travailler avec la mise en réseau et les protocoles. Vous avez besoin d'un des programmes pour pouvoir ouvrir une 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 que vous devez utiliser dépend des détails 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.

Mason Wheeler
la source
2

La transmission de messages 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 ASP classique 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.

JB King
la source
0

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.

vemv
la source
0

En fonction de votre type de problème, l'utilisation standard des tubes en 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.

markijbema
la source