2009-03-11 15 views
44

Sono un giovane quindi ho molto da imparare :)
Una domanda che mi è rimasta impressa nella mente: ho sentito alcune persone programmare in più lingue in un unico progetto. Non riesco a immaginare come le lingue interagiscano tra loro .Come interagiscono più lingue in un progetto?

io non intendo un metodo Java come

myProgram.callCfunction(parameters); 

non succede mai .. o mi sbaglio? :)

risposta

21

Avere più lingue in un progetto è in realtà abbastanza comune, tuttavia i principi alla base non sono sempre semplici.

Nel caso semplice, diverse lingue vengono compilate sullo stesso codice. Ad esempio, il codice C e C++ viene tipicamente compilato in machine assembler o C# e VB.Net è compilato in IL (il linguaggio compreso dal runtime .NET).

Diventa più difficile se le lingue/i compilatori utilizzano un sistema di tipo diverso. Ci possono essere molti modi diversi, i tipi di dati di base come il numero intero, il float e il doppio sono rappresentati internamente, e ci sono ancora più modi per rappresentare le stringhe. Quando si passano i tipi tra le diverse lingue, è necessario assicurarsi che entrambi i lati interpretino il tipo allo stesso modo o, in caso contrario, che i tipi siano mappati correttamente. Questo tipo di mapping dei tipi è noto anche come marshalling.

classici esempi di interoperabilità tra diversi linguaggi di programmazione sono (per lo più dal mondo Windows):

  • Le varie lingue disponibili per il platfrom .NET. Ciò include C#, VB.Net, J #, IronRuby, F #, XSLT e molte altre lingue meno popolari.
  • componenti COM nativi scritto in C++ o VB può essere utilizzato con una grande varietà di lingue: VBScript, VB, tutti i linguaggi .NET, Java
  • funzioni API Win32 può essere chiamato da .NET o VB
  • IPC (comunicazione di processo inter)
  • Corba, probabilmente l'approccio più completo (e complessa)
  • servizi Web e altre architetture orientate ai servizi, probabilmente l'approccio più moderno
+1

Posso chiedere quali sono i componenti COM nativi? – Dan

+0

È buona norma chiamare gli script Python dal codice C# nel progetto di grandi dimensioni? – amrit

+0

@amrit: questo dipende totalmente. Naturalmente, il mescolare le tecnologie in un progetto ha sempre un certo costo, ma questo costo può essere facilmente compensato dal costo di (ri) implementazione delle funzionalità esistenti. Quindi potrebbe essere perfettamente ragionevole integrare le librerie Python esistenti in un codice C#. –

0

Dipende dal tipo di progetto. Se vuoi sperimentare, puoi impostare un progetto web, in .NET, e cambiare la lingua in base alla pagina. Non funziona come mostri nel tuo pseudocodice, ma è in più lingue. Ovviamente, la directory del codice reale deve essere una singola lingua.

6

Più lingue in uso sono denominate "interoperabilità" o "interoperabilità" in breve.

Il tuo esempio è sbagliato. Java può chiamare le funzioni C.

Il linguaggio fornisce un meccanismo per l'interoperabilità.

Nel caso di .NET, le lingue vengono compilate in IL come parte della CLI. Quindi qualsiasi linguaggio .NET può interoperare (chiama metodi definiti da) moduli definiti in qualsiasi altro linguaggio .NET.

Per fare un esempio:

posso definire un metodo in C#

static void Hello(){ Console.WriteLine("Hello World");} 

E posso chiamare da Python (IronPython)

Hello() 

E ottenere i risultati attesi.

In generale, alcune lingue sono meglio di altre, specialmente se gli autori della lingua specificano in particolare una funzione della lingua.

1

Si potrebbe avere un'app in cui la maggior parte del lavoro viene eseguita in Java, ma potrebbe esserne una parte, come forse un parser di dati o qualcosa è scritto in Python o cosa si ha. Quasi due app separate, forse il parser sta solo lavorando sui file e quindi la tua app principale in Java li sta usando per qualcosa. Se qualcuno mi chiedesse cosa ho usato in questo progetto, direi "Java e Python".

+0

