Come far interagire due diverse programmazioni con due lingue diverse?


26

Non so se questo sia troppo ampio o meno, ma sono un programmatore giovane ancora al college, è il mio anno Junior. Mi sembra di avere una buona conoscenza di lingue diverse e una base abbastanza buona. Ma sto inciampando nel pensare come se, ad esempio, sto provando a creare un programma e dire che ho scritto una parte in Python solo perché è facile e fa il lavoro, ma questo programma dovrebbe ottenere l'output da un altro programma che ho scritto in C e sto usando C per la sua velocità. Non sono sicuro di come interagire tra i due diversi programmi e lingue per creare un programma complessivo complessivo. Sto pensando di poter scrivere su un file, ma poi se i programmi Python e C accedessero a un file, avrei bisogno di pensare ai blocchi.

La maggior parte delle volte che ho fatto questo è stato con l'importazione di file in un programma, ma in quel caso sono nella stessa lingua, quindi è facile usare semplicemente la funzione di importazione, ma con due lingue / programmi che interagiscono per creare un output coerente ho problemi .

Stavo pensando a questa domanda perché stavo pensando di immergermi nella creazione di alcune applicazioni web di base solo per imparare, ma non ho idea di come dire il file javascript interattivo con qualcosa che ho scritto in Python o viceversa.

Sento che mi manca qualcosa di veramente facile qui e non capisco. Scusate se questa domanda è troppo ampia ma non sono riuscito a trovare una risposta chiara online, stavo cercando di sfogliare una webapp opensource, ma non riuscivo a cogliere una risposta da essa, scusatemi di nuovo se la domanda sembra stupida ho pensato questo è un buon posto per chiedere adoro leggere su stackexchange.

Grazie per qualsiasi risposta


So che c'è Swig , sembra fare la cosa che vuoi, ma non l'ho usata. Quindi lo provi e vedi :).
user712092

1
Nota che la tua domanda contiene due argomenti completamente non correlati, uno sta comunicando in generale tra 2 processi / applicazioni nello stesso host, un altro è la consueta architettura web server / client, usando JS sul client e python sul server.
João Pinto,

Hai rivisto il concetto di LAMPADA? Puoi comunicare molto tramite database.
SDsolar,

Risposte:


28

Il codice scritto in diverse lingue può interagire in diversi modi.

A livello di sorgente, è possibile eseguire la compilazione incrociata da una lingua all'altra per alcune combinazioni di lingue (ad esempio, GWT di Google include un compilatore java-to-javascript; il compilatore Glasgow Haskell può compilare in C; prime versioni di C ++ compilato in C). Il più delle volte, tuttavia, questo non è realmente fattibile.

I linguaggi che condividono una piattaforma virtuale, come JVM o .NET runtime, di solito possono interagire attraverso meccanismi esposti dalla piattaforma - ad esempio tutti i linguaggi JVM possono accedere alle librerie Java e usarli per comunicare tra loro e possono chiamare metodi e utilizzare le classi create in qualsiasi altra lingua JVM.

Molti linguaggi di programmazione, incluso Python, offrono un meccanismo per interfacciarsi con le librerie native, tipicamente scritto in C. Utilizzando tale meccanismo, è possibile chiamare funzioni native da un altro linguaggio, di livello più elevato. Le biblioteche popolari spesso dispongono di rilegature prontamente disponibili. Questa tecnica viene generalmente definita "interfaccia di funzione esterna" . L'interfaccia Python-in-C è la CFFI .

Un'altra opzione è quella di creare due programmi completamente separati e farli interagire in fase di esecuzione. Esistono vari meccanismi per raggiungere questo obiettivo; il più semplice è attraverso una pipe (guarda nel subprocessmodulo per python): in sostanza, un programma chiama l'altro, inviando input al suo stdin e leggendo il risultato dal suo stdout. Questo rende un programma un sottoprocesso dell'altro; se è necessario che siano entrambi di lunga durata e avviati in modo indipendente, i dati possono essere passati avanti e indietro attraverso pipe denominate, socket di rete (locali), file condivisi e (a seconda della piattaforma) altri mezzi. Quale è il migliore dipende.


Bella risposta. Un'altra possibilità è che un interprete sia incorporato nel programma principale, fatto comunemente tra diciamo C ++ e Lua per lo sviluppo del gioco. Oppure, vedi la decima regola di Greenspun: en.wikipedia.org/wiki/Greenspun%27s_tenth_rule
Andrew

11

Esistono diversi modi ben stabiliti per comunicare tra loro due programmi. Ne hai già identificato uno ovvio, condividendo file e un'evidente difficoltà con esso. Ma ci sono altri modi.

La maggior parte dei sistemi operativi moderni contiene un meccanismo chiamato named pipe , che è fondamentalmente un flusso di dati con la sua estremità di input in un programma e la sua output in un altro programma. Se è necessario inviare dati da un programma a un altro programma in esecuzione sullo stesso computer, questo può essere un buon metodo da usare.

Se è necessario impostare un'API per un programma da utilizzare per chiamare l'altro programma, è possibile esaminare RPC (chiamate di procedura remota), che di solito è supportato a livello di sistema operativo.

Se vuoi comunicare tra due programmi su due computer diversi, le cose si complicano. Quindi è necessario lavorare con reti e protocolli. È necessario uno dei programmi per poter aprire un socket e ascoltare i messaggi in arrivo, decodificarli in una chiamata di metodo interna, elaborarli e restituire una risposta. Ci sono molte librerie disponibili per fornire questa funzionalità in vari linguaggi, tra cui C e Python.

Fondamentalmente, quale metodo dovresti usare dipende dalle specifiche di ciò che stai cercando di fare. Fai qualche ricerca su varie forme di comunicazione tra processi e messaggistica di rete e dovresti essere in grado di capire quale si adatterebbe meglio alle tue esigenze.


2

Il passaggio di messaggi sembrerebbe essere il concetto generale qui in quanto vi sono vari esempi in cui si possono interagire lingue diverse, ad esempio si potrebbe usare ASP classico con componenti COM e alcuni JavaScript per ottenere un mix di 3 lingue diverse utilizzate nella stessa applicazione.

Nell'esempio che affermi, i blocchi non dovrebbero essere gestiti dal sistema operativo nel file system? Ogni programma non conosce l'altro necessariamente ricordare.


0

La maggior parte dei componenti software non deve comunicare in termini di istruzioni ma inviare e ricevere dati: interagire con un database, inviare / ricevere richieste JSON / XML, ecc.


0

A seconda del tipo di problema, l'uso standard della shell dei tubi potrebbe essere sufficiente (digitare la shell):

programma1 | program2

In questo modo l'output del programma1 va direttamente all'ingresso del programma2. Naturalmente questo non funziona per tutti i problemi, ma molti problemi (non interattivi) possono essere risolti bene usando questo approccio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.