C’era una volta Java…
Quando, quasi trenta anni fa, MokaByte vide la luce su un’allora giovane Internet, si trattò della prima rivista web in italiano dedicata a Java. Era proprio su questo linguaggio che si incentravano gli articoli e le discussioni di una piccola, ma agguerrita community: Java da poco uscito rappresentava infatti una novità che sembrava capace di rivoluzionare il panorama dello sviluppo software dell’epoca. Java faceva numerose promesse e, a dire il vero, svariate di queste venivano mantenute, seppur a prezzo della necessaria curva di apprendimento — peraltro non superiore a quella di altri linguaggi — e di una leggera riduzione della velocità di esecuzione, legata alla Java Virtual Machine e alle prestazioni possibili con l’hardware della seconda metà degli anni Novanta.
Ma c’era uno spirito innovativo, una notevole curiosità e un grande interesse intorno a quello che oggi invece è percepito come un linguaggio “vecchio”, sebbene sempre utile per sistemi stabili di tipo Enterprise. Ma nessuno si entusiasma più per Java, come fu ai tempi della sua uscita e prima diffusione: il mondo informatico è cambiato e se nella scala dei tempi geologici i periodi durano decine di milioni di anni, in ambito tecnogologico digitale arrivano a malapena alla decina di anni, con un’accelerazione, a tratti, vertiginosa.
Linguaggi di programmazione nel contesto contemporaneo
Lo stesso concetto di linguaggio di programmazione ha subito una serie di riaggiustamenti e tutti ben sanno che non è il solo linguaggio che consente di creare un’applicazione vincente o un sistema affidabile, ma che esso fa parte di una più ampia gamma di elementi — dall’infrastruttura hardware all’organizzazione del processo, dalle metodologie di sviluppa alla gestione e finanziaria dell’azienda — che consentono di realizzare prodotti di valore, utili per l’utente finale.
Questo non significa però che i linguaggi abbiano perso il loro valore e ruolo centrale nella moderna industria dello sviluppo software. Certo, non susciteranno più quell’attesa e quell’entusiasmo di cui si parlava, ma sono capaci di cambiare le modalità, l’efficacia e l’efficienza con cui si svolge il lavoro dello sviluppatore.
In questo senso, Kotlin rappresenta una delle realtà più interessanti nel panorama dello sviluppo software. In questo articolo vedremo brevemente di che cosa si tratta, visto che ne abbiamo già parlato a più riprese su queste pagine, ma ci concentreremo sulle caratteristiche della nuova recentissima versione e, soprattutto, su quali sono le ricadute che Kotlin 2.0 ha nel processo di sviluppo e nelle possibilità di lavorare in maniera più semplice ed efficace per gli sviluppatori.
Kotlin che cos’è
Abbiamo già parlato di Kotlin in passato su queste pagine [1] ma, per chi ne sapesse davvero poco o nulla, riassumiamo qui gli aspetti fondamentali di questo linguaggio lanciato nel 2011 ma affermatosi fortemente a partire dal 2017 in poi. Se infatti esso fu sviluppato dall’azienda JetBrains, produttrice dell’ambiente di sviluppo IntelliJ Idea, l’adozione da parte degli sviluppatori aumentò significativamente quando Google lo scelse come linguaggio per lo sviluppo di applicazioni Android.
Caratteristiche e sintassi
Per inquadrare l’argomento Kotlin in maniera stringata, si può dire quanto segue.
Kotlin è un linguaggio Object Oriented, statically typed, che può essere eseguito sulla Java Virtual Machine, risultando così compatibile con Java, i suoi strumenti di sviluppo e le sue librerie. Questo fatto, inoltre, consente a chi già conosca Java una migrazione senza intoppi verso il nuovo linguaggio e permette ad aziende con un’imponente codebase Java di adottarlo senza timori di dover riscrivere intere applicazioni.
La promessa “Write once, run everywhere”, che fu inizialmente uno dei cavalli di battaglia di Java, viene compiutamente realizzata dalle caratteristiche multipiattaforma di Kotlin che può essere compilato anche in JavaScript o in codice nativo, eseguibile sulle diverse piattaforme.
La grande versatilità di Kotlin si concretizza quindi nella possibilità di essere usato sia per sviluppare applicazioni per i diversi sistemi operativi mobile, Android e anche iOS, sia per realizzare tanto il front-end quanto la parte server-side di applicazioni web.
Fra le caratteristiche più evidenti di Kotlin ci sono il fatto di essere sicuro come Java, ma molto più conciso e semplificato nella sintassi. Utilizza inferenze avanzate, espressioni lambda, e altre funzionalità moderne che aumentano la produttività e riducono il rischio di errori, come i null pointer exceptions.Un quadro più approfondito sulla sintassi di Kotlin si può leggere in un articolo di MokaByte [2] e, ovviamente, nella documentazione ufficiale [3].
Kotlin ha inoltre un supporto nativo per le coroutines, che facilitano la scrittura di codice asincrono non bloccante, utile per operazioni di I/O, networking e altri task che richiedono concorrenza.
Ambito di applicazione
Con queste premesse, è chiaro che Kotlin copra un’ampia gamma di situazioni di impiego. Come già detto, è ormai diventato il linguaggio di riferimento per lo sviluppo di app Android poiché, rispetto a Java la qualità del codice è migliorata e l’esperienza di sviluppo è più lineare e semplificata.
Ma Kotlin può essere utilizzato anche per lo sviluppo di applicazioni server-side, ad esempio con framework come Ktor o Spring Boot, grazie alla sua compatibilità con Java.
La possibilità di creare codice JavaScript, inoltre, consente a Kotlin di essere utilizzato per sviluppare applicazioni web front-end, integrandosi con tecnologie come React.
Infine, Kotlin sta guadagnando terreno anche nel campo della data science grazie a librerie come KotlinDL per il deep learning, sebbene, a onor del vero, in misura ancora decisamente minore rispetto a Python o R, più diffusi in questo ambito.
Kotlin 2.0: novità e caratteristiche
Lo scorso 21 maggio 2024 è stata rilasciata la versione 2.0.0 di Kotlin [4]. Si tratta di una major release che introduce svariate innovazioni rispetto alle pur già avanzate precedenti ancora ricadenti sotto il numero di versionamento 1.x.
Il rilascio è avvenuto in concomitanza con l’evento Google I/O durante il quale è stata data grande rilevanza a Kotlin e al suo ecosistema, mettenone in luce il miglioramento delle prestazioni, la sempre più spiccata capacità di sviluppo multipiattaforma — grazie alla tecnologia Kotlin Multiplatform supportata ufficialmente da Google — e i perfezionamenti negli strumenti di sviluppo. Uno dei dati emersi da quell’evento è che, tra le mille app Android più vendute sul Google Play Store, il 95% contiene almeno un po’ di codice Kotlin, mentre ormai già più del 60% degli sviluppatori professionali per Android usa Kotlin come linguaggio principale.
Tra le novità più importanti si segnalano le seguenti.
Compilatore K2
Il nuovo compilatore K2 offre prestazioni migliorate, analisi del codice più precisa e generazione di bytecode più efficiente. Si afferma che, in certi casi, la velocità di compilazione è addirittura raddoppiata. Per poter utilizzare K2 occorre avere installato il build tool Gradle aggiornato almeno alla versione 8.3, perché solo su questa, e sulle successive, il compilatore K2 funzionerà correttamente. Non solo prestazioni migliorate in termini di velocità, dunque, ma anche la capacità di smart casting per la quale il compilatore legge in una porzione di codice che è stato fatto il casting di un oggetto a un tipo specifico e “capisce” che può farlo anche per il codice rimanente.
Supporto multipiattaforma stabile
Kotlin 2.0 consolida il supporto per lo sviluppo multipiattaforma, consentendo di scrivere codice una sola volta e distribuirlo su diverse piattaforme, come Android, iOS, desktop e web: write once, run everywhere per davvero. Ne parleremo meglio, anche se brevemente, tra poco.
Compose Multiplatform
Libreria molto interessante, perché facilita la creazione di interfacce utente multipiattaforma con codice condiviso: una notevole semplificazione del lavoro, con risultati di buon livello.
Tool di sviluppo migliorati
Android Studio offre un’esperienza di programmazione Kotlin migliorata, con IntelliSense più intelligente, refactoring più efficiente e debug più accurato.
Inline functions
Le funzioni inline possono ora essere trattate come chiamate locali, migliorando le prestazioni e la leggibilità del codice.
Risoluzione di conflitti in Kotlin/Native
In Objective-C, i metodi possono avere nomi differenti ma stesso numero e tipo di parametri, il che, per Kotlin, risulta in metodi con la stessa firma. Questo creava dei conflitti con la produzione di un errore. Fin qui si era provveduto a risolvere questi conflitti “a mano”. Ma con Kotlin 2.0.0 è stata introdotta la nuova annotazione @ObjCSignatureOverride che indica al compilatore di ignorare l’errore di overload quando svariate funzioni potenzialmente confliggenti vengono ereditate dalla classe Objective-C. Questo nuovo meccanismo di risoluzione dei conflitti — da usare ovviamente con saggezza, per non perdersi invece errori significativi — semplifica lo sviluppo di applicazioni native per iOS e Mac OS, nell’ottica del potenziamento multipiattaforma di Kotlin.
Generazione di lambda utilizzando invokedynamic
Kotlin 2.0.0 introduce un nuovo metodo di default per generare funzioni Lambda usando invokedynamic. In tal modo si riduce la dimensione dei binari delle applicazioni rispetto alla generazione tradizionale di Lambda come classe anonima.
L’impatto sui processi di sviluppo
Non sarà sfuggita ai lettori l’enfasi sulle capacità multipiattaforma di Kotlin. In particolare, la tecnologia Kotlin Multiplatform, sviluppata da JetBrains — l’azienda che ha creato il linguaggio e che produce IntelliJ, un IDE per Java e Kotlin, oltre a IDE per numerosi altri linguaggi — è adesso supportata ufficialmente da Google per lo sviluppo di applicazioni.
Kotlin Multiplatform [5] rappresenta un ausilio significativo nell’ambito dei progetti multipiattaforma perché riduce il tempo necessario a scrivere e manutenere la stessa base di codice per piattaforme differenti, senza però perdere i benefici, specie in termini di prestazioni, della programmazione nativa per i diversi sistemi operativi.
Android e iOS
La situazione più evidente e citata — anche perché si pone come soluzione a un dilemma annoso — è quella dello sviluppo di appicazioni mobile che siano fruibili sia sui sistemi Android che su quelli iOS. In tal senso, la nuova versione del linguaggio non fa che migliorare le capacità di usare tra prodotti Android e iOS lo stesso codice che implementi le operazioni di rete, il salvataggio e la validazione dei dati, le operazioni computazionali e altra logica applicativa. Inoltre, grazie al framework Compose Platform, anch’esso sviluppato da JetBrains, è possibile condividere delle interfacce utente tra Android e iOS.
Librerie multipiattaforma
Non va poi dimenticata la possibilità di creare non solo applicazioni, ma anche librerie multipiattaforma scritte in un solo linguaggio e poi implementate per le specifiche destinazioni, che si tratti di JVM, web oppure sistemi nativi.
Applicazioni desktop
Infine, anche lo sviluppo per piattaforme desktop ben si presta all’uso di Kotlin. Con il framework Compose Platform si possono condividere UI tra Windows, Mac OS e Linux e Kotlin MultiPlatform permette, a partire da una singola codebase per la logica applicativa, di implementare prodotti per le principali piattaforme desktop, facendo anche affidamento sui SDK e su API speficiche dei diversi sistemi.
Conclusioni
Il processo evolutivo che, in più di dieci anni, ha portato dalla nascita di Kotlin al recentissimo rilascio della versione 2.0 nel maggio 2024 fa di questo linguaggio e delle tecnologie ad esso connesse un elemento centrale per lo sviluppo di applicazioni multipiattaforma in maniera efficace ed efficiente.
L’appoggio ormai completo da parte di Google non può che favorirne ulteriormente il cammino verso una sempre più ampia adozione. Sarà interessante notare quanto potrà essere pervasivo da qui in poi anche nel mondo iOS, verso cui le recenti innovazioni lo indirizzano più agevolmente.
Riferimenti
[1] Filippo Diotalevi, Introduzione a Kotlin. I parte: Origine e ambiti di utilizzo. MokaByte 237, marzo 2018
e articoli successivi nella stessa serie
https://www.mokabyte.it/2018/03/13/kotlin-1/
[2] Filippo Diotalevi, Introduzione a Kotlin. II parte: La sintassi. MokaByte 238, aprile 2018
https://www.mokabyte.it/2018/04/15/kotlin-2/
[3] La documentazione ufficiale su Kotlin
https://kotlinlang.org/docs/kotlin-pdf.html
[4] What’s new in Kotlin 2.0.0
https://kotlinlang.org/docs/whatsnew20.html#kotlin-k2-compiler
[5] Kotlin MultiPlatform
https://kotlinlang.org/docs/multiplatform.html
Luigi Mandarino ha cominciato ad appassionarsi ai computer con il glorioso ZX Spectrum 48k: una bomba, per l‘epoca 🙂 Dopo gli studi di ingegneria, si è dedicato per diversi anni allo sviluppo di applicazioni Java, specie per la piattaforma Enterprise. Successivamente, ha svolto il ruolo di architetto dei sistemi interessandosi particolarmente alle architetture di integrazione. Attualmente, svolge consulenze a svariate aziende in particolare nel settore bancario, assicurativo e finanziario, principalmente su temi inerenti le architetture Java EE e le dinamiche di processo secondo un approccio Lean/Agile.