ok.grantato. questo è un modo .. come le lingue possono interagire BUT: quando sa il programma Python, c'è qualcosa da analizzare ... e quando l'app principale lo sa, che il parser è appena finito? – n00ki3

+0

Ok, ecco un esempio. Una società per cui lavoravo aveva un'app parser su una rete che ascoltava le richieste in entrata per analizzare i dati. Il parser ha appena ascoltato le richieste da un'altra app, quindi ha analizzato e spostato i dati. Il parser è stato scritto in C, l'app in C#. – Carter

+0

Ok, capito .. grazie :) – n00ki3

0

ci sono molti diffe modi RNT è possibile utilizzare lingue differnt in un progetto Ci sono due categorie principali che vengono in mente

  1. Utilizzando diverse lingue insieme per costruire una sola applicazione. Ad esempio, utilizzando Java per creare la GUI e utilizzare JNI per accedere all'API C (in modo da rispondere alla domanda è possibile chiamare le funzioni C da Java;))
  2. Utilizzo di lingue diverse insieme in un progetto ma non fanno parte della stessa applicazione . Per esempio. Attualmente sto lavorando a un'app per iphone che ha utilizzato una grande quantità di testo. Attualmente sto usando Python in tre lingue (per lavorare con i sorgenti origanal del testo), SQL (per mettere i risultati dell'applicazione python in un formato facilmente accessibile da iphone sqlite3 api) e Objectiv C per costruire l'app vera e propria. Anche se il prodotto finale sarà solo Objective C, ho utilizzato altre due lingue per ottenere il prodotto finale
0

Ci sono un paio di modi in cui il codice nelle lingue può interagire direttamente. Finché i dati che vengono trasmessi tra il codice è nel formato corretto, a livello di bit e byte, non vi è alcun motivo per cui linguaggi diversi non possano essere sottoposti a interoperabilità. Questo approccio è utilizzato nello sviluppo tradizionale di Windows DLL. Anche su piattaforme diverse, se riesci a ottenere il formato corretto (guarda big/little endian se interessato) funzionerà finché il tuo linker (non compilatore) sa come unire il codice insieme.

Oltre a ciò ci sono molti altri modi in cui le lingue possono comunicare tra loro. Nel codice .Net World è compilato il codice IL, che è lo stesso per ogni lingua, in questo modo C#, VB.Net sono tutti uguali sotto la cappa e possono chiamare/lavorare tra loro senza problemi.

1

Ci sono vari modi in cui più lingue possono essere utilizzate in un progetto. Alcuni esempi:

  • È possibile scrivere una DLL in, ad esempio, C, e quindi utilizzare tale libreria, ad esempio, da un programma VB.
  • Si potrebbe scrivere un programma server in, ad esempio C++, e avere molte implementazioni linguistiche differenti del client.
  • Un progetto Web spesso utilizza molte lingue; ad esempio un programma server, scritto in, per esempio, Java (un linguaggio di programmazione), che recupera dati da un database utilizzando SQL (un linguaggio di query), invia il risultato al browser in HTML (un linguaggio di markup), che l'utente può interagire con l'utilizzo di Javascript (un linguaggio di scripting) ...
0

Male. Se non vi è alcuna necessità urgente, attenersi a una sola lingua. Stai aumentando le dipendenze e la complessità. Ma quando il codice esistente offre funzionalità interessanti, può essere più facile incollarlo insieme piuttosto che ricrearlo.

0

Solo per aggiungere all'elenco di esempi, è abbastanza comune ottimizzare il codice Python in C o C++ o scrivere una libreria C per associare un'altra libreria a Python.

10

Generalmente, qualsiasi progetto web di dimensioni decenti utilizzerà circa cinque lingue: HTML, CSS, Javascript, un tipo di linguaggio sul "fare le cose" lato server (ASP, JSP, script CGI con Perl, PHP, ecc.) e alcune varianti di SQL per la connettività del database.

(Questa è, naturalmente, la mano che saluta la discussione sul fatto che HTML e CSS contino o meno come linguaggi di programmazione - io sono il campo "sono, ma solo non turing-completi", ma quello è un intero altro thread)

