Esso presenta elementi di molti linguaggi, dai più moderni a quelli più storici.
La compatibilità con il Perl 5 non era considerata inizialmente un obiettivo, sebbene sia prevista una modalità di compatibilità 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.",[2] ed il 25 dicembre 2015 la prima versione stabile fu annunciata.[3]
La prima implementazione realmente trainante[non chiaro], avvenuta 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[4]: si tratta di una collezione che raggruppa un'implementazione di Perl 6 e del materiale utile e 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 piuttosto che correggere l'utente»
La partenza del progetto Perl 6 fu annunciata per la prima volta il 19 luglio 2000, il quarto giorno della Perl Conference[6] di quell'anno, da Larry Wall stesso durante la sua conferenza State of the Onion 2000.[7] A quel tempo, i primi obiettivi erano quelli di 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") e una pulizia generale della struttura interna e delle APIs. Il processo iniziò con una serie di richieste di suggerimenti, dette in inglese RFCs (Request for Comments). Questo processo fu aperto a tutti e non lasciò da parte nessun aspetto del linguaggio.[8]
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.[9]
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.[10]
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 esistente sui 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. È stato influenzato dall'introduzione di concetti provenienti da Python e Ruby; ma poiché 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)[12]. 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 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, dargli consistenza ed eliminare 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[13] e molti progetti che ambiscono implementarla[14].
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[15] è l'unica implementazione attiva, mentre in passato sono state sviluppate varie implementazioni, sia come interprete sia come compilatore.
Rakudo Perl 6[16][17] 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[18] e la catena di compilazione NQP.[19] 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. Estere 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.[20]
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.[21][22] 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.[23]
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.[24]
Oggetti
In Perl 6 tutto è un oggetto e non ci sono più puntatori.[25]
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 un oggetto e il puntatore ad esso si confondono; un'idea che si esprime con il 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 a 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 diretto è valido.
Di conseguenza perde di senso la distinzione tra passaggio di argomenti per riferimento o per valore, tipica di linguaggi come il C: nella realtà il passaggio sarà sempre per riferimento, unico modo per passare un'intera struttura dati con un singolo parametro. Per il programmatore, tramite l'attributo rw è possibile consentire effetti collaterali sull'oggetto che, di default, è 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
I moduli sono porzioni di codice preparate in modo da poter essere riutilizzate. Da quando furono introdotti nel Perl 5 hanno permesso la stabilizzazione del nucleo del linguaggio e 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.[26] È 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'uso di 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.[27]
Note
^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 su 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.
^ 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.
^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).
^ 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).