Perl 6
# Perl 6

Raku (Perl 6) è un linguaggio di programmazione della famiglia Perl.

Esso introduce elementi di molti linguaggi, dai più moderni a quelli più affermati.

La compatibilità con il Perl 5 non è considerata un obiettivo, sebbene sia prevista una modalità compatibile all'interno delle specifiche del linguaggio. Lo sviluppo di questo linguaggio iniziò nell'anno 2000.

Nel febbraio del 2015 un post della Perl Foundation affermava che "il team Perl 6 cercherà di fornire una versione di sviluppo 1.0 entro il compleanno di Larry Wall in settembre ed una definitiva per Natale.", ed il 25 dicembre 2015 la prima versione stabile fu annunciata.

La prima implementazione realmente trainante, avvenne grazie allo sviluppo su Pugs, iniziò nel 2005 e da allora ci sono stati molteplici progetti per implementare il Perl 6. Rakudo Perl 6 è basato su NQP (Not Quite Perl) e può usare la MoarVM oppure la Java Virtual Machine come ambienti runtime; Rakudo rilascia una nuova versione ogni mese; nel luglio 2010, il progetto rilasciò la prima distribuzione Rakudo Star. Si tratta di una collezione che raggruppa insieme una implementazione di Perl 6 e del materiale utile ed usabile ad esso correlato. Larry Wall continua ad aggiornare una grammatica di riferimento, nota come STD.pm6, scritta in Perl 6 e che gira con Perl 5.

## Storia

«In Perl 6 abbiamo deciso che sarebbe stato meglio correggere il linguaggio che correggere l'utente»

(Larry Wall)

La partenza del progetto Perl 6 fu annunciata per la prima volta il 19 luglio 2000, il quarto giorno della Perl Conference di quell'anno da Larry Wall stesso, durante la sua conferenza State of the Onion 2000. A quel tempo, i primi obiettivi erano rimuovere i "problemi storici" del linguaggio; la citazione di riferimento fu questa: "cose semplici debbono restare semplici, cose difficili debbono diventare più semplici e cose impossibili dovrebbero diventare difficili;" Una pulizia generale della struttura interna e delle APIs. Il processo iniziò con una serie di richieste di suggerimenti dette in inglese "RFCs". Questo processo fu aperto a tutti e non lasciò da parte nessun aspetto del linguaggio.

Quando il processo RFC fu compiuto, Wall rivide e classificò ogni richiesta, mentre l'obiettivo finale era di scrivere una direttiva per ogni capitolo di Programming Perl. La procedura era molto semplice, ovvero appena un capitolo veniva scritto, le direttive precedenti venivano invalidate dai cambiamenti successivi. Per questa ragione si pubblicarono una serie di riassunti, ciascuno relativo al contenuto di una direttiva contenente anche tutti gli aggiornamenti successivi. Oggi le specifiche del Perl 6 continuano quasi interamente all'interno di quei riassunti.

Ci sono anche una serie di interpretazioni, scritte da Damian Conway le quali spiegano il contenuto di ciascuna direttiva in termini di uso pratico. Ciascuna interpretazione consiste in esempi di codice insieme alla discussione sull'uso e sulle implicazioni degli esempi.

Ci sono tre modi principali di comunicare usati nel ciclo di sviluppo del Perl 6, oggi. Il primo è il Template:Freenode IRC channel on freenode. Il secondo è un insieme di mailing list che stanno sui server della The Perl Foundation presso perl.org. Il terzo è Git, ossia una raccolta repository del codice sorgente, che risiede qui https://github.com/perl6.

### Obiettivi

La rottura della compatibilità fu obbligata fin dall'inizio del progetto; essa permise alcuni dei cambiamenti che Larry Wall suggeriva nel suo discorso. I "difetti storici" come la confusione che aleggiava intorno ai sigilli usati come contenitori; l'ambiguità tra le funzioni select ; l'impatto sintattico delle parole senza sigillo che servivano per maneggiare i file e molti altri problemi che i programmatori Perl avevano discusso, pensando al modo in cui potessero essere risolte, ma restando per anni irrisolte.

Nel corso degli anni Perl 6 ha subito molti cambiamenti nella direzione di marcia. L'introduzione di concetti provenienti da Python and Ruby lo hanno influenzato ma come l'interprete Pugs venne scritto usando il linguaggio Haskell programming language, così molte influenze della programmazione funzionale furono assorbite dal gruppo di sviluppo del 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.

## I maggiori cambiamenti dal Perl5 al Perl6

I due linguaggi differiscono nelle loro fondamenta di base, sebbene l'intento generale sia quello di mantenere il Perl 6 all'interno del Perl, così che il Perl 6 sia chiaramente un linguaggio di programmazione Perl. La maggior parte dei cambiamenti è intesa a normalizzare il linguaggio, per renderlo più semplice, dare consistenza, togliere le ambiguità che obbligano a soluzioni euristiche.

Non esistono specifiche scritte o uno standard per il Perl 5 né esistono intenzioni di scriverle. C'è stata una sola implementazione dell'interprete ed il linguaggio si è evoluto con essa. È questo interprete, insieme con i suoi test funzionali, che fornisce uno standard de facto del linguaggio. Perl 6, in questo, è totalmente differente; è partito con una specifica e molti progetti che ambiscono 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 ed un compilatore backend-specific. Grandi 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. kp6 è compilato da mp6 oggi e può lavorare con backend multipli. 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 uno dei rilasci di Rakudo Star.

Niecza, è stato un altro dei principali progetti per implementare il Perl 6; era focalizzato sull'ottimizzazione e sull'efficienza. Esso indirizza la Common Language Infrastructure.

## Oggetti

In Perl 6 tutto è un oggetto e non ci sono più puntatori. Non dobbiamo pensare ai puntatori come riferimenti a strutture dati (array, hash...) come per il Perl 5, ma cambiare prospettiva pensando che un oggetto o il puntatore ad esso, si confondono; un'idea è quella del concetto di puntatori grassi, che si portano dietro tutta l'identità di un oggetto, ovvero se interroghiamo (con un opportuno metodo introspettivo) l'oggetto oppure il suo puntatore, le risposte sono le stesse.

Per esempio:

Se prendiamo uno scalare $old che può essere un puntatore ad un array oppure un elemento dell'array, mentre nel Perl 5 bisogna distinguere le due possibilità, in Perl 6 questo non serve e l'assegnamento è valido.

Corollario: passaggio di argomenti per riferimento o per valore? Questa distinzione tipica di linguaggi come il 'C' ora perde senso: sotto il cofano sarà sempre per riferimento, unico modo per passare un'intera struttura dati con un singolo parametro. Per il programmatore, tramite l'attributo rw possiamo consentire effetti collaterali sull'oggetto che, di default, è read-only.

Esempio:

## I moduli

I moduli sono porzioni di codice preparate per poter essere riutilizzate. Da quando furono introdotti nel Perl 5 hanno permesso la stabilizzazione del nucleo del linguaggio è nello stesso tempo consentono una flessibilità nuova.

Anche nel Perl 6 i moduli sono presenti. Le specifiche del Perl 6 richiedono che i moduli siano identificati per nome, versione ed autore. Sia possibile caricare solo una specifica versione di un modulo, oppure anche due moduli con lo stesso nome ma che differiscano nella versione o nell'autore. Per convenienza e comodità si consente l'alias con nomi brevi.

CPAN, il sistema di distribuzione dei moduli del Perl 5, non è ancora disponibile per il Perl 6. Viene usato il prototipo di un nuovo sistema.