Alcuni esempi di come tutti coloro che lavorano insieme:.

Se stai andando il percorso best practice, la struttura di una pagina web è in formato HTML, e le istruzioni per come visualizzare è in CSS - che potrebbe essere nello stesso file, ma non deve essere. Il CSS contiene un mucchio di classi, a cui si riferisce l'HTML, e tocca al browser capire come fare clic su di esse.

Facendo un ulteriore passo avanti, qualsiasi script javascript su quella pagina può alterare qualsiasi HTML/CSS presente (cambia il contenuto delle entità HTML, scambia una classe CSS con un'altra, cambia il comportamento del CSS, e così via.) Lo fa tramite qualcosa chiamato Document Object Model, che è essenzialmente un'API indipendente dalla lingua e dalla piattaforma per manipolare le pagine HTML in modo object-like (a quel punto mi arrenderò lentamente e fornirò solo un link al relevant wiki article.)

Ma allora, da dove viene tutto l'HTML/CSS/Javascript? Questo è ciò che fa il linguaggio lato server. Nella forma più semplice, il linguaggio lato serer è un programma che restituisce una stringa gigante che contiene una pagina HTML come output. Questo, ovviamente, può diventare molto più complesso: i moduli HTML e i parametri della stringa di query possono essere utilizzati come input per il nostro programma lato server, e quindi si ha l'intera cosa AJAX in cui il javascript arriva a inviare i dati direttamente alla lingua del server. Puoi anche essere fantasioso dove la lingua del server può personalizzare l'HTML, il CSS e il Javascript che vengono sputati - in sostanza, hai un programma in una lingua che scrive un programma in un'altra lingua.

La connessione tra linguaggio SQL e lato server funziona in modo analogo. Ci sono molti modi per renderlo sia più complesso che più sicuro, ma il modo più semplice è per la lingua del tuo server di creare dinamicamente una stringa con un comando SQL, passarla al database tramite una sorta di connettore e tornare indietro un set di risultati. (Questo è un caso in cui si ha veramente una funzione che si riduce a someValue = database.executeThisSQLCommand (SQLString).)

Quindi, per concludere, lingue diverse in questo caso comunicano effettivamente scrivendo programmi l'uno nell'altro o distribuendo i dati in modo molto semplice e facile da analizzare i formati che tutti possono comprendere. (Archi, principalmente.)

+0

A meno che non si usi Seaside on Gemstone (GLASS) Smalltalk. Raggiunge il suo ordine di grandezza migliorando la produttività facendo tutto nel linguaggio lato server. –

0

Lavoro su un grande progetto aziendale che comprende (all'ultimo conteggio) circa 8 lingue. La maggior parte della comunicazione avviene tramite un bus di messaggi a livello aziendale che contiene binding per più lingue da utilizzare e trasmettere dati avanti e indietro. Si chiama tibco.

4

Più lingue possono interagire con:

  1. ingresso di sottofondo/uscita (qualsiasi lingua può fare questo perché ingresso e uscita devono necessariamente essere implementate in ogni non-giocattolo lingua)
  2. codice Tenendo una lingua viene compilata in una libreria nativa mentre l'altra supporta la chiamata del codice nativo.
  3. Comunicazione su una connessione di rete loopback. È possibile eseguire in questo modo con l'interferenza del firewall.
  4. Database. Questi possono essere considerati come un formato di archiviazione "universale" dei dati e quindi sono accessibili dalla maggior parte delle lingue con le estensioni del database. Generalmente questo richiede che un programma finisca di funzionare prima che il prossimo programma possa accedere al database. Inoltre, tutte le "comunicazioni" sono generalmente scritte su disco.
  5. Se le lingue coinvolte vengono eseguite sullo stesso runtime (ad esempio .NET, JVM), in genere è possibile passare i dati oggetto da una lingua direttamente all'altra con poca impedenza.

In quasi tutti i casi, è necessario convertire qualsiasi comunicazione a un formato comune prima di poter essere scambiato (l'eccezione è lingue sul stesso tempo di esecuzione). Questo è il motivo per cui più lingue vengono utilizzate raramente in un progetto .

Problemi correlati