Perché vengono utilizzati più linguaggi di programmazione nello sviluppo di un prodotto o software?


114

Sono uno studente di recente laurea con l'obiettivo di iniziare il mio Master in Informatica. Mi sono imbattuto in più progetti open source che mi incuriosiscono e mi incoraggiano a contribuire a loro (CloudStack, OpenStack, moby e Kubernetes per citarne alcuni). Una cosa che ho scoperto che la maggior parte di loro ha in comune è l'uso di più linguaggi di programmazione (come Java + Python + Go o Python + C ++ + Ruby). Ho già esaminato questa altra domanda, che tratta di come vengono fatti più linguaggi di programmazione per comunicare tra loro: come interagire due diverse programmazioni con due lingue diverse?

Voglio comprendere il requisito che richiede alle aziende di utilizzare più linguaggi di programmazione. Quale requisito o tipo di requisito fa dire all'architetto software o al responsabile del progetto "sto proponendo di usare la lingua X per l'attività 1 e la lingua Y per l'attività 2"? Non riesco a capire il motivo per cui più linguaggi di programmazione sono utilizzati nello stesso prodotto o software.


14
Come studente laureato in ingegneria informatica, aggiungerò che per il codice di ricerca in particolare, spesso si tratta di "quale lingua conosceva meglio l'autore (studente) quando ha iniziato". I progetti di ricerca, in particolare quelli una tantum che non portano a progetti di ricerca più grandi, tendono a valutare i risultati rispetto alla "correttezza" (nella mia esperienza).
tonysdg

16
@tonysdg: Direi che la "correttezza" tende ad essere più rilevante nel mondo accademico, non meno. Ciò che generalmente non è rilevante è la manutenibilità, l'esperienza dell'utente e / o la documentazione. Mescolare le lingue in particolare influenza la manutenibilità; limita il numero di manutentori qualificati.
Salterio

2
@MSalters: Manutenibilità è la parola che penso stavo cercando in quel momento --- Sono d'accordo con tutto ciò che hai scritto!
tonysdg

19
Strumenti diversi per compiti diversi. Noterai che architetti e ingegneri edili usano strumenti diversi per costruire una casa.
Paul D. Waite,

17
Quando vai in vacanza, da casa tua all'aeroporto, poi all'aeroporto straniero, poi in hotel, poi in spiaggia, usi lo stesso mezzo di trasporto per ogni tappa del viaggio?
Corse di leggerezza in orbita

Risposte:


17

Questa risposta ha una superba copertura e collegamenti sul perché diverse lingue possono offrire vantaggi distinti a un progetto. Tuttavia, c'è molto di più della semplice idoneità linguistica per cui i progetti finiscono per usare più lingue.

I progetti finiscono per utilizzare più lingue per sei motivi principali:

  1. Vantaggi economici del riutilizzo del codice scritto in altre lingue;
  2. La necessità di includere e accogliere il codice legacy;
  3. Disponibilità di programmatori per lingue specifiche;
  4. La necessità di lingue speciali per esigenze speciali;
  5. Pregiudizi linguistici legacy; e
  6. Cattiva gestione del progetto (uso multilingue non pianificato).

Le ragioni 1-4 sono ragioni positive nel senso che affrontarle direttamente può aiutare un progetto a concludersi più velocemente, in modo più efficiente, con un prodotto di qualità superiore e con un supporto a lungo termine più semplice. I motivi 5 e 6 sono negativi, sintomi di resistenza ai cambiamenti necessari, scarsa pianificazione, gestione inefficace o una combinazione di tutti questi fattori. Sfortunatamente, questi fattori negativi sono cause comuni dell'uso multilingue "accidentale".

La ragione 1 , i vantaggi in termini di costi del riutilizzo, è diventata una ragione sempre più potente per consentire l'uso di più lingue in un progetto sia per il ruolo maggiore del software open source sia per le migliori capacità di trovare i giusti componenti di codice sul web. La filosofia "decifriamo tutto internamente" degli ultimi decenni continua a svanire di fronte alle realtà economiche e non è sostanzialmente l'approccio più conveniente per qualsiasi nuovo progetto. Ciò a sua volta rende meno comuni le opportunità per un'applicazione rigorosa dell'uso di una sola lingua all'interno di un progetto.

Soprattutto nel caso di un progetto che riutilizzi componenti open source ben gestiti, l'uso di più lingue può offrire enormi vantaggi in termini di costi complessivi poiché i componenti riutilizzati sono entrambi nascosti dietro interfacce ben progettate e gestiti indipendentemente da gruppi esterni a costo zero. Negli scenari migliori, la miscelazione delle lingue tramite questo tipo di riutilizzo non è più costosa per il progetto rispetto all'utilizzo dei componenti del sistema operativo. Non conosco un esempio migliore del valore di questo approccio rispetto all'adozione su larga scala di software open source da parte di Microsoft nei loro browser.

Il motivo 2 , la necessità di inserire il codice legacy, viene ignorato a rischio di qualsiasi progetto di grandi dimensioni. Per quanto possano causare molti problemi il codice legacy, assumere ingenuamente che possa essere facilmente sostituito con un nuovo codice in una nuova lingua può essere incredibilmente rischioso. Il codice legacy, anche un codice legacy errato, spesso include ciò che equivale a un "contratto" implicito di funzionalità previste dalla comunità che utilizza il prodotto legacy. Quella comunità abbastanza spesso è una delle principali fonti di entrate per un'azienda o il principale obiettivo di supporto per i software governativi. Scartare semplicemente quel contratto implicito può inseguire i clienti consapevoli a frotte e può far fallire una società durante la notte se altre opzioni sono prontamente disponibili.

