Domanda

Ho sentito alcune persone programmare in più lingue in un progetto. Non riesco a immaginare come le lingue interagiscono tra loro.

Voglio dire che non esiste un metodo Java come

myProgram.callCfunction(parameters);

non succede mai o sbaglio?

È stato utile?

Soluzione

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 con lo stesso codice. Ad esempio, il codice C e C ++ viene in genere compilato nell'assemblatore di macchine o C # e VB.Net viene compilato in IL (il linguaggio compreso dal runtime .NET).

Diventa più difficile se le lingue / i compilatori usano un sistema di tipo diverso. Esistono molti modi diversi, i tipi di dati di base come numeri interi, float e doppi 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 entrambe le parti interpretino il tipo nello stesso modo o, in caso contrario, i tipi siano mappati correttamente. Questo tipo di mappatura dei tipi è anche nota come marshalling .

Esempi classici di interoperabilità tra diverse lingue del programma sono (principalmente dal mondo Windows):

  • Le varie lingue disponibili per la piattaforma .NET. Ciò include C #, VB.Net, J #, IronRuby, F #, XSLT e molte altre lingue meno popolari.
  • I componenti COM nativi scritti in C ++ o VB possono essere utilizzati con una grande varietà di linguaggi: VBScript, VB, tutti i linguaggi .NET, Java
  • Le funzioni API di Win32 possono essere chiamate da .NET o VB
  • IPC (comunicazione tra processi)
  • Corba , probabilmente l'approccio più completo (e più complesso)
  • Servizi Web e altre architetture orientate ai servizi, probabilmente l'approccio più moderno

Altri suggerimenti

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

