# Raku (linguaggio di programmazione)

Raku (precedentemente noto come Perl 6) è un linguaggio di programmazione della famiglia Perl.
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". Il 25 dicembre 2015 fu annunciata la prima versione stabile.
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, 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: 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

(Larry Wall)
L'avvio del progetto Perl 6 fu annunciato per la prima volta il 19 luglio 2000, durante la Perl Conference di quell'anno. Larry Wall, creatore del linguaggio, ne diede l'annuncio nel suo intervento State of the Onion 2000. 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 RFC (Request for Comments), coinvolgendo la comunità e toccando ogni aspetto del linguaggio.
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.
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.
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 e il repository del codice sorgente Git disponibile su https://github.com/perl6.

### Obiettivi

La 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, 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 di programmazione Haskell, influenze consistenti della programmazione funzionale vennero così assorbite dal gruppo di sviluppo di Perl 6.

### Mascotte

La mascotte del linguaggio è Camelia (nome che allude alla mascotte storica del Perl, il cammello). I disegni a spirale interni alle ali di farfalla assomigliano a P6, il soprannome di Perl 6.

## Cambiamenti dal Perl5 al Perl6

I 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 e numerosi progetti volti a implementarla.

## Implementazione

Nessuna 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 è l'unica implementazione attiva, mentre in passato sono state sviluppate varie implementazioni, sia come interprete sia come compilatore.
Rakudo Perl 6 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 e la catena di compilazione NQP. 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, 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

Pugs è 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.
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. 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.
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.

## Oggetti

In Perl 6, tutto è un oggetto e non ci sono più puntatori.
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.
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:

## Moduli

I 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. 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.