È possibile combinare i linguaggi di programmazione?


27

Sto programmando da un po ', ho scritto alcuni programmi rudimentali e voglio continuare ad imparare. Ho raggiunto quel punto in cui semplicemente non sai cosa imparare dopo, e vorrei fare una domanda per la mia curiosità.

La domanda, in breve, è se è possibile combinare più linguaggi di programmazione in 1 risultato? Ad esempio, questo codice può essere possibile?

<html>
cout << "Hello world!";
</html>

o

import java.util.Scanner;
cout << "Insert a number from 1 to 10";
Scanner n = new Scanner(System.in);
System.out.println("The value you entered was" +n.newLine());

Sembra una domanda sciocca ma non posso sapere se sia possibile o meno, quindi è per questo che lo sto chiedendo. In questa domanda noto che sta usando il codice Python in codice HTML, se il mio esempio sopra non è possibile, cosa ha fatto?


12
Affinché ciò funzioni (senza far impazzire le persone), sono necessarie almeno regole rigorose su come interagiscono e su quali parti devono essere elaborate come lingua.

6
Ci vorrebbe un lexer / parser hellova.
Chad Harrison,

2
@Brian Lua è incorporato in quanto l'interprete è collegato in un codice C o C ++ e utilizzato per eseguire il codice Lua memorizzato in stringhe o file esterni, esponendo eventualmente oggetti C / C ++ al codice Lua. Lua non è (non frequentemente, se non del tutto) "incorporato" nel senso di questa domanda.

2
È come creare cinque alfabeti ciascuno con simboli diversi per le 26 lettere e mescolarli in un unico libro: inutile, irritante e ridondante.
ThomasX,

7
Penso che le persone stiano chiaramente dimenticando il caso d'uso più comune (e solo valido nella vita reale a cui riesco a pensare) di "combinare le lingue" - frammenti di ASM nei programmi C / C ++ , di solito per motivi di prestazioni.
TC1,

Risposte:


43

Il tuo primo esempio è in qualche modo possibile. Di solito queste cose accadono in PHP (e in altri linguaggi di programmazione web correlati) come questo:

<HTML>
<?PHP
call_some_php_function(1,2,"a","b"); /* This is may return nothing, a text string, or actual HTML markup code */
?>
</HTML>

Alcuni punti importanti da notare su questo esempio:

  • L'HTML NON è un linguaggio di programmazione, è un linguaggio di markup.
  • PHP e HTML e non eseguiti / interpretati nello stesso posto: il codice PHP viene eseguito da un interprete PHP in esecuzione sul server e il risultato viene "iniettato" nell'HTML circostante. Quindi l'intero BLOB viene inviato al client / browser che esegue il rendering dell'HTML completo.

Il tuo secondo esempio sembra una sorta di mash-up di C ++ e Java. È possibile che moduli compilati scritti in lingue diverse parlino tra loro, ma combinare Java e C ++ nello stesso file sorgente sarebbe estremamente confuso e difficile: come farà il compilatore a sapere quali istruzioni sono Java e quali sono C ++?

Suppongo che in teoria potresti scrivere un compilatore / pre-processore speciale con indicatori "linguistici" come:

Java
{
    import java.util.Scanner;
}
C++
{
   cout << "Insert a number from 1 to 10";
}
Java
{
    Scanner n = new Scanner(System.in); //Actually, this line *could* be a C++ line - it's hard for me to tell just by looking at it.
    System.out.println("The value you entered was" +n.newLine());
}

Ma onestamente non sono sicuro che otterresti qualcosa di utile facendo questo.

Inoltre, in che modo questo ambiente linguistico ibrido gestirà funzionalità linguistiche incompatibili tra i due?


Un esempio tutti dimenticato (me compreso), quindi non esitate a aggiungerlo alla tua risposta: CUDA. È una combinazione di due linguaggi C molto diversi, con alcune funzioni compilate per un dispositivo (GPU) e alcune rimanenti su un host, con il livello di comunicazione inferito.
Logica SK

7
Non è raro avere JavaScript, HTML e PHP su una pagina. Orribile, ma non raro.
Michael Borgwardt,