(Questo, ovviamente, elimina a mano l'argomento sul fatto che HTML e CSS contino o meno come linguaggi di programmazione - io sono il campo "sono, ma semplicemente non linguaggi completi di Turing", ma è tutto altro thread.)

Alcuni esempi di come funzionano tutti insieme:

Se stai seguendo il percorso delle best practice, la struttura di una pagina web è in HTML e le istruzioni su come visualizzarla sono in CSS - che potrebbero trovarsi nello stesso file, ma non è necessario essere. Il CSS contiene un gruppo di classi, a cui fa riferimento l'HTML, e spetta al browser capire come fare clic insieme.

Facendo un ulteriore passo avanti, qualsiasi script javascript su quella pagina può alterare qualsiasi HTML / CSS presente (modificare il contenuto di entità HTML, scambiare una classe CSS con un'altra, cambiare il comportamento del CSS e così via.) Lo fa tramite qualcosa chiamato Document Object Model, che è essenzialmente un'API indipendente dal linguaggio e dalla piattaforma per manipolare le pagine HTML in modo simile a un oggetto (a quel punto torno indietro lentamente e fornisco solo un link al articolo wiki pertinente .)

Ma da dove proviene tutto l'HTML / CSS / Javascript? Questo è ciò che fa la lingua lato server. Nella forma più semplice, il linguaggio lato server è 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 hai l'intera cosa AJAX in cui il javascript arriva a inviare dati direttamente anche nella lingua del server. Puoi anche immaginarti dove la lingua del server può personalizzare HTML, CSS e Javascript che viene sputato - in sostanza, hai un programma in una lingua che scrive un programma in un'altra lingua.

La connessione dalla lingua lato server a SQL funziona più o meno allo stesso modo. Esistono molti modi per renderlo sia più complesso che più sicuro, ma il modo più semplice è che la lingua del tuo server costruisca in modo dinamico una stringa con un comando SQL, lo consegni al database tramite un qualche tipo di connettore e torni indietro un set di risultati. (Questo è un caso in cui hai davvero una funzione che si riduce a someValue = database.executeThisSQLCommand (SQLString).)

Quindi, per concludere, lingue diverse in questo caso comunicano scrivendo effettivamente programmi l'una nell'altra o consegnando i dati in formati molto semplici e facili da analizzare che tutti possono capire. (Principalmente stringhe.)

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

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

La lingua fornisce un meccanismo per l'interoperabilità.

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

Ad esempio:

Posso definire un metodo in C #

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

E posso chiamarlo da Python (IronPython)

 Hello()

E ottieni l'output previsto.

In generale, alcune lingue interagiscono meglio di altre, specialmente se gli autori delle lingue hanno fatto dell'interoperabilità una caratteristica della lingua.

Più lingue possono interagire con:

  1. Input / output con pipe (QUALSIASI linguaggio può farlo perché input e output devono necessariamente essere implementati in ogni non-giocattolo lingua)
  2. La compilazione del codice in una lingua in una libreria nativa mentre l'altro supporta la chiamata del codice nativo.
  3. Comunicazione su una connessione di rete loopback. Puoi incontrare difficoltà con l'interferenza del firewall in questo modo.
  4. Database. Questi possono essere pensati come "universali" dati formato di archiviazione, e quindi accessibile dalla maggior parte delle lingue con estensioni del database. Questo in generale richiede un programma per completare l'operazione prima del programma successivo può accedere al database. Inoltre, tutte le "comunicazioni" lo sono generalmente scritto su disco.
  5. Se le lingue coinvolte vengono eseguite sullo stesso runtime (ad es. .NET, JVM), quindi in genere è possibile passare i dati degli oggetti da una lingua direttamente all'altro con poca impedenza.

In quasi tutti i casi, devi convertire qualsiasi comunicazione in un comune formato prima che possa essere scambiato (l'eccezione sono le lingue sul stessa autonomia). Questo è il motivo per cui più lingue sono usate raramente in una progetto.

Lavoro a un grande progetto di impresa che comprende (all'ultimo conteggio) circa 8 lingue. La maggior parte delle comunicazioni avviene tramite un bus messaggi a livello aziendale che contiene collegamenti per più lingue per attingere e trasmettere i dati avanti e indietro. Si chiama tibco .

Potresti avere un'app in cui la maggior parte del lavoro viene eseguita in Java, ma potrebbe esserci una parte di essa, come forse un parser di dati o qualcosa è scritto in Python o cosa hai. Quasi due app separate in realtà, forse il parser sta solo facendo un po 'di lavoro sui file e quindi la tua app principale in Java le sta usando per qualcosa. Se qualcuno mi chiedesse cosa ho usato in questo progetto direi " Java e Python. & Quot;

Esistono molti modi diversi per utilizzare lingue diverse in un progetto Ci sono due categorie principali che vengono in mente

  1. Uso di diverse lingue insieme per creare un'applicazione. Ad esempio, usare Java per costruire la GUI e usare JNI per accedere all'API C (quindi per rispondere alla tua domanda puoi chiamare le funzioni C da Java;))
  2. Uso di lingue diverse insieme in un unico progetto ma non fanno parte della stessa applicazione. Per esempio. Attualmente sto lavorando su un'app per iPhone che utilizza una grande quantità di testo. Attualmente sto usando tre lingue Python (per lavorare con le fonti originali del testo), SQL (per mettere i risultati dell'app python in un formato facilmente accessibile da iPhone sqlite3 api) e Objectiv C per costruire l'app attuale. Anche se il prodotto finale sarà solo l'obiettivo C, ho usato altre due lingue per arrivare al prodotto finale

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

  • Puoi scrivere una DLL in, diciamo, C, e poi usare quella libreria da, diciamo, un programma VB.
  • Potresti scrivere un programma server in, diciamo C ++, e avere molte implementazioni linguistiche diverse del client.
  • Un progetto Web utilizza spesso molte lingue; ad esempio un programma server, scritto, diciamo, Java (un linguaggio di programmazione), che recupera i dati da un database usando 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) ...

Dipende dal tipo di progetto. Se si desidera sperimentare, è possibile impostare un progetto Web, in .NET, e cambiare la lingua pagina per pagina. Non funziona come mostrato nel tuo pseudocodice, ma è più lingue. Ovviamente, la directory del codice attuale deve essere in una sola lingua.

Esistono due modi in cui il codice nelle lingue può interagire direttamente. Finché i dati che vengono passati tra il codice sono nel formato giusto, a livello di bit e byte, non c'è motivo per cui lingue diverse non possano interagire. Questo approccio viene utilizzato nello sviluppo di DLL Windows tradizionale. Anche su piattaforme diverse, se riesci a ottenere il formato corretto (guarda big / little endian se interessati) funzionerà fino a quando il tuo linker (non compilatore) saprà unire il codice insieme.

Oltre a ciò ci sono molti altri modi in cui le lingue possono parlarsi. Nel codice mondiale .Net è compilato in codice IL, che è lo stesso per ogni lingua, in questo modo C #, VB.Net sono tutti uguali sotto il cofano e possono chiamare / lavorare l'uno con l'altro senza soluzione di continuità.

male. Se non vi è alcuna necessità urgente, attenersi a una sola lingua. Stai aumentando dipendenze e complessità. Ma quando hai un codice esistente che fornisce funzionalità interessanti, può essere più facile incollarlo insieme che ricrearlo.

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top