Allo stesso tempo, non sostituire il vecchio codice in una vecchia lingua può essere pericoloso quanto sostituirlo all'ingrosso. Un esempio nel caso peggiore è l'amministrazione americana dei veterani, che ha un gran numero di sistemi vitali codificati in una lingua chiamata MUMPS (senza scherzi) progettata da medici, non da informatici. Nessuno vuole imparare MUMPS e quelli che lo sanno stanno letteralmente morendo. I programmatori devono quindi adattarsi a MUMPS anche se cercano di passare ad altri linguaggi più comuni, più potenti e meglio gestiti.

Questo tipo di uso multilingue richiede un'attenta pianificazione. Tale pianificazione deve superare il limite tra la perdita di decenni di conoscenza dei clienti da un lato e la capacità di supportare il software dall'altro. Le tecniche che isolano il vecchio codice dietro interfacce ben definite e che consentono a un nuovo codice più potente di sostituire il vecchio codice dopo che i suoi comportamenti sono stati ben documentati, possono aiutare. Ma questo scenario ereditario non è mai facile ed è stato (e continuerà ad essere) la causa della scomparsa di molte aziende e organizzazioni in un ampio spettro di dimensioni.

La ragione 3 , la disponibilità di programmatori per varie lingue, è un fattore pragmatico che i progetti ignorano a loro rischio e pericolo. Per quanto gli organizzatori del progetto possano ritenere (correttamente o erroneamente) che una determinata lingua sia la migliore per i loro obiettivi, se tale lingua è in conflitto con il pool di competenze linguistiche a loro disposizione, sia il programma che la qualità del prodotto subiranno l'apprendimento curvo di programmatori che cercano di imparare una nuova lingua.

Un approccio più razionale è quello di analizzare le esigenze linguistiche del progetto sulla base di aree funzionali. Ad esempio, osservare attentamente il progetto può mostrare che esiste solo un piccolo "apice" di codice di alto valore, ad esempio per l'implementazione di un algoritmo proprietario, che richiede competenze di codifica in un linguaggio meno comunemente usato. Altre parti di qualsiasi grande progetto sono spesso facilmente adattate da linguaggi più comuni o (anche meglio) da prodotti open source ben gestiti. L'analisi di un progetto in base alle esigenze linguistiche può quindi fornire un approccio molto più realistico ed economico all'assunzione o al noleggio di competenze speciali in lingue speciali e può anche aiutare ad affinare le interfacce tra le lingue all'interno di un singolo progetto.

Il motivo 4 , utilizzando lingue diverse per esigenze diverse, segue immediatamente e senza intoppi l'esecuzione di quel tipo di analisi delle esigenze del progetto. Anche in questo caso occorre prestare attenzione, poiché la selezione di troppe lingue per il supporto all'interno di un singolo progetto può causare un'esplosione combinatoria di complessità sia nel supporto che nelle interfacce tra i componenti. Il percorso più sicuro dal punto di vista dei costi è sempre quello di trovare prima le massime opportunità di riutilizzo, soprattutto se esistono buoni pacchetti in grado di soddisfare le esigenze del progetto attraverso poco più della personalizzazione. Successivamente, dovrebbe essere presa una qualche decisione su un numero limitato di lingue in grado di soddisfare la maggior parte delle esigenze individuate. Nello sviluppo ad alta intensità di riutilizzo, questo sarà spesso un tipo di codice colla.

In genere non è una buona idea scegliere più lingue con capacità molto simili solo perché alcuni membri del progetto gradiscono l'uno e l'altro. Tuttavia, se esistono sottoinsiemi di capacità ben identificati e ben definiti che trarrebbero vantaggio da abilità linguistiche speciali, ciò può essere un buon motivo per utilizzare più lingue per lo sviluppo di nuovi codici.

Il motivo 5 , la resistenza ai cambiamenti necessari nelle lingue utilizzate, può essere causa di gravi interruzioni del progetto e conflitti interni. Come utente Daveosottolineato in un commento su questa risposta, il cambiamento può essere molto difficile per alcuni membri del personale del progetto. Allo stesso tempo, la resistenza al cambiamento non è mai un problema semplice, motivo per cui può causare molti conflitti. L'uso delle competenze linguistiche legacy può essere un forte impulso alla produttività di un progetto se il linguaggio legacy è sufficientemente potente e può portare a un prodotto di eccellente qualità in un team che opera senza intoppi e rispetta la qualità. Tuttavia, le competenze linguistiche legacy devono essere bilanciate dal fatto che molte lingue meno recenti non possono più essere completate con lingue più recenti in termini di funzionalità avanzate, disponibilità dei componenti, opzioni open source e supporto di kit di strumenti intelligenti.

Sia allora che ora, il singolo argomento più comune (e ironicamente, il più spesso corretto) per continuare a usare un linguaggio legacy più debole, meno leggibile o meno produttivo è stato che il linguaggio più vecchio consente la produzione di codice più efficiente. Questo è un vecchio argomento, che risale agli anni '50 quando gli utenti del linguaggio assembly si risentirono, spesso amaramente, dell'emergere della programmazione in FORTRAN e LISP. Un esempio in cui anche ora l'argomento sull'efficienza del codice può avere validità può essere visto nel codice ad alta intensità di elaborazione come un kernel di sistemi operativi, in cui C rimane il linguaggio di scelta su C ++ (anche se per ragioni che vanno oltre la semplice efficienza).

Tuttavia, negli ambienti di progetto del nuovo millennio collegati in rete e fortemente supportati dalle macchine, l'efficienza del codice come argomento principale per la scelta di un linguaggio di progetto è diventata ancora più debole. La stessa esplosione dell'hardware informatico e di rete che ha permesso il marketing di massa di applicazioni di intelligenza artificiale significa anche che i costi della programmazione umana possono facilmente sminuire quelli dell'inefficienza della relatività nell'esecuzione di codice su hardware e cloud incredibilmente economici. Quando questo è combinato con la maggiore disponibilità in linguaggi più recenti di librerie di componenti, opzioni open source e kit di strumenti intelligenti avanzati, il numero di casi in cui il mantenimento di una lingua per motivi di efficienza da sola diventa molto limitato. Anche nei casi in cui si applica,