1
Non così familiare con PHP, ma il codice ASP.NET (sia C # che VB.NET) genera HTML e JavaScript - e il JavaScript è spesso incorporato proprio lì nella pagina .aspx. La separazione totale viene spesso citata come ideale, ma una rapida panoramica delle domande su ASP.NET con tag SO ti darà un'idea di quanto possa essere complesso.
sq33G,

@ sq33G - ASP.NET genera codice HTML. Se lo desideri, puoi includere JavaScript. ASP.NET certamente NON è ciò che l'autore descrive come voler fare.
Ramhound,

Stavo per far apparire PHP / HTML / JS in un documento se nessun altro lo avesse fatto.
Ben Brocka,

19

Risposta breve

Non proprio.


Risposta lunga

Embedding

Generalmente, un singolo file sorgente contiene codice esattamente per un linguaggio di programmazione. È raro che più lingue vengano combinate in un singolo file per un paio di motivi:

  • L'analisi simultanea di più lingue sintatticamente diverse è estremamente difficile (se non addirittura impossibile).
  • Lingue diverse trattano la programmazione in modo diverso . La nozione di funzione di Haskell è diversa da quella di C ++.

Collegamento

Diversi linguaggi di programmazione che condividono un'interfaccia binaria di un'applicazione comune possono essere combinati per formare un singolo eseguibile o libreria. Ottenere le firme delle due lingue disponibili l'una dentro l'altra spesso richiede un po 'di lavoro, ma esistono strumenti per facilitare il processo.

poliglotti

Il codice Polyglot è valido ed equivalente in più di una lingua. La pagina 404 di Stack Overflow presenta uno di questi programmi:

Stack Overflow 404 poliglotta

Questo stampa "404" in Python, Perl, Ruby, C, Brainfuck e Befunge.

Conclusione

Le lingue sono raramente mescolate all'interno dei file e, quando lo sono, è per ridere . Le persone cercano persino di evitare di mescolare le lingue all'interno dei progetti a causa della seccatura aggiuntiva che introduce. Quindi, mentre può essere tecnicamente possibile, mescolare lingue diverse non è né comune né pragmatico.


Non vedo Ruby qui ...
Jason Lewis,

@JasonLewis Non conosco Ruby, ma questo post dice che valuta la linea # 4.
Maxpm

9
Le lingue non sono sempre miste per le risate. La maggior parte dei compilatori C ti consente di mescolare Assembly e C, così come molti Forth. Negli anni Ottanta, uno dei migliori dialetti BASIC del gioco, BBC Basic di Acorn, ti ha permesso di mescolare l'assemblaggio 6502 e questa era una caratteristica molto desiderabile. Certamente ha fatto ridere gli utenti della BBC, ma praticamente tutti gli altri hanno pianto, specialmente quelli che hanno dovuto assemblare a mano 6502 codice macchina e inserire codici operativi grezzi nei loro programmi nelle DATAdichiarazioni. Non che io sia amaro o niente. Noooo.
Alessio,

1
@ SK-logic SQL è un linguaggio di query strutturato, non un linguaggio di programmazione.
Max.

1
Una delle cose tristi dello sviluppo di software moderno è che le app in più lingue sono ora molto più difficili. Ai tempi di DOS, quasi tutto veniva compilato nello stesso file oggetto e utilizzava lo stesso parametro passando convenzioni. È stato davvero semplice collegarli insieme. Al giorno d'oggi, non tanto ...
Brian Knoblauch,

7

Sì, è davvero possibile. Non come l'hai immaginato, ovviamente. Ci sono alcune lingue là fuori costruite appositamente per questo scopo.

In pratica, potrebbe essere molto utile mescolare un numero di lingue specifiche del dominio in una singola lingua host. Raramente è necessario mescolare due o più lingue ugualmente "generiche" insieme in un singolo file di codice sorgente, sebbene spesso troverai progetti scritti in entrambi, diciamo, VB.NET e C #, con componenti linguistiche diverse compilate separatamente.

Per quanto riguarda HTML, è solo un linguaggio di markup. Spesso potresti trovare un codice lato server (ad esempio, in VB.NET), markup HTML e codice Javascript lato client mescolati in un singolo file di origine, sebbene sia considerato una cattiva pratica da molti.


7

Questo è spesso chiamato codice poliglotta - ci sono alcuni esempi divertenti / folli se segui il link o in vari altri luoghi sul web. La maggior parte di questi sono solo per divertimento / per dimostrare che è possibile.

Più seriamente, ci sono vari esempi di vita reale in cui due o più lingue diverse possono essere utilmente combinate:

  • Templating Web : linguaggi come file PHP o JSP mescolano il codice in HTML. Le opinioni differiscono ampiamente sul fatto che questa sia una buona idea o meno.
  • Linguaggi macro : spesso un linguaggio macro viene mischiato nel file di origine, ad esempio macro preprocessore C / C ++. Ci sono anche casi interessanti come Lisp in cui il linguaggio macro è esso stesso Lisp (l'unica differenza è se il codice viene eseguito in fase di compilazione o runtime)
  • DSL : spesso viene definita una lingua specifica del dominio per aiutare a risolvere efficacemente un particolare problema, che è incorporato nel codice sorgente di un'altra lingua. Ecco un esempio di un bellissimo DSL per SQL che può essere incorporato nel codice Clojure.
  • Scripting : alcuni linguaggi dinamici sono particolarmente utili per gli script brevi e sono progettati per essere incorporati in un software scritto in un'altra lingua. Gli script Groovy, ad esempio, sono molto facili da incorporare in un'applicazione Java.
  • Progetti Polyglot - a volte ha senso usare più lingue solo per sfruttare le diverse capacità di ciascuna. Ad esempio, JVM supporta più lingue che possono interagire in modo abbastanza trasparente, quindi è possibile mescolare Java (per velocità e OOP tipicamente statici) con Clojure (per sviluppo interattivo, concorrenza e programmazione funzionale). Tali progetti in genere separano ancora le diverse lingue in file / cartelle di origine separati, ma vengono compilati contemporaneamente per produrre un'unica applicazione.

6

È possibile eseguire una combinazione di lingue utilizzando Perl Inline che consente di scrivere uno script Perl e inserire sezioni di codice scritte in una lingua diversa:

Inline ha supporto per C, C ++, Java, Python, Ruby, Tcl, Assembler, Basic, Guile, Befunge, Octave, Awk, BC, TT (Template Toolkit), WebChat e persino PERL


Non avevo mai sentito parlare di Perl Inline. È un'idea interessante, ma offre qualche vantaggio rispetto a quello che è probabilmente il solito approccio di avere moduli separati per il codice non PERL?
FrustratedWithFormsDesigner,

1
@FrustratedWithFormsDesigner: Inline Perl è un ottimo modulo, ma presenta alcuni difetti. Funziona bene, ma solo nella misura di un codice abbastanza semplice. Anche se è stato lavorato per un po ', non lo userei in nessun tipo di produzione.
Dinamico

3

SQL incorporato era un modo comune per incorporare istruzioni SQL in programmi di altre lingue.

In questi giorni è stato sostituito quasi interamente da un accesso al database basato su API più facile da compilare che non ha bisogno di modificare la lingua host, ma utilizza invece le sue normali capacità.


1
In questi giorni un SQL incorporato è tornato in forma di LINQ, ed è qui per rimanere.
Logica SK

@ SK-logic: com'è LINQ qualcosa come SQL incorporato? Non è una lingua diversa, è semplicemente l'applicazione di costrutti linguistici aggiuntivi nella lingua host.
Joachim Sauer,

LINQ è un DSL incorporato molto tipico, semanticamente estraneo alla sua lingua host. E, nel caso di LINQ2SQL, si comporta esattamente come il vecchio SQL incorporato, viene tradotto letteralmente in SQL.
SK-logic,

Ma SQL incorporato non è "tradotto in SQL". Scrivi l' SQL letterale all'interno del tuo codice C (e di solito non all'interno delle costanti di stringa). Anche se LINQ utilizza funzionalità linguistiche che (per quanto ne so) sono state sviluppate appositamente per LINQ è "solo" un'API nella sua lingua host.
Joachim Sauer,

1
Pro C e Pro Fortran hanno tradotto un po 'le istruzioni SQL. E LINQ non è "solo" un'API, è un'API con zucchero di sintassi e un sacco di back-end di compilatore intercambiabili. Il che lo rende un perfetto esempio di DSL integrato completo.
Logica SK

2

Diversi linguaggi di programmazione possono essere utilizzati per formare 1 exe. Un modo è usare le DLL. Naturalmente ci sono varie preoccupazioni al riguardo. Ad esempio, compatibilità dei parametri, compatibilità COM e simili. In effetti, se pensi a come chiami un sistema di database per farti lavorare, potresti scoprire che il DBMS non è sempre scritto in una lingua che conosci. Probabilmente non ti interessa nemmeno finché l'interfaccia è nota.

Questo concetto viene ulteriormente approfondito quando la soluzione utilizza i servizi Web, che è anche un modo più pulito di combinare più componenti software.

Nel mondo .NET, tutto quanto sopra si applica, più oltre, a livello di interfaccia le interfacce XAML e HTML possono vivere insieme in Silverlight.

Nel mondo UNIX, una volta, abbiamo usato gli script KShell per avviare i programmi C ++ e COBOL in modo che la soluzione potesse funzionare.


2

Penso che varrebbe la pena menzionare Cython qui. È un superset di Python per la scrittura di estensioni C e sebbene sia davvero un linguaggio unico in sé, ti permette praticamente di usare il codice C nel codice Python, se sei conforme alla sintassi dello stile Python di Cython


0

Esempi di combinazione di linguaggi: Jython (python in Java), Cog (python usato come generatore di codice incorporato praticamente in qualsiasi cosa). Ho spesso usato il codice Perl per generare C ++, se conti la generazione del codice.


0

Il framework .NET è stato creato per consentire a più lingue di partecipare a un'unica soluzione. Funziona finché la lingua può produrre un codice byte compatibile con CLR.

http://www.geekinterview.com/question_details/1047


Non credo sia questo il significato del poster originale. Il bytecode risultante ha ben poco a che fare con il modo in cui è stato scritto nella lingua da cui è stato compilato.
perdian

Non credo che tu abbia capito la domanda. L'autore sta parlando di combinare più lingue in un file oscuro.
Craige

0

È molto difficile, molto brutto e spesso inutile combinare più linguaggi di programmazione in 1 file.

È comunque possibile avere un grande progetto scritto in più di 1 lingua. Ad esempio, sia Mozilla Firefox che MySQL contengono codice C e C ++. Quando si tratta di grandi progetti, questa pratica viene spesso utilizzata perché un determinato linguaggio fornisce alcune funzionalità che un altro non offre. In PHP, ad esempio, puoi chiedere l'esecuzione di un eseguibile binario, prendere il suo risultato e usarlo nel tuo codice PHP da quel momento in poi.

Se sei curioso di sapere quali lingue vengono utilizzate per alcuni dei più importanti progetti open source al mondo, puoi dare un'occhiata Ohloh.net. Qui puoi trovare statistiche sul codice sorgente di molti progetti.


-1

Puoi "mescolare" le lingue in HTML. In realtà è importante per il funzionamento di molti siti Web che è possibile incorporare JavaScript in HTML. Ma ovviamente l'HTML è markup, non un linguaggio di programmazione.

Penso che fare ciò che proponi significherebbe comunque scrivere una nuova lingua. O dovresti creare un interprete / compilatore che parlasse tutte quelle lingue e potesse inquadrarle in modo coerente, o avresti bisogno di un modo di valutare esplicitamente riga per riga in quella che sarebbe una meta-lingua. Queste due opzioni sono sostanzialmente le stesse ad eccezione di ciò che il programmatore deve fare per far lavorare insieme le lingue.


+1 sulla miscelazione di linguaggi in HTML, ma personalmente credo che sia più pulito mantenere separati HTML / CSS e JS. I web designer possono fare le loro cose senza cercare di sfuggire a JavaScript che è incorporato in tutto il sito.
jmort253,

Puoi mescolare le lingue in HTML, ma non molti di loro sono linguaggi di programmazione , che è l'argomento a portata di mano.
Alexios,

Eh? Javascript non è un linguaggio di programmazione? PHP? Ho anche visto iniezioni di perl e python sebbene fosse con i moduli Apache.
markw

-1

La lingua è uno strumento. Prima di scegliere uno strumento (inoltre, realizzando una strana combinazione hummer-PC-spettroscopio) ci si dovrebbe chiedere: che cosa è esattamente che voglio fare ?? Una volta data la risposta, scoprirai che questo tipo di combinazione linguistica è raramente necessaria.


-3

Sì, è possibile mescolare i linguaggi di programmazione purché l'interprete / il compilatore lo capisca. Ad esempio mescolando javascript, PHP, python in HTML o C ++ in C #.

Mescolare le lingue può rendere più difficile leggere e modificare il codice, tuttavia, quindi deve essere fatto con cautela. Un modo per aggirare questo è creare file separati per il codice nella lingua che devi chiamare e importarlo anziché incorporarlo.

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.