Come avere due diverse programmazioni con due lingue diverse interagire?

26

Non so se questo è troppo ampio o no, ma io sono un programmatore giovane ancora al college, è il mio anno Junior. Mi sento come se avessi una bella presa per lingue diverse e avere una buona base. Ma sto inciampando nel pensare che se per esempio sto cercando di creare un programma e dico di aver scritto una parte in python solo perché è facile, e fa il lavoro, ma questo programma avrebbe bisogno di ottenere l'output da un altro programma che ho scritto in C e sto usando C a causa della sua velocità. Non sono sicuro di come i due programmi e le lingue possano interagire tra loro per creare un programma complessivo. Sto pensando di essere sicuro di poter scrivere su un file, ma cosa succederebbe se i programmi Python e C accedessero entrambi a un file avrei bisogno di pensare ai blocchi.

La maggior parte delle volte l'ho fatto con l'importazione di file in un programma, ma in quel caso sono la stessa lingua, quindi è facile usare la funzione di importazione, ma con due linguaggi / programmi che interagiscono per creare un output coeso sto avendo 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.

Mi sento come se mi mancasse qualcosa di veramente facile qui e semplicemente non capisco. Scusate se questa domanda è troppo ampia ma non ho potuto trovare una risposta chiara online, stavo cercando di guardare attraverso una webapp opensource, ma non riuscivo davvero a cogliere una risposta da esso, di nuovo perdonatemi se la domanda sembra stupida ho pensato questo è un buon posto per chiedere adoro leggere su stackexchange.

Grazie per qualsiasi risposta.

    
posta Anatoly Torchinsky 02.11.2011 - 20:51
fonte

5 risposte

28

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

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

Le lingue che condividono una piattaforma virtuale, come la JVM o il runtime .NET, in genere possono interagire attraverso i meccanismi esposti dalla piattaforma, ad esempio tutte le lingue JVM possono accedere alle librerie Java e usarle per comunicare tra loro, e può chiamare metodi e utilizzare classi create in qualsiasi altra lingua JVM.

Molti linguaggi di programmazione, incluso Python, offrono un meccanismo per interfacciarsi con le librerie native, tipicamente scritte in C. Utilizzando un tale meccanismo, è possibile chiamare funzioni native da un'altra lingua più di alto livello. Le librerie popolari hanno spesso collegamenti prontamente disponibili. Questa tecnica viene generalmente definita "Interfaccia di funzione esterna" . L'interfaccia Python-in-C è CFFI .

Un'altra opzione è creare due programmi completamente separati e farli interagire in fase di runtime. Esistono vari meccanismi per raggiungere questo obiettivo; il più semplice è attraverso una pipe (guarda il modulo subprocess per python): in pratica, un programma chiama l'altro, inviando input al suo stdin e leggendo il risultato dal suo stdout. Ciò rende un programma un sottoprocesso dell'altro; se è necessario che entrambi siano longevi 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.

    
risposta data 02.11.2011 - 21:59
fonte
10

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

La maggior parte dei sistemi operativi moderni contiene un meccanismo chiamato named pipes , che è fondamentalmente un flusso di dati con il suo input terminato in uno programma e il suo output terminano in un programma diverso. Se hai bisogno di inviare dati da un programma a un altro programma in esecuzione sullo stesso computer, questo può essere un buon metodo da usare.

Se è necessario configurare 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 al metodo interno, elaborarli e restituire una risposta. Sono disponibili numerose librerie per fornire questa funzionalità in varie lingue, 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 cosa sarebbe più adatto alle tue esigenze.

    
risposta data 02.11.2011 - 21:15
fonte
2

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

Nell'esempio che dici, i blocchi non sarebbero qualcosa per il Sistema Operativo da gestire sul file system? Ogni programma non conosce l'altro, ricorda necessariamente.

    
risposta data 02.11.2011 - 21:04
fonte
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.

    
risposta data 02.11.2011 - 21:13
fonte
0

A seconda del tipo di problema, l'uso standard della shell delle pipe potrebbe essere sufficiente (digitare nella shell):

programma1 | program2

In questo modo l'output di program1 va direttamente all'ingresso di program2. Ovviamente questo non funziona per ogni problema, ma molti problemi (non interattivi) possono essere risolti con questo approccio.

    
risposta data 02.11.2011 - 22:43
fonte

Leggi altre domande sui tag