Una ragione più convincente per un progetto di rimanere con i linguaggi legacy si verifica quando per qualsiasi motivo un progetto ha poche o nessuna opzione per cambiare il suo staff. Ciò può accadere, ad esempio, quando una linea di prodotti legacy principale è codificata interamente in una lingua con la quale solo il personale esistente parla fluentemente. In tali casi, il progetto deve continuare a cercare di programmare nella vecchia lingua o tentare di formare il personale esistente sull'uso di una nuova lingua.

Formare il personale linguistico legacy in una nuova lingua può essere un pericolo da solo. Ricordo ancora un caso in cui un membro di un progetto appena addestrato e passato da C a C ++ si lamentava con sincerità del fatto che non capiva i vantaggi dei metodi orientati agli oggetti. Quando ho guardato il suo codice, aveva convertito le sue precedenti 103 funzioni C in 103 metodi per una singola classe di oggetti C ++ ... e giustamente non vedevo come ciò potesse aiutare qualcosa.

Il messaggio più profondo è che quando le persone hanno programmato in una sola lingua e stile linguistico per anni o decenni, la difficoltà nel farle "pensare" in nuovi modi può diventare quasi insormontabile, anche con buoni programmi di formazione. In alcuni casi potrebbe non esserci altra opzione se non quella di coinvolgere designer e programmatori più giovani che siano più in sintonia con le tendenze e i metodi attuali.

Motivo 6 , cattiva gestione del progetto, parla da sé. La selezione e l'uso della lingua in un progetto devono essere sempre considerati e valutati in modo esplicito e non devono avvenire per caso. Per lo meno, la selezione della lingua può fare un'enorme differenza nel destino a lungo termine e nei costi di supporto di un progetto, e quindi dovrebbe sempre essere presa in considerazione e pianificata. Non diventare un MUMPS!


Sono d'accordo con tutto questo. Mentre la risposta di Basile si concentra principalmente su problemi di prestazioni ed espressibilità, la tua risposta aiuta chiunque a comprendere la prospettiva di gestione alla base della scelta della programmazione poliglotta.
Parth Patel,

@ParthPatel Penso che dovresti accettare questa risposta, è la migliore soluzione autonoma qui.
lasciato

2
+1: ma hai dimenticato l'Ego. Molte persone si rifiutano di imparare nuove lingue e attenersi a ciò che sanno. Questo diverso livello di maturità con più team può portare a diverse tecnologie in un unico progetto
Daveo,

1
Motivo 7, cercando di rendere sexy il reparto IT ai fini del reclutamento. Non scherzando, su un progetto .Net, abbiamo finito per sostituire un singolo endpoint da un servizio esistente, per utilizzare un servizio completamente nuovo in Go, solo per poter aggiungere "poliglotta" nel lavoro aggiungere!
Chris Lee,

1
Eh! Non posso essere in disaccordo sul fatto che avere più lingue in uso sia un'attrazione per le persone che sono preoccupate di poter entrare in un vicolo cieco, solo tipo COBOL. Questa è la prima volta che sento parlare di una lingua aggiunta solo e specificamente a tale scopo, ma certamente ci sono molti ambienti in cui avere una maggiore varietà di strumenti e lingue è vista come un'indicazione del fatto che stanno lavorando con le ultime tecnologie, e quindi sono un luogo di lavoro più progressivo. Bel esempio, grazie!
Terry Bollinger,

158

Non riesco a capire il motivo per cui vengono utilizzati più linguaggi di programmazione nello stesso prodotto o software?

È abbastanza semplice: non esiste un unico linguaggio di programmazione adatto a tutte le esigenze e obiettivi.

Leggi il libro di programmazione della lingua pragmatica di Michael L. Scott

Alcuni linguaggi di programmazione favoriscono espressività e dichiaratività (molti linguaggi di scripting, ma anche linguaggi di programmazione di alto livello come Agda , Prolog , Lisp , Haskell, Ocaml, ...). Quando il costo dello sviluppo è importante (tempo umano e costo degli sviluppatori), è opportuno utilizzarli (anche se le prestazioni di runtime non sono ottimali).

Altri linguaggi di programmazione favoriscono le prestazioni di runtime (molti linguaggi di basso livello, con implementazioni solitamente compilate, come C ++, Rust, Go, C, assemblatore, anche linguaggi specializzati come OpenCL ...); spesso la loro specifica consente alcuni comportamenti indefiniti . Quando le prestazioni del codice sono importanti, è preferibile utilizzare queste lingue.

Alcune librerie esterne sono scritte in e per un linguaggio particolare e ABI e in mente convenzioni di chiamata . Potrebbe essere necessario utilizzare quell'altra lingua e seguire le convenzioni dell'interfaccia di funzione straniera , magari scrivendo un codice di colla .

In pratica, è improbabile che abbia un linguaggio di programmazione che sia altamente espressivo (quindi migliora la produttività dello sviluppatore, assumendo un team di sviluppatori abbastanza abile) e molto performante in fase di esecuzione. In pratica, c'è un compromesso tra espressività e prestazioni.

Nota: tuttavia, ci sono stati alcuni progressi lenti nei linguaggi di programmazione: Rust è più espressivo di C o forse anche C ++, ma la sua implementazione è quasi altrettanto performante e probabilmente migliorerà per generare eseguibili altrettanto veloci. Quindi devi imparare nuovi linguaggi di programmazione durante la tua vita professionale; tuttavia non c'è nessun proiettile d'argento

Si noti che il costo dello sviluppo è sempre più significativo oggi (non era il caso negli anni '70, a quel tempo i computer erano molto costosi, o in alcune applicazioni integrate, con un grande volume di prodotto). La regola empirica (molto approssimativa) è che uno sviluppatore esperto è in grado di scrivere circa 25 mila righe di codice sorgente (debugged e documentato) ogni anno, e ciò non dipende molto dal linguaggio di programmazione utilizzato.

Un approccio comune è quello di incorporare un linguaggio di script (o un linguaggio specifico di dominio ) in un'applicazione di grandi dimensioni. Questa idea di progettazione (relative al linguaggio specifico del dominio) è stato utilizzato per decenni (un buon esempio è l'Emacs codice sorgente editor di , utilizzando Elisp per lo scripting dal 1980). Quindi utilizzerai un interprete facilmente incorporabile (come Guile , Lua , Python, ...) all'interno di un'applicazione più grande. La decisione di incorporare un interprete all'interno di una grande applicazione deve essere presa molto presto e ha forti implicazioni architettoniche. Utilizzerai quindi due lingue: per cose di basso livello che devono essere eseguite rapidamente, alcune lingue di basso livello come C o C ++; per script di alto livello, l'altro DSL o linguaggio di scripting.

Si noti inoltre che un determinato software può essere eseguito, all'interno della maggior parte dei sistemi operativi attuali (inclusi Linux, Windows, Android, MacOSX, Hurd, ...), in diversi processi cooperativi utilizzando un qualche tipo di tecniche di comunicazione tra processi . Può anche funzionare su più computer (o molti di essi), utilizzando tecniche di calcolo distribuite (ad esempio cloud computing , HPC, server client, applicazioni Web , ecc ...). In entrambi i casi, è facile utilizzare diversi linguaggi di programmazione (ad esempio codificare ciascun programma in esecuzione su un processo o computer nel proprio linguaggio di programmazione). Leggi i sistemi operativi: tre pezzi facili per altro. Inoltre, interfacce di funzioni esterne(ad es. JNI ), ABI , convenzioni di chiamata , ecc ... facilitano il missaggio di più lingue nello stesso programma (o eseguibile ) - e troverai generatori di codice come SWIG per aiutarti.

In alcuni casi, è necessario mescolare diversi linguaggi di programmazione: le applicazioni Web richiedono Javascript o Webassembly (gli unici linguaggi in esecuzione all'interno della maggior parte dei browser Web) per la parte in esecuzione nel browser (ci sono framework che li generano , ad esempio ocsigen ). Il codice del kernel ha bisogno di alcune cose (ad esempio lo scheduler o la gestione a basso livello degli interrupt) per essere parzialmente scritto nell'assemblatore, poiché C o C ++ non può esprimere ciò che è necessario lì, le query RDBMS dovrebbero usare SQL, i GPGPU hanno bisogno dei kernel del computer codificati in OpenCL o CUDA gestito da codice host C o C ++, ecc. Alcune lingue sono progettate per facilitare tale combinazione (ad es. asmdichiarazioni in C,blocchi di codice nel mio ultimo GCC MELT , ecc ...).

In alcuni casi, utilizzi tecniche di metaprogrammazione : alcune parti del tuo grande progetto software avrebbero codice (ad esempio in C o C ++) generato da altri strumenti (forse strumenti specifici del progetto) da una formalizzazione ad hoc: generatori di parser (erroneamente chiamati compilatore- compilatori) come bisonte o ANTLR , ma anche SWIG o RPCGEN. E nota che GCC ha più di una dozzina di generatori di codice C ++ specializzati (uno per ogni DSL interno all'interno di GCC) al suo interno. Vedi anche questo esempio. Si noti che i metabug sono difficili da trovare. Leggi anche i compilatori di bootstrap e l' omoiconicità e la riflessione(vale la pena imparare Lisp , giocare con SBCL e leggere SICP ; guardare anche nelle librerie di compilazione JIT come GCCJIT ; in alcuni programmi di grandi dimensioni potresti generare del codice in fase di esecuzione usando loro; fai attenzione alla decima regola di Greenspun ). Guarda anche il discorso sul Circuit Less Traveled su FOSDEM2018.

A volte, si desidera fornire annotazioni formali del proprio codice (ad esempio per aiutare prover, analizzatori statici, compilatori), utilizzando un linguaggio di annotazione specializzato (che potrebbe essere visualizzato come un DSL). Cerca in ACSL con Frama-C per annotare i programmi C (quelli critici per la sicurezza) o i pragmi OpenMP per HPC. Avvertenza: scrivere tali annotazioni può richiedere molte abilità e tempi di sviluppo.

A proposito, questo suggerisce che alcune abilità su compilatori e interpreti sono utili per ogni sviluppatore (anche senza lavorare all'interno di compilatori). Quindi leggi il Dragon Book anche se non lavori sui compilatori. Se codifichi il tuo interprete (o se progetti il ​​tuo DSL), leggi anche Lisp In Small Pieces .

Vedi anche questo e quello e quello e quello risposte del mio relative alla tua domanda.

Studia anche il codice sorgente di numerosi grandi progetti di software libero (su github o dalla tua distribuzione Linux ) per l'ispirazione e l'illuminazione.

Inoltre, alcuni linguaggi di programmazione si sono evoluti aggiungendo annotazioni (come pragmi o commenti ) ai linguaggi esistenti. Per esempi, si pensi ACSL (un commento estensione di annotare programmi in C per consentire loro prove da Frama-C ) o di OpenCL (un dialetto C per programmare GPGPU) o OpenMP o OpenACC #pragmas o annotazioni di tipo Common Lisp .

PS: ci sono anche ragioni sociali o organizzative o storiche per mescolare i linguaggi di programmazione; Li sto ignorando qui, ma so che in pratica tali ragioni sono dominanti. Leggi anche The Mythical Man Month


6
Per me questa è la risposta corretta. È possibile prendere ad esempio le routine di assemblaggio nei programmi C. La shell UNIX è disseminata di più linguaggi di programmazione e spesso troverai awk(che è un altro linguaggio di programmazione) usato all'interno degli script bash, solo perché si adatta meglio al compito). Il punto di @amon è ancora valido.
MayeulC

8
A proposito, un grande programmatore a volte è in grado di rimuovere righe di codice ... (sostituendo molte righe di codice
schifose

12
Ottima risposta, ma una richiesta: apprezzo il desiderio di indicare "a lato" presentandoli in modo meno evidente, ma per favore non abusare del tag SUP HTML semplicemente perché ha l'effetto collaterale del rendering in un carattere più piccolo. Deve essere un incubo per l'accessibilità e, come ammonisce lo standard HTML5, "Questi elementi devono essere usati solo per contrassegnare convenzioni tipografiche con significati specifici, non per presentazioni tipografiche a scopo di presentazione. [...] usare questi elementi solo se il l'assenza di tali elementi cambierebbe il significato del contenuto ".
FeRD

4
@FeRD: rimosso <sup>ma con rimpianti
Basile Starynkevitch il

6
@BasileStarynkevitch Apprezzato. Come ho detto, apprezzo l'intento e, come scrittore troppo prolisso e incline a tangenti, desidero sicuramente StackExchange fornisca un metodo supportato per ridimensionare il testo, o magari comprimerlo in un contenitore click-to-rivel. Ma gli apici di lunghezza di paragrafo non sono la risposta a tale carenza.
FeRD

29

Molti progetti non sono realizzati con più linguaggi di programmazione. Tuttavia, è comune utilizzare script in altre lingue per fornire assistenza con il software.

  • Gli strumenti di amministrazione che sono programmi separati sono talvolta scritti in una lingua diversa.
  • Le librerie e le API offrono spesso collegamenti per più lingue, in modo che gli sviluppatori possano utilizzare qualsiasi lingua preferiscano.
  • Costruire script e relativi script di sviluppo spesso usano linguaggi specializzati.
  • I test end-to-end di un'applicazione non devono utilizzare la stessa lingua.

Alcuni progetti utilizzano più lingue all'interno dell'applicazione, ad esempio un core in un linguaggio di livello inferiore che può integrare plug-in in un linguaggio di scripting. In alcuni ecosistemi (ad es. JVM o .NET) l'esatta lingua utilizzata non è troppo importante poiché più lingue nello stesso tempo di esecuzione hanno una buona interoperabilità. Ad esempio, potrei scrivere un progetto in Scala che utilizza librerie Java esistenti e integra funzionalità di scripting con Groovy.

Se un progetto è composto da più strumenti, questi possono anche essere sviluppati in diverse lingue. Mentre la coerenza sarebbe buona, specialmente per i progetti open source, lo sforzo di sviluppo disponibile può essere un collo di bottiglia. Se qualcuno è disposto a sviluppare uno strumento utile ma non ha familiarità con la lingua principale, forse quello strumento ha più valore della coerenza.


3
Questo è complementare alla risposta di @ Basile. Gli script perl del kernel Linux non fanno parte del kernel, né è il Makefile. Non c'è nulla da guadagnare usando C per questi. Inoltre, quegli script perl possono essere usati indipendentemente dal kernel Linux. Molto spesso, quelli possono essere pensati come un progetto strettamente correlato, ma distinto . Di solito userete una sola lingua per una singola attività.
MayeulC

20

Questo ha due forme e molte organizzazioni che si collocano tra i due:

La cattiva forma : l'organizzazione è un disastro, e non c'è nessuno che si assicuri che ci sia un'unica visione tecnologica per lo sforzo. Gli sviluppatori usano molto probabilmente qualsiasi linguaggio si trovino più a loro agio o hanno recentemente sperimentato un nuovo framework o linguaggio e hanno deciso di iniziare a usarlo semplicemente per ingenuo ottimismo.

La buona forma - l'organizzazione ha un'architettura davvero buona e pulita che si presta bene alla programmazione poliglotta; disaccoppiando le applicazioni in componenti indipendenti con un contesto di delimitazione ben definito, e questa combinazione consente loro di selezionare il linguaggio di programmazione che più semplicemente consente loro di scrivere quel particolare componente.

Realtà : normalmente è più la prima che la seconda. Ho visto alcune aziende scegliere una lingua per il loro dominio aziendale e un'altra per il loro server web, e spesso terza per l'amministrazione del database, che è tecnicamente buona, ma ben presto la loro mancanza di comprensione tecnica (o il rifiuto di ascoltare il loro personale) significa che finiscono con tutte e tre le sfocature insieme in un grande pasticcio e spesso introducono ancora più lingue appropriate per risolvere particolari parti del pasticcio.


20

Posso contribuire con un esempio di un progetto di programmazione che dura da 32 anni e sembra che abbia ancora molta vita. È commerciale piuttosto che open-source.

Il nucleo è scritto in un linguaggio specifico del dominio, creato appositamente per il progetto. Ciò si è rivelato estremamente utile, in particolare perché integra il rollback nell'architettura di base, ma si compila nel codice C, che quindi compiliamo con il compilatore della piattaforma. Ha supportato una ventina di piattaforme in quel periodo, senza contare le variazioni da 32 a 64 bit, e attualmente viene distribuito su sei di queste.

Ha un componente aggiuntivo, scritto in C ++, che è stato avviato quando un ex capo del progetto si è convinto che C ++ / MFC / Windows / x86 avrebbe sostituito tutte le altre architetture e piattaforme, quindi era necessario offrire lavoro C ++ a essere in grado di assumere personale. Le cose non sono andate come previsto.

Oltre al linguaggio di dominio e al C ++, gli sviluppatori lavorano in LISP, che viene utilizzato per scrivere casi di test, utilizzando un interprete incorporato nel cablaggio di test. Abbiamo pensato di sostituire LISP con Java a un certo punto, ma si è rivelato fortunato a non averlo fatto.

Ha anche un wrapper per la sua API principale, scritto in C #. Questo è stato fatto quando i clienti lo hanno richiesto, in modo da poter riscrivere le loro applicazioni in C #. È creato da uno script Perl, che legge i file di intestazione C per l'API, oltre a un file di configurazione significativo, e scrive il codice C # per il wrapper. Fare tutto quel processo di elaborazione del testo in Perl era semplicemente più semplice che farlo in C ++.

Ha sistemi di generazione propri e ne ha bisogno, poiché il linguaggio di dominio non è suscettibile di sistemi di generazione basati su creazione. Quello per piattaforme simili a UNIX è scritto in script di shell, Perl e alcuni piccoli programmi nella lingua del dominio. Quello per piattaforme Windows è scritto in linguaggio batch, Perl e gli stessi piccoli programmi nella lingua del dominio. Il vecchio sistema di compilazione VMS è stato scritto in DCL, ma non è stato utilizzato per oltre un decennio.

C'è una certa programmazione YACC / Bison nel compilatore per la lingua del dominio. C'è un codice di test per piattaforme Apple scritto in Objective-C ++. Alcuni dei siti Web interni del team (utilizzati per la gestione dei progetti, non parte dei risultati finali) sono scritti in ASP e altri come script CGI in Perl.

Fondamentalmente, questo è iniziato come un progetto per affrontare un problema difficile, quindi valeva la pena creare strumenti specializzati, che sembrano ancora più adatti a questo lavoro rispetto a qualsiasi altra cosa disponibile. Il team considera la programmazione come un'abilità che è in qualche modo indipendente dal linguaggio usato, quindi sono disposti a usare un nuovo linguaggio se renderà più facile un compito. Tuttavia, la moda non è in cima alla loro lista di priorità, quindi non frammenteranno un compito introducendo una nuova lingua gratuitamente.

La funzione di questo codice è la modellazione matematica, utilizzata su workstation e server (posso parlare un po 'più liberamente se non identifico il prodotto). Sono attualmente circa 25 milioni di LoC, con una dimensione totale della squadra di circa cinquanta.


Sarebbe bello dire qualcosa in più su questo prodotto software: quale dominio industriale (i robot neurochirurgici non sono gli stessi del trading ad alta frequenza, per esempio)? Quale dimensione approssimativa (in milioni di righe di codice)? Quale dimensione della squadra?
Basile Starynkevitch,

@BasileStarynkevitch: aggiunti dettagli.
John Dallman,

Questo. Questo è esattamente il motivo per cui i progetti hanno più lingue dal buono al cattivo al brutto.
Jared Smith,

15

In alcuni casi, esiste uno strumento che è necessario utilizzare (come il toolkit dell'interfaccia utente di un sistema operativo) che è più facilmente accessibile da una determinata lingua. Ad esempio su iOS e macOS, se vuoi scrivere applicazioni GUI usando UIKit e AppKit, scrivere in Swift o Objective-C è il modo più rapido e semplice per farlo. (Potrebbero esserci collegamenti per altre lingue, ma potrebbero essere alla base dell'ultima versione del sistema operativo in uso, quindi potrebbero non offrire tutte le funzionalità.)

Molto spesso ciò che accade è quando un'applicazione è multipiattaforma, la logica principale dell'app è scritta in un linguaggio accessibile a entrambi e i pezzi specifici dell'interfaccia utente / sistema operativo sono scritti in qualsiasi linguaggio in cui lavorano in modo nativo.

Quindi, se stai scrivendo un'applicazione Windows e macOS, potresti scrivere la logica di base in C ++ e usare C # per l'interfaccia utente su Windows e Swift per l'interfaccia utente su macOS. Ciò consente di risparmiare tempo perché non è necessario scrivere due volte la logica principale e gestire diversi set di bug in entrambe le app, ecc. Ma consente anche una vera interfaccia utente nativa che non soddisfa il minimo comune denominatore tra piattaforme come l'utilizzo una libreria UI multipiattaforma sarebbe.


MVC FTW! Persino arrivando ad avere un solo core multipiattaforma con app wrapper per ogni sistema operativo / ambiente ... o nel moderno mondo della connettività spostandolo in un'architettura client / server
ivanivan,

1
Questo corrisponde alla mia esperienza. Ogni progetto di dimensioni sostanziali su cui ho lavorato ha utilizzato più lingue e la molteplicità delle lingue non ha mai apportato alcun vantaggio. Il motivo era sempre che parti particolari dovevano essere scritte in particolari lingue per interfacciarsi con strumenti particolari.
Owen,

Come ex sviluppatore iOS, posso confermare che l'abbiamo fatto. Avevamo un'API scritta in PHP che comunicava in JSON, un front-end web scritto in PHP che aveva anche una parte JavaScript / HTML5, un front-end Android scritto in Java e un front-end iOS scritto in Objective-C . Successivamente, nuovi progetti furono scritti in Swift, ma il nostro quadro interno era ancora scritto in Objective-C. Quindi ad un certo punto una delle nostre applicazioni è stata scritta in PHP, Java, Objective-C, Swift, JavaScript e HTML5 e disponibile su 3 piattaforme.
Belle-Sophie,

10

Oltre al fatto che alcuni linguaggi di programmazione possono essere più adatti per alcuni compiti specifici, esiste la realtà pratica.

Nella realtà pratica, ci sono 2 punti particolarmente importanti da considerare:

  1. Le persone hanno esperienze e livelli di interesse diversi nei diversi linguaggi di programmazione. - Consentire alle persone di lavorare nelle lingue che preferiscono e in cui sono competenti può in alcune circostanze portare a un risultato finale migliore rispetto al forzarle a una lingua comune.
  2. Basi di codice di grandi dimensioni sono costruite per lunghi periodi di tempo da persone diverse. - Non c'è modo di ottenere il finanziamento o la quantità di volontari necessari per riscrivere un intero progetto una volta che esce una lingua più adatta.

E ovviamente ci sono spesso parti specifiche di un'applicazione che hanno esigenze completamente diverse, come:

  • Aree sensibili alle prestazioni sviluppate in un linguaggio compilato. Lingua di esempio: C ++
  • Aree che devono essere economiche, facili da cambiare e potenzialmente personalizzabili, sviluppate in un linguaggio di scripting. Lingua di esempio: Lua.
  • Layout della GUI. Lingua di esempio: HTML
  • Installer. Lingua / strumento di esempio: WiX.
  • Costruire. Lingua / strumento di esempio: troppi per elencarli, di solito diversi contemporaneamente.

Inoltre, ci sono alcuni strumenti utilizzati da una sofisticata base di codice, molti dei quali consentono la personalizzazione e i plug-in necessari con l'ennesima lingua.


8
HTML non è un linguaggio di programmazione
Bergi

1
@Bergi Correct. Peter non afferma di si. È un linguaggio di markup.
Belle-Sophie,

1
HTML, XAML, QML, ecc. Sono linguaggi usati dai programmatori nei progetti software per dire al computer cosa fare - le lingue di solito non sono strettamente necessarie perché i programmatori potrebbero teoricamente scrivere l'intero progetto, compresa l'interfaccia utente, in una sola lingua. Questo è ciò che lo rende rilevante nel contesto di questa domanda.
Peter,

5

Oltre agli altri punti giusti già fatti:
dall'esperienza, molte decisioni linguistiche o ambientali vengono prese da "se hai un martello, tutto sembra un chiodo", il che significa che le persone tendono ad usare gli strumenti che hanno familiarità.

Inoltre, l'introduzione di un nuovo ambiente o persino della lingua è un investimento importante in licenze, corsi di formazione, forse hardware, e comporta grandi perdite di tempo produttivo: procurarsi, installare, configurare, addestrare ogni settimana in un'azienda più grande e praticamente terminare con un gruppo di sviluppatori principianti.
Fondamentalmente non c'è mai il tempo di "investire" in un ambiente o linguaggio più moderno o più adatto, quindi restano fedeli a ciò che hanno fino a quando non riescono più a funzionare.

In particolare alla tua domanda, se più persone / team partecipano allo sviluppo di una soluzione, ogni gruppo tende a rimanere fedele a ciò che conosce meglio, quindi la soluzione complessiva ha potenzialmente più lingue e lo sviluppo in più ambienti.


5

Questa domanda (e alcune delle risposte) sembrano presumere che le applicazioni siano blocchi monolitici di codice - questo non è necessariamente il caso.

Il tuo tipico sito web come Stack Exchange è in realtà un mucchio di servizi diversi tutti in esecuzione indipendentemente l'uno dall'altro, con una sorta di messaggistica tra di loro. Questi servizi possono essere (e generalmente sono) implementati in lingue diverse, ognuna con i suoi punti di forza.

Lavoro su una piccola parte di una piattaforma bancaria online, indirizzata a piccole banche comunitarie e sindacati di credito. Questa piattaforma ha più componenti: un front-end Web, un livello di database, un livello di comunicazioni di terze parti, ecc. Queste sono tutte applicazioni indipendenti in esecuzione su server diversi con sistemi operativi diversi. JavaScript è in esecuzione sul lato client nel browser, hai pagine Perl sul lato server, hai più servizi scritti in C ++ che agiscono come un livello di astrazione tra il codice Perl e il core processor della banca, un altro set di applicazioni C ++ che instradare i messaggi tra i vari livelli, un'infarinatura di applicazioni C ++ e script Perl per monitorare l'integrità dei vari processi e segnalare il loro stato a un monitor interno, ecc., ecc., ecc.

Esistono ancora applicazioni monolitiche, ma anche loro possono sfruttare lingue diverse per motivi diversi. È possibile scrivere il 90% di un'applicazione in Java, ma utilizzare JNI per sfruttare C o C ++ per sezioni più critiche per le prestazioni.


Sono sorpreso che nessuno abbia menzionato SQL (o linguaggio di query di tua scelta), la maggior parte delle applicazioni oggigiorno ha almeno una sorta di architettura "stack".
user3067860,

3

Vorrei sottolineare un esempio molto specifico del motivo delle "lingue diverse con punti di forza diversi": FORTRAN.

Fortran è stato originariamente sviluppato per rendere più semplice agli ingegneri il lavoro di analisi numerica, e da allora sono stati fatti molti sforzi per far sì che i compilatori Fortran emettessero un codice numerico molto efficiente. D'altra parte, da quei primi giorni l'uso dei computer è esploso in mille direzioni, nessuna delle quali comporta un'analisi numerica, e lo sviluppo di linguaggi di programmazione ha ampiamente seguito l'esempio dell'ignorare il mondo "reale" [scusate il gioco di parole].

SO: È oggi, e ti ritrovi a lavorare per un'azienda con un prodotto piuttosto tentacolare, la maggior parte scritta in (diciamo) Java (parlo per esperienza personale qui) . Ma scopri che una delle caratteristiche principali del prodotto sta per provocare una qualche forma di analisi numerica, e tutti i migliori codici per quella particolare analisi sono già disponibili in rete - in Fortran. Allora cosa fai? Scarica uno di quei codici Fortran, scopri la sua interfaccia [ovvero gli argomenti della subroutine più in alto], monta un wrapper JNI per esso in C e lo impacchi come una classe Java. BAM! Hai appena dovuto sviluppare in tre lingue contemporaneamente. [specialmente se scopri che il tuo codice Fortran utilizza blocchi COMMON - ovvero archiviazione statica - e deve essere modificato per la sicurezza dei thread]


4
Oppure il tuo comprovato core di calcolo FORTRAN sarebbe migliorato chiamando ad un certo punto un nuovo algoritmo che dipende dal fare un ordinamento heap sui puntatori, che hai già scritto in C. E hai file di input complessi da scansionare, quindi scrivi il scanner in flex. Oh, e forse ti piacerebbe una GUI in cima, che devi chiamare da C ++. O il cliente vorrebbe davvero chiamare il tutto come una subroutine Matlab ...
jamesqf

3

Perché la programmazione non è un compito. Anche la creazione di un prodotto non è un compito. Esistono diversi tipi di attività che sono meglio espresse con lingue diverse.

Per renderlo più concreto, supponiamo qualcosa di semplice come un'app autonoma (ci sono più attività da eseguire per le app distribuite).

Un prodotto deve essere

  • scritto
  • messi insieme (ciò comporta sia la compilazione che la raccolta di risorse come immagini, caratteri, ecc. per la distribuzione)
  • schierato
  • configurato
  • monitorati

È molto improbabile che un linguaggio che possa essere utile per scrivere il runtime di un prodotto sia altrettanto valido per mettere insieme un prodotto. E così via.

Tuttavia, anche il processo di scrittura di un prodotto potrebbe non essere eseguito in modo ottimale in 1 lingua.

Diciamo che ci sono molti dati strutturati che vengono gestiti nel prodotto. La struttura dei dati è nota al momento della stesura? In tal caso, ti consigliamo di configurare alcuni database al momento della distribuzione. Questo viene fatto in modo ottimale in una lingua che può generare la lingua che verrà compilata nel tempo di esecuzione.

E se la struttura dei dati potesse cambiare di volta in volta? È necessario un modo strutturato di trasformare nuovi costrutti di dati in codice e configurazione del database. È meglio farlo in un'altra lingua.

Riesci a fare tutto nella stessa lingua? Sicuro. Ma la tua efficacia è determinata dalla rapidità con cui riesci a finire un progetto e dalla capacità di resistenza ai cambiamenti. Se gran parte del tuo lavoro può essere automatizzato con strumenti già esistenti, ciò che impieghi 3 mesi a fare può essere svolto da qualcun altro in 2 giorni. Ma quel qualcuno userebbe altre lingue per automatizzare ciò che faresti attraverso la ripetizione.


"Un linguaggio che può essere buono per scrivere il runtime di un prodotto è molto improbabile che sia altrettanto buono" ... i linguaggi di programmazione non escono da un processo casuale, quindi è un po 'strano parlare di probabilità in questo modo. I linguaggi di programmazione sono progettati per risolvere alcune attività. Ora il punto è che è improbabile che una lingua risolva anche, per caso , anche un altro problema che non è stato progettato per risolvere. Direi tuttavia che l'essenza della programmazione è quella di astrarre su tutti i problemi che uno potrebbe desiderare di risolvere, e un linguaggio davvero ben progettato dovrebbe quindi essere altrettanto valido per qualsiasi compito.
lasciato

@leftaroundabout è un errore comune confondere ciò che una lingua può fare e ciò che esprime bene. Lo scopo di un linguaggio di alto livello non è quello di risolvere un problema. Serve da sintassi per esprimere una soluzione a un problema in un modo in cui alcuni strumenti possono trasformare questa espressione in un'attività che un computer può eseguire. Detto questo, è importante ricordare che il vero lavoro di espressione è svolto dalle persone. E le persone usano astrazioni diverse per descrivere soluzioni a problemi di domini diversi.
Grovkin,

Le persone usano sicuramente diverse astrazioni. Il mio punto è che un buon linguaggio dovrebbe essere in grado di esprimere tutte queste astrazioni.
lasciato circa

@leftaroundabout, per niente. Esprimere qualcosa di buono richiede essere in grado di dirigere l'attenzione verso la cosa. Cercare di esprimere bene tutti i tipi di astrazioni significherebbe attirare l'attenzione su tutti loro. E ciò spargerebbe l'attenzione e causerebbe una scarsa espressione delle idee. Non c'è niente di sbagliato nel scegliere cosa enfatizzare e concentrarsi su questo.
Grovkin,

Essere in grado di dirigere l'attenzione da qualche parte non è la stessa cosa che farlo davvero.
lasciato

1

Lo sviluppo del software è progredito al punto da poter utilizzare diversi linguaggi di programmazione nello stesso progetto e farlo funzionare.

Quindi c'è la domanda sul perché dovresti usare più di una lingua.

Uno dei motivi è che le lingue diventano obsolete e lentamente sostituite da nuove e, se sei fortunato, puoi farlo a poco a poco. Quindi il tuo progetto avrà un mix di vecchio e nuovo linguaggio.

Un altro motivo è la situazione in cui il linguaggio X è molto quello che viene utilizzato sulla piattaforma A, il linguaggio Y è molto ciò che viene utilizzato sulla piattaforma B, ma il linguaggio Z è supportato su entrambe le piattaforme. Quindi il codice comune è scritto nella lingua Z, che viene quindi combinata con X o Y, a seconda della piattaforma.

E alla gente piace usare il codice scritto da altri (in altre parole, codice sul quale non ha dovuto impiegare del tempo per scriverlo da solo). Si sentono liberi di usare il codice scritto da altri in qualsiasi lingua, quindi aggiungono il codice nella lingua che preferiscono.


8
Circa la prima frase: i programmi in lingua mista sono una cosa da oltre 50 anni.
Blrfl,
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.