Scala - Introduzione
scarica pdf - stampa


Il linguaggio Scala nasce nel 2001, anche se la prima apparizione pubblica avvenne nel 2004, ad opera del tedesco Martin Odersky, ingegnere residente in Svizzera, già tra gli autori del compilatore javac sotto l'egida del Politecnico di Losanna. Si tratta di un linguaggio multiparadigma che prende le sue mosse dall'idea di fondere l'approccio a oggetti con quello funzionale. Queste logiche operative convivono in moltissimi linguaggi ma Odersky si è sforzato di coniugarli in maniera non alternativa ma cooperativa. Insomma i due approcci devono essere paritetici ed il linguaggio deve supportarli con la stessa efficacia. Scala nasce per operare sulla base della Java Virtual Machine (JVM) e, per alcuni aspetti, è molto vicino a Java stesso, ma è in via di sviluppo anche il porting su .Net, con il supporto niente di meno che da parte di Microsoft stessa, in gestazione anche l'integrazione con l'eccellente tool Visual Studio. L'idea è naturalmente quella di coinvolgere un numero sempre maggiore di sviluppatori. Ad ulteriore supporto del linguaggio è stata costituita una società, Typesafe, per pubblicizzare, sviluppare e creare servizi basati su questo potente strumento. Prima di passare agli aspetti tecnici va sottolineato come importanti società, come Twitter e LinkedIn fanno uso intensivamente di Scala. Non è male come biglietto da visita.

