Raku (linguaggio di programmazione)
Raku (precedentemente noto come Perl 6) è un linguaggio di programmazione della famiglia Perl.[1]
Raku linguaggio di programmazione | |
---|---|
Autore | Larry Wall e Audrey Tang |
Data di origine | 25 dicembre 2015 |
Ultima versione | v6.d "Diwali" (17 luglio 2019) |
Utilizzo | general-purpose |
Paradigmi | programmazione orientata agli oggetti, programmazione imperativa e programmazione funzionale |
Tipizzazione | dinamica, graduale |
Estensioni comuni | raku, rakumod, rakudoc, rakutest e t |
Influenzato da | Haskell, Perl, Common LISP, Ada, META II, APL, Ruby, Python, Smalltalk e Self |
Implementazione di riferimento | |
Implementazione | Rakudo |
Sistema operativo | Multipiattaforma |
Licenza | Artistic License 2.0 |
Sito web | raku.org/ |
Raku presenta elementi derivati da un'ampia gamma di linguaggi, sia moderni che storici.
Inizialmente, la compatibilità con Perl 5 non era considerata un obiettivo primario; tuttavia, una modalità fu prevista nelle specifiche del linguaggio. Lo sviluppo ebbe inizio nel 2000.
Nel febbraio del 2015, un annuncio della Perl Foundation dichiarava che "il team Perl 6 si impegnerà per rilasciare una versione di sviluppo 1.0 in occasione del compleanno di Larry Wall nel settembre 2015, e una versione definitiva per Natale".[2] Il 25 dicembre 2015 fu annunciata la prima versione stabile.[3]
Nelle fasi iniziali dello sviluppo del linguaggio di programmazione Perl 6 (ora Raku), furono intrapresi diversi tentativi di implementazione. Un punto di svolta significativo fu l'emergere di Pugs nel 2005. Pugs rappresentò uno dei primi e importanti sforzi per rendere concretamente operativo Perl 6, funzionando in modo simile a un prototipo iniziale. Attualmente, l'implementazione principale di Raku è Rakudo Perl 6, costruita utilizzando uno strumento denominato, NQP [4], per il cui funzionamento sono necessari ambienti di esecuzione specifici di run-time, come MoarVM o la Java Virtual Machine. Rakudo rilascia una nuova versione mensilmente. Nel luglio 2010, il progetto lanciò la prima distribuzione Rakudo Star[5]: una raccolta che includeva un'implementazione di Perl 6 e materiale utile e fruibile ad essa collegato. Larry Wall continuò ad aggiornare una grammatica di riferimento, nota come STD.pm6, scritta in Perl 6 ed eseguibile con Perl 5.
Storia
modifica«In Perl 6 abbiamo deciso che sarebbe stato meglio correggere il linguaggio piuttosto che correggere l'utente»
L'avvio del progetto Perl 6 fu annunciato per la prima volta il 19 luglio 2000, durante la Perl Conference[7] di quell'anno. Larry Wall, creatore del linguaggio, ne diede l'annuncio nel suo intervento State of the Onion 2000.[8] Gli obiettivi iniziali includevano la risoluzione dei "problemi storici" del linguaggio ("cose semplici debbono restare semplici, cose difficili debbono diventare più semplici e cose impossibili dovrebbero diventare difficili") e una riorganizzazione generale della struttura interna e delle API. Il processo si aprì con una serie di proposte di modifica, le RFCs (Request for Comments), coinvolgendo la comunità e toccando ogni aspetto del linguaggio.[9]
Completata la fase delle RFC, Wall esaminò e organizzò le proposte, con l'intento di definire una linea guida per ogni capitolo di Programming Perl. La metodologia prevedeva che le linee guida venissero aggiornate e sostituite man mano che i capitoli venivano redatti. Perciò, furono pubblicati dei riassunti periodici, ognuno relativo al contenuto delle direttive e ai successivi aggiornamenti. Le specifiche di Perl 6 si trovano tutt'oggi principalmente in quei riassunti.[10]
Esistono anche delle "esegesi" interpretative, opera di Damian Conway, che illustrano l'applicazione pratica delle direttive attraverso esempi di codice e analisi del loro utilizzo e implicazioni.[11]
Attualmente, lo sviluppo di Perl 6 si avvale di tre principali canali di comunicazione: il canale IRC, freenode, le mailing list ospitate sui server di The Perl Foundation presso perl.org.[12] e il repository del codice sorgente Git disponibile su https://github.com/perl6."
Obiettivi
modificaLa rottura della compatibilità fu una necessità fin dall'inizio del progetto; essa consentì alcune modifiche suggerite da Larry Wall nel suo discorso: i "difetti storici", come l'esistente confusione sui sigilli usati come contenitori [13], l'ambiguità della funzione select
, l'impatto sintattico di parole senza sigillo atte a maneggiare i file e vari altri problemi discussi dai programmatori Perl, riflettendo su come risolverli ma rimanendo irrisolti per anni.
Nel corso degli anni, Perl 6 ha sperimentato diverse variazioni nella sua evoluzione. Fu influenzato dall'introduzione di concetti propri di Python e Ruby; ma poiché l'interprete Pugs venne scritto adottando il linguaggio Haskell programming language, influenze consistenti della programmazione funzionale vennero così assorbite dal gruppo di sviluppo di Perl 6.
Mascotte
modificaLa mascotte del linguaggio è Camelia (nome che allude alla mascotte storica del Perl, il cammello)[14]. I disegni a spirale interni alle ali di farfalla assomigliano a P6, il soprannome di Perl 6.
Cambiamenti dal Perl5 al Perl6
modificaI due linguaggi divergono nelle loro fondamenta, sebbene l'obiettivo generale sia di mantenere Perl 6 nell'ambito della famiglia Perl, affinché resti identificabile come linguaggio di programmazione Perl.
Gran parte delle modifiche mira a uniformare il linguaggio per aumentarne la semplicità e la coerenza, eliminando ambiguità che conducono a soluzioni euristiche.
Per Perl 5 non esistono specifiche scritte o standard, né si prevede di redigerli. Esiste un'unica implementazione dell'interprete, con cui il linguaggio si è evoluto. Tale interprete, unitamente ai suoi test funzionali, costituisce uno standard de facto. Perl 6 si distingue nettamente: è nato con una specifica[15] e numerosi progetti volti a implementarla[16].
Implementazione
modificaNessuna implementazione sarà definita come ufficiale per il Perl 6, piuttosto "Perl 6 è qualche cosa che termina con successo la test suite ufficiale".
Oggi Rakudo Perl 6[17] è l'unica implementazione attiva, mentre in passato sono state sviluppate varie implementazioni, sia come interprete sia come compilatore.
Rakudo Perl 6[18][19] indirizza un certo numero di macchine virtuali, come la MoarVM, la Java Virtual Machine e JavaScript. La MoarVM è una macchina virtuale costruita apposta per Rakudo Perl 6[20] e la catena di compilazione NQP.[21] C'è un livello tra Perl 6 e la macchina virtuale chiamato Not Quite Perl 6, or NQP, che implementa le regole del Perl 6 per leggere il Perl 6 come un albero sintattico astratto e un compilatore backend-specific [22], in sintesi, tra Raku e la macchina virtuale (come la JVM) c'è uno strato intermedio chiamato Not Quite Perl 6 (NQP), un componente fondamentale che si occupa di "preparare" il codice Raku per l'esecuzione. Estese parti di Rakudo sono state scritte tramite lo stesso Perl 6 o tramite il suo sottoinsieme NQP. Rakudo tuttavia non è un'implementazione completamente consistente (ossia completamente scritta con Perl 6) né ci sono piani per renderla tale.
Implementazioni storiche
modificaPugs è stata l'implementazione iniziale per il Perl 6 e fu scritta in Haskell. Pugs implementava le funzionalità più avanzate del Perl 6 ma dalla metà del 2007 è dormiente. Dal novembre 2014 Pugs non è più attivamente revisionato.[23]
Nel 2007 furono scritti un v6-MiniPerl6 ("mp6") e la sua ri-implementazione v6-KindaPerl6 ("kp6") come mezzo per compilare il Perl-6.0.0 STD usando Perl 5. La STD è una grammatica completa per il Perl 6 ed è stata scritta in Perl 6. In teoria, qualsiasi software capace di analizzare la STD e generare codice eseguibile è un valido compilatore per il Perl 6. Attualmente kp6 è compilato da mp6 e può lavorare con backend multipli.[24][25] Tuttavia, mp6 e kp6 non sono implementazioni complete del Perl 6 e sono progettate solo per implementare le funzionalità minime richieste per compilare un compilatore completo per il Perl 6.
Yapsi è un compilatore Perl 6 e simulatore, scritto interamente in Perl 6. Quindi, necessita per funzionare, di un interprete Perl 6, come una delle distribuzioni di Rakudo Star.[26]
Niecza è stato un altro dei principali progetti per implementare il Perl 6; era focalizzato sull'ottimizzazione e sull'efficienza, ed era dedicato alla Common Language Infrastructure.[27]
Oggetti
modificaIn Perl 6, tutto è un oggetto e non ci sono più puntatori.[28]
In altre parole, non bisogna più pensare ai puntatori come riferimenti a strutture dati (array, hash...) come per il Perl 5, ma cambiare prospettiva pensando che l'oggetto e il riferimento ad esso si equivalgono; un'idea che si può esprimere con il concetto di "puntatori grassi", intendendo che l'oggetto incorpora la propria identità. Quindi, interrogando (con un opportuno metodo introspettivo) l'oggetto oppure un suo riferimento, si ottengono le stesse risposte.
Per esempio:
Se prendiamo uno scalare $old, che in Perl 5 potrebbe essere un puntatore a un array oppure un elemento dell'array, in Perl 6 questa distinzione non è necessaria e l'assegnamento diretto è valido e semanticamente chiaro.
Perl 5: @new = (ref $old eq 'ARRAY') ? @$old : ($old); Perl 6: @new = @$old;
Di conseguenza, in Perl 6, la distinzione tra passaggio di argomenti per riferimento o per valore, tipica di linguaggi come il C, diviene concettualmente superflua. Nella pratica, il passaggio degli argomenti avviene sempre per riferimento, rappresentando l'unico meccanismo per trasferire un'intera struttura dati tramite un singolo parametro. Per il programmatore, l'attributo rw consente di abilitare esplicitamente effetti collaterali sull'oggetto passato come argomento (che di default è considerato read-only).
Esempio:
Perl 5: sub foo {...}; # decl. Perl 5: foo(\$bar); # call Perl 6: sub foo ($bar is rw);# decl. Perl 6: foo($bar); # call
Moduli
modificaI moduli rappresentano porzioni di codice progettate per essere riutilizzate, una caratteristica introdotta con Perl 5 che ha permesso di stabilizzare il nucleo del linguaggio e, al contempo, di introdurre una notevole flessibilità.
Anche in Perl 6 i moduli sono un elemento fondamentale, ereditando l'importanza che rivestivano nella versione precedente del linguaggio.
Le specifiche di Perl 6 stabiliscono che i moduli debbano essere identificati univocamente attraverso il nome, la versione e l'autore.[29] Questa struttura consente di caricare versioni specifiche di un modulo, o persino la coesistenza di moduli con lo stesso nome ma con versioni o autori differenti. Per maggiore chiarezza e concisione, è possibile definire alias con nomi più brevi.
CPAN, il consolidato sistema di distribuzione dei moduli per Perl 5, non è direttamente compatibile con Perl 6. Per quest'ultimo viene utilizzato un sistema di distribuzione differente.[30]
Note
modifica- ^ About Perl, su perl.org. URL consultato il 20 aprile 2013.«"Perl" è una famiglia di linguaggi, "Perl 6" è parte della famiglia, ma si tratta di un linguaggio separato con un suo gruppo di sviluppatori. La sua esistenza non ha un impatto significativo sul proseguimento dello sviluppo di Perl 5.»
- ^ Perl Foundation, su perlfoundation.org (archiviato dall'url originale il 30 novembre 2005).«The Perl6 team will attempt to get a development release of version 1.0 available for Larry's birthday in September and a Version 1.0 release by Christmas. So it looks like Christmas 2015 was the Christmas that we were expecting.»
- ^ Christmas is here., su Perl 6 Advent Calendar. URL consultato il 27 dicembre 2015.
- ^ In relazione a Raku, NQP (Not Quite Perl) è un linguaggio di programmazione di livello inferiore e un toolkit che svolge un ruolo fondamentale nella costruzione e nell'esecuzione di Rakudo Perl 6, l'implementazione più utilizzata di Raku. Per semplificare, immagina NQP come le fondamenta e gli strumenti di base necessari per costruire una casa (Rakudo) dove le persone (i programmi Raku) possono vivere e funzionare.
- ^ Patrick Michaud, Announce: Rakudo Star — a useful, usable, "early adopter" distribution of Perl 6, su rakudo.org, 29 luglio 2010. URL consultato l'8 febbraio 2015 (archiviato dall'url originale il 19 dicembre 2014).
- ^ Federico Biancuzzi e Shane Warden, Masterminds of Programming: Conversations with the Creators of Major Programming Languages, 2009, ISBN 978-0-596-51517-1.
- ^ Kline, Joe, Report from the Perl Conference, su perl.com, 21 agosto 2000.
- ^ Wall, Larry, State of the Onion 2000, su perl.com, O'Reilly Network, 2000.
- ^ The Perl Foundation, About Perl 6 RFCs, su dev.perl.org, 2000.
- ^ Larry Wall and the Perl 6 designers, Perl 6 Design Documents, su design.perl6.org, 2015. URL consultato il 27 luglio 2017 (archiviato dall'url originale il 23 dicembre 2014).
- ^ The Perl Foundation, Exegeses, su dev.perl.org, 2001.
- ^ The Perl Foundation, Perl Development: Mailing Lists, su dev.perl.org, 2002.
- ^ Questa frase si riferisce a una specifica problematica presente nelle versioni precedenti di Perl (il linguaggio predecessore di Perl 6/Raku). Per capire meglio, dobbiamo definire i termini chiave: Sigilli (in inglese "sigils"): Sono caratteri speciali che vengono anteposti al nome di una variabile in Perl. Questi caratteri indicano il tipo di dato che la variabile conterrà. I sigilli più comuni in Perl 5 sono: $: per variabili scalari (che contengono un singolo valore, come un numero o una stringa). @: per array (liste ordinate di valori). %: per hash (collezioni di coppie chiave-valore). Contenitori: In Perl, le variabili stesse funzionano come dei "contenitori" per i dati. Il sigillo indica il tipo di contenitore. La confusione nasceva dal fatto che il sigillo, pur indicando il tipo di dato Ecco alcuni esempi di come questa confusione si manifestava: Accesso agli elementi di un array: Un array è indicato dal sigillo @, ad esempio @miei_numeri. Tuttavia, per accedere a un singolo elemento di quell'array, si usa il sigillo $, ad esempio $miei_numeri[0] per accedere al primo elemento. Questo poteva risultare controintuitivo, poiché si usava il sigillo dello scalare ($) per accedere a un elemento all'interno di un array (@). Accesso ai valori in un hash: Un hash è indicato dal sigillo %, ad esempio %mie_informazioni. Similmente all'array, per accedere a un singolo valore all'interno dell'hash (dato una certa chiave), si usava il sigillo $, ad esempio $mie_informazioni{'nome'} per ottenere il valore associato alla chiave 'nome'. Ancora una volta, il sigillo dello scalare per accedere a un elemento di un hash. In sintesi, la confusione risiedeva nel fatto che il sigillo indicava il tipo di "contenitore" nel suo complesso (array, hash, scalare), ma non sempre rifletteva il tipo di dato restituito quando si accedeva a un singolo elemento all'interno di quel contenitore. Questo portava a dover memorizzare regole specifiche su come accedere agli elementi, piuttosto che avere un sistema più uniforme e intuitivo. Perl 6 (Raku) ha cercato di risolvere questa confusione introducendo un sistema di sigilli più coerente e regole di accesso più intuitive. Ad esempio, in Raku, si usa sempre il sigillo del contenitore anche per accedere ai suoi elementi (con alcune eccezioni e regole specifiche di Raku).
- ^ Joab Jackson, Perl creator hints at imminent release of long-awaited Perl 6, su infoworld.com, IDG News Service, 23 luglio 2010. URL consultato l'8 febbraio 2015.
- ^ Perl 6 Specification, su perl6.org, The Perl 6 Project. URL consultato il 27 gennaio 2011.
- ^ Perl 6 Compilers, su perl6.org, The Perl 6 Project. URL consultato il 27 gennaio 2011.
- ^ Rakudo Perl, su rakudo.org. URL consultato il 30 luglio 2017.
- ^ rakudo/rakudo - GitHub, su github.com. URL consultato il 21 settembre 2013.
- ^ Michaud, Patrick, The compiler formerly known as 'perl6', su use.perl.org, 16 gennaio 2008 (archiviato dall'url originale il 18 febbraio 2012).
- ^ Jonathan Worthington, MoarVM: A virtual machine for NQP and Rakudo, su 6guts. URL consultato il 24 luglio 2013.
- ^ MoarVM, su moarvm.com, MoarVM team. URL consultato l'8 luglio 2017.
- ^ Compilatore backend-specific, si riferisce alla capacità di un compilatore di generare codice eseguibile su misura per un particolare ambiente di destinazione, che può essere un processore, un sistema operativo o una macchina virtuale. Nel contesto di NQP, significa che NQP ha la capacità di compilare Raku per diversi backend, come la JVM e MoarVM.
- ^ Feature comparison of Perl 6 compilers, su perl6.org. URL consultato il 27 luglio 2017 (archiviato dall'url originale l'11 agosto 2017).
- ^ Wall, Larry, Perl 6 STD, su github.com, 2007.
- ^ mp6/kp6 FAQ, su darcs.pugscode.org, Perl 6 development team, 2006. URL consultato il 27 luglio 2017 (archiviato dall'url originale il 28 settembre 2007).
- ^ Yapsi README, su github.com, 2011.
- ^ Stefan O'Rear, Niecza README.pod, su github.com, 29 novembre 2011. URL consultato il 12 gennaio 2012.
- ^ differenze tra Perl 5 e Perl 6, su design.perl6.org, design. Perl.org. URL consultato il 30 luglio 2017 (archiviato dall'url originale il 30 luglio 2017).
- ^ Wall, Larry, Synopsis 11: Modules, su design.perl6.org, 2004. URL consultato il 29 luglio 2017 (archiviato dall'url originale il 13 agosto 2017).
- ^ Perl 6 Modules Directory, su modules.perl6.org. URL consultato il 21 settembre 2013.
Collegamenti esterni
modifica- (EN) Sito ufficiale, su raku.org.
- Repository sorgenti di Raku, su github.com.
- Perl 6 intro, su perl6intro.com.