Ciao, e benvenuto nella seconda puntata della ventisettesima stagione. Nella scorsa puntata abbiamo visto il sogno di Java, scrivere una volta e girare ovunque. Ma come si realizza un sogno del genere? Come fa lo stesso identico programma a funzionare su computer diversi, che parlano lingue diverse? La risposta è l'idea tecnica più geniale e importante di Java, il cuore di tutta la stagione, un'idea tanto elegante quanto potente: mettere una macchina dentro la macchina. Un computer finto, simulato, che gira dentro quello vero. Oggi capiamo cos'è questa macchina virtuale, e come realizza la portabilità.
Ripartiamo dal problema, per capire come Java lo aggira. Il problema era che computer diversi parlano lingue diverse, e un programma tradotto per una lingua non gira su un'altra. La soluzione ovvia sarebbe tradurre il programma nella lingua di ogni computer, ma è proprio la fatica che vogliamo evitare. Java fa qualcosa di molto più astuto: invece di tradurre il programma nella lingua di un computer specifico, lo traduce in una lingua intermedia, speciale, che non è la lingua di nessun computer reale in particolare, ma una lingua di mezzo, inventata da Java. Il programma diventa così un testo in questa lingua intermedia, uguale per tutti.
Ma qui sorge la domanda: se questa lingua intermedia non è la lingua di nessun computer reale, chi la capisce? Chi la esegue? Ed ecco l'idea geniale, che voglio farti afferrare bene: c'è un programma speciale, chiamato macchina virtuale, che capisce questa lingua intermedia e la esegue. La macchina virtuale è come un computer finto, simulato, che gira dentro il computer vero: un computer dentro il computer. Il programma Java, nella sua lingua intermedia, non gira direttamente sul computer vero, ma su questa macchina virtuale, questo computer simulato, che a sua volta gira sul computer vero facendogli da intermediario.
Voglio spiegarti come questo realizza la portabilità, perché è il punto e la cosa più bella. La macchina virtuale esiste in una versione per ogni tipo di computer reale. Installi, sul tuo tipo di computer, la macchina virtuale fatta apposta per lui, una volta sola. E da quel momento, qualsiasi programma Java, scritto nella lingua intermedia, gira su quella macchina virtuale, e quindi sul tuo computer. Il programma Java non deve sapere nulla del tipo di computer sotto: parla solo con la macchina virtuale, che è sempre uguale. È la macchina virtuale a occuparsi di far dialogare la lingua intermedia con il computer reale specifico. Il programma resta identico ovunque; è la macchina virtuale, diversa per ogni computer, a fare da ponte.
Voglio darti un'immagine che rende tutto questo concreto, perché è illuminante. Immagina di voler dare istruzioni a persone di paesi diversi, che parlano lingue diverse. Invece di imparare tutte le loro lingue e riscrivere le istruzioni in ciascuna, tu scrivi le istruzioni una volta sola in una lingua comune, diciamo una lingua franca. Poi, in ogni paese, c'è un interprete che conosce quella lingua franca e la lingua locale, e traduce sul posto. Tu scrivi una volta, nella lingua franca; gli interpreti, uno per paese, fanno il resto. La macchina virtuale è quell'interprete: tu scrivi il programma nella lingua intermedia, e la macchina virtuale di ogni computer lo traduce, sul posto, per quel computer specifico. Scrivi una volta, e gli interpreti locali fanno girare il tuo testo ovunque.
Voglio collegare questa idea a concetti che abbiamo già incontrato, perché ha parentele illustri. Ricordi, dalla stagione sui linguaggi, la differenza tra tradurre tutto in anticipo, la compilazione, e tradurre man mano mentre si esegue, l'interpretazione? La macchina virtuale di Java è un ingegnoso ibrido: il programma viene prima tradotto nella lingua intermedia, e poi la macchina virtuale esegue quella lingua intermedia, un po' come un interprete. E ricordi l'idea di un computer simulato? La macchina virtuale è proprio questo: un computer finto, che esiste solo come programma, dentro il computer vero. È un'idea profonda, quella di simulare una macchina per ottenere la portabilità, e Java l'ha resa celebre.
Voglio farti apprezzare, per chiudere, quanto sia influente questa idea, perché va oltre Java. Lo strato intermedio, la macchina virtuale che ti permette di scrivere una volta e girare ovunque, è una delle idee più belle dell'informatica. Risolve la portabilità in modo pulito: sposti la complessità del girare su macchine diverse dentro la macchina virtuale, e liberi il programma da quella preoccupazione. È un'idea così potente che l'abbiamo ritrovata altrove: pensa ai container, che inseguono lo stesso sogno del pacchettizza una volta, fai girare ovunque. Java ha reso popolare questa grande idea dello strato intermedio portabile.
Per oggi ci fermiamo qui. Java realizza il sogno di scrivere una volta e girare ovunque con un'idea geniale: non traduce il programma nella lingua di un computer specifico, ma in una lingua intermedia, uguale per tutti, che viene eseguita da un programma speciale, la macchina virtuale, un computer finto e simulato che gira dentro quello vero. Installi la macchina virtuale fatta per il tuo tipo di computer, e qualsiasi programma Java ci gira sopra, identico ovunque, come un testo scritto in una lingua franca che interpreti locali fanno girare in ogni paese. È un ibrido tra compilazione e interpretazione, e una delle idee più influenti dell'informatica, ritrovata anche nei container. Nella prossima puntata vediamo il prezzo e il premio di questa scelta. Nelle note trovi qualche spunto. Se ti è utile, condividila. Grazie per l'ascolto, e ci sentiamo alla prossima.