Raku (linguaggio di programmazione)

linguaggio di programmazione
(Reindirizzamento da Perl 6)

Raku (precedentemente noto come Perl 6) è un linguaggio di programmazione della famiglia Perl.[1]

Raku
linguaggio di programmazione
AutoreLarry Wall e Audrey Tang
Data di origine25 dicembre 2015
Ultima versionev6.d "Diwali" (17 luglio 2019)
Utilizzogeneral-purpose
Paradigmiprogrammazione orientata agli oggetti, programmazione imperativa e programmazione funzionale
Tipizzazionedinamica, graduale
Estensioni comuniraku, rakumod, rakudoc, rakutest e t
Influenzato daHaskell, Perl, Common LISP, Ada, META II, APL, Ruby, Python, Smalltalk e Self
Implementazione di riferimento
ImplementazioneRakudo
Sistema operativoMultipiattaforma
LicenzaArtistic License 2.0
Sito webraku.org/

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à 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.",[2] ed il 25 dicembre 2015 la prima versione stabile fu annunciata.[3]

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[4]. 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 modifica

«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 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.[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]

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.[11] Il terzo è Git, ossia una raccolta repository del codice sorgente, che risiede qui https://github.com/perl6.

Obiettivi modifica

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 modifica

 
Larry Wall e Camelia

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.

I maggiori cambiamenti dal Perl5 al Perl6 modifica

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[13] e molti progetti che ambiscono implementarla[14].

Implementazione modifica

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 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 modifica

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. kp6 è compilato da mp6 oggi e può lavorare con backend multipli.[21][22] 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.[23]

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.[24]

Oggetti modifica

In Perl 6 tutto è un oggetto e non ci sono più puntatori.[25]

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.

 Perl 5: @new = (ref $old eq 'ARRAY') ? @$old : ($old);
 Perl 6: @new = @$old;

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:

 Perl 5:  sub foo {...}; # decl.
 Perl 5:  foo(\$bar); # call
 Perl 6: sub foo ($bar is rw);# decl.
 Perl 6: foo($bar); #  call

I moduli modifica

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.[26] 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.[27]

Note modifica

  1. ^ 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.»
  2. ^ 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.»
  3. ^ Christmas is here., su Perl 6 Advent Calendar. URL consultato il 27 dicembre 2015.
  4. ^ 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).
  5. ^ Federico Biancuzzi e Shane Warden, Masterminds of Programming: Conversations with the Creators of Major Programming Languages, 2009, ISBN 978-0-596-51517-1.
  6. ^ Kline, Joe, Report from the Perl Conference, su perl.com, 21 agosto 2000.
  7. ^ Wall, Larry, State of the Onion 2000, su perl.com, O'Reilly Network, 2000.
  8. ^ The Perl Foundation, About Perl 6 RFCs, su dev.perl.org, 2000.
  9. ^ Larry Wall and the Perl 6 designers, Perl 6 Design Documents, su design.perl6.org, 2015.
  10. ^ The Perl Foundation, Exegeses, su dev.perl.org, 2001.
  11. ^ The Perl Foundation, Perl Development: Mailing Lists, su dev.perl.org, 2002.
  12. ^ 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.
  13. ^ Perl 6 Specification, su perl6.org, The Perl 6 Project. URL consultato il 27 gennaio 2011.
  14. ^ Perl 6 Compilers, su perl6.org, The Perl 6 Project. URL consultato il 27 gennaio 2011.
  15. ^ Rakudo Perl, su rakudo.org. URL consultato il 30 luglio 2017.
  16. ^ rakudo/rakudo - GitHub, su github.com. URL consultato il 21 settembre 2013.
  17. ^ Michaud, Patrick, The compiler formerly known as 'perl6', su use.perl.org, 16 gennaio 2008 (archiviato dall'url originale il 18 febbraio 2012).
  18. ^ Jonathan Worthington, MoarVM: A virtual machine for NQP and Rakudo, su 6guts. URL consultato il 24 luglio 2013.
  19. ^ MoarVM, su moarvm.com, MoarVM team. URL consultato l'8 luglio 2017.
  20. ^ Feature comparison of Perl 6 compilers, su perl6.org. URL consultato il 27 luglio 2017 (archiviato dall'url originale l'11 agosto 2017).
  21. ^ Wall, Larry, Perl 6 STD, su github.com, 2007.
  22. ^ 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).
  23. ^ Yapsi README, su github.com, 2011.
  24. ^ Stefan O'Rear, Niecza README.pod, su github.com, 29 novembre 2011. URL consultato il 12 gennaio 2012.
  25. ^ 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).
  26. ^ Wall, Larry, Synopsis 11: Modules, su design.perl6.org, 2004. URL consultato il 29 luglio 2017 (archiviato dall'url originale il 13 agosto 2017).
  27. ^ Perl 6 Modules Directory, su modules.perl6.org. URL consultato il 21 settembre 2013.

Collegamenti esterni modifica