Le sue origini sono variegate, lo stesso Odersky ha detto di aver avuto varie muse ispiratrici tra gli altri linguaggi: Java, C#, C++, Ruby, Erlang, Haskell e altri, insomma un'allegra combriccola di parenti comunque nobili. Conseguenza di ciò una serie di interessanti caratteristiche delle quali parleremo lungo il nostro percorso. Qui di seguito invece vediamo una panoramica generica e certamente non esaustiva.
Come detto questo linguaggio si basa sui paradigmi a oggetti (ogni cosa è un oggetto; ad esempio la somma di due numeri è visto come l'applicazione del metodo + del primo numero avendo come parametro il secondo cioè 1 + 2 equivale 1 .+(2)) e funzionale (ogni funzione è un valore e come tale può essere usato), per quanto sia possibile adoperarlo anche in modo imperativo (mi sembra uno spreco, diciamocelo, ma si può fare). La tipizzazione è di tipo statico e forte (piuttosto raro tra i linguaggi che popolano la galassia incentrata sulla JVM... d'altronde l'eterna lotta tra i sostenitori della tipizzazione statica e di quella dinamica è sempre aperta; io personalmente preferisco la prima) e supporta l'inferenza di tipo. (ovvero quel meccanismo in base al quale il compilatore riconosce che se scrivete x = 1 allora x è un intero). Il type system nel complesso è anche di tipo strutturale; in quest'ultima tipologia due elementi vengono valutati tramite l'equivalenza complessiva delle loro proprietà. Scala supporta l'eredità singola (solo a me piace di più quella multipla?) e un sistema di interfaccie chiamate traits molto simili ai moduli in Ruby. Questi costrutti hanno lo stesso ruolo delle interfaccie che vengono usate in Java o C# ma permettono una implementazione di default dei propri metodi. Ne parleremo diffusamente.
Scala deve il suo nome al fatto di essere "scalabile", ovvero, in parole semplici, mostra una forte propensione all'aggiornamento, o ancor meglio alla estensibilità, basandosi sulle necessità del programmatore. Un po' oscuro ma ne parleremo meglio. Comunque è facilmente comprensibile in questo senso come sia adeguato per la creazione di DSL (Domain Specific Languages) in pratica dei dialetti derivati per la soluzioni di specifici problemi.
Un buon punto di forza è dato dalle prestazioni (favorite dalla natura della tipizzazione che, detto per inciso, dovrebbe facilitare il supporto da parte degli IDE, cosa che invece nei linguaggi dinamici è più problematico) che, in molti dei benchmarks che troverete su Internet, lo collocano spesso subito alle spalle di C/C++ (e magari del nuovo arrivo, il vagamente misterioso ATS). Ovviamente ogni discorso relativo alla performance di un linguaggio è da prendere con le pinze. Un altro pilastro è l'attenzione posta per gli aspetti della concorrenza e del parallelismo, ne parleremo diffusamente più avanti, problematiche per affrontare le quali Scala dispone di una potente libreria basata sul modello degli "attori".

Insomma Scala è uno strumento molto potente, forse non facile da domare ma che può dare grandi soddisfazioni e che si propone in prima linea tra i cosiddetti "emergenti".

Questo linguaggio interagisce in toto con la potente libreria Java (e farà lo stesso con .Net) alla quale si può facilmente agganciare laddove manchino elementi di libreria nativi e può essere utilizzato indifferentemente per scrivere piccoli script o grosse applicazioni. E' duttile, questa forse è la sua migliore peculiarità. Può facilmente cooperare con Java stesso. Inoltre sono disponibili alcuni web framework che ne permettono l'utilizzo per la costruzione di applicazioni Web. Tra questi framework particolarmente indicato è Lift, ideale compagno in questo viaggio e che spero di poter mostrare all'opera. Propongo, personalmente, anche di seguire il progetto Scalatra (lo so, il nome è orrendo), per le sue interessanti caratteristiche visto che si tratta di un approccio nuovo per lo sviluppo web-oriented, il primo esempio del quale è il framework Sinatra, nato per il linguaggio Ruby. A mio avviso da seguire è anche il framework Play! in rapida evoluzione, come del resto tutto quanto gravita intorno a Scala.
Anche il cosiddetto "ecosistema" infatti sta crescendo e sono convinto che la tendenza sia quella improntata ad una forte espansione. Se poi sarà Scala l'erede di Java, il cui impero parrebbe declinare, quello è un altro discorso che dipende da tanti fattori, non ultimo la diffusione di una cosiddetta "killer application" per Scala. Tra l'altro sono in arrivo nuovi pretendenti al trono come i linguaggi Kotlin e Ceylon, per ora entrambi in fase embrionale e piuttosto in ritardo ma chissà... la battaglia è iniziata, assunto che comunque Java è sempre abbondantemente in testa nelle rilevazioni sui linguaggi di programmazione più usati.

Odersky, da buon tedesco, cura con molta attenzione al sua creatura, favorito anche dall'arrivo di alcuni discreti finanziamenti e ha tracciato linee di sviluppo molto interessanti. Ad esempio, si parla di Scala for Javascript, di interazione con LLVM e anche della peraltro non banale ma comunque graditissima introduzione del design by contract (speriamo, adoro questa feature in un linguaggio).... insomma il progetto va avanti.

Per onestà intellettuale bisogna anche vedere cosa non va o cosa potrebbe non piacere di Scala. L'interprete ed il compilatore sono lenti e questo genera un certo fastidio, reale. Il team di sviluppo lo sa e ci sta lavorando sopra. La sintassi non è difficile ma la leggibilità dei programmi può facilmente diventarlo, questo lo hanno notato in molti. Qualcuno ha detto che scrivere programmi incomprensibili è possibile in ogni linguaggio ma questo riesce più semplice usando Scala. Leggerete quindi sovente che il codice Scala può non essere proprio user-friendly, di primo acchito.  Questo è stato un po' voluto "by design" nel tentativo di contenere la fase di pura digitazione (forse per reazione a certe verbosità che si devono usare in Java). Non viene incoraggiato alcuno stile particolare di programmazione e questo, per quanto possa essere visto come un minor issue, non è un punto a favore, secondo qualche ipercritico. In realtà, e qui forse c'è un gradino importante dal punto di vista dell'apprendimento, Scala obbliga la comprensione piena di entrambi gli approcci (OO e funzionale) per poter essere sfruttato appieno. Il creatore di Ceylon (il nuovo linguaggio di cui parlo in altra sezione), Gavin King, ha sottolineato la eccessiva complessità del type system di Scala, anche se qui bisogna dire che non è poi una cosa così tremenda ed il buon Gavin doveva pur trovare qualche appiglio per lanciare il suo interessante progetto.  Quasi tutti gli autori di linguaggi di programmazione scrivono che ne hanno voluto creare uno nuovo perchè nessuno di quelli esistenti si confaceva pienamente alle loro necessità, per un motivo o per l'altro... Certo è che l'apprendimento della creatura del buon Odersky può essere a volte un po' frustrante, sicuramente non è banale, si vuole che sia un linguaggio "per professionisti". Da ultimo aggiungiamo, dolente nota, che il supporto da parte dei vari IDE (Eclipse, Netbeans, IntelliJIdea ecc...) come detto in precedenza non dovrebbe mancare, stante la natura del linguaggio, ma nei fatti è un po' zoppicante e ed è una situazione che andrebbe sanata visto che chi programma a livello professionale ha bisogno, appunto, di strumenti professionali. Ma ci vogliono risorse al momento non di facile reperimento per risolvere il problema.
Insomma Scala è potente e bello ma qualche sacrificio lo impone.