I linguaggi di programmazione sono fondamentalmente astrazioni che ti aiutano ad aiutarti a dire al computer cosa fare. Dal momento che sono astrazioni, ciò significa che nascondono alcuni dettagli e semplificano così il compito generale, permettendoti di comprendere come fare un particolare pezzo di programmazione senza dover comprendere tutto in una volta. Ma nascondendo significa anche che restringono ciò che puoi fare: uscire dall'astrazione è difficile, e così anche dover costruire molte nuove astrazioni oltre il livello base fornito dalla lingua.
L'effetto netto di ciò è che un particolare linguaggio di programmazione ha una gamma di attività di programmazione a cui è adatto, ma non sarà adatto a tutto. Un linguaggio di programmazione di basso livello consente di eseguire lavori di basso livello, che spesso sono critici dal punto di vista delle prestazioni (come l'elaborazione numeric-heavy). Va bene, ma fare un lavoro di alto livello nella stessa lingua non è semplice come usare un linguaggio specializzato in astrazioni di livello superiore. Inoltre, non c'è un insieme perfetto di astrazioni da scegliere: alcuni problemi sono meglio descritti in un gruppo (ad es. Programmazione funzionale), mentre altri richiedono un approccio diverso (ad es. Programmazione logica).
Il modo migliore per uscire da questa situazione in cui un linguaggio di programmazione in grado di svolgere un'attività non va bene per gli altri è utilizzare più linguaggi di programmazione. Lascia che ogni lingua si concentri su come eseguire le attività a cui è utile, quindi trasferisci il controllo sul codice scritto in un'altra lingua per altre parti. È specializzazione (e anche componentizzazione) ed è davvero una buona cosa. Naturalmente, ci sono linguaggi che funzionano particolarmente bene insieme poiché hanno ABI strongmente compatibili (ad es., Java e Scala, C # e VB, C ++ e Lua) ma non sono certamente gli unici livelli che puoi collegare insieme a. In effetti, quando accedi a un servizio web probabilmente stai usando le stesse idee: le lingue in cui i client sono scritti non sono probabilmente quelle in cui i server sono scritti, anche se non c'è un motivo teorico per cui una lingua non possa fai entrambe le parti, alcune lingue hanno migliori astrazioni per un lato o l'altro.