Racchetta (linguaggio di programmazione) - Racket (programming language)
|
DrRacket su Ubuntu
| |
| Paradigma | Multiparadigma : funzionale , imperativo , logico , meta , modulare , orientato agli oggetti , riflessivo |
|---|---|
| Famiglia | Lisp |
| Progettato da | PLT Inc. |
| Sviluppatore | PLT Inc. |
| Apparso per la prima volta | 1995 |
| Rilascio stabile | |
| Disciplina di digitazione | Dinamico , statico , forte |
| piattaforma | x86 , PowerPC , SPARC , MIPS , ARM |
| OS | Multipiattaforma |
| Licenza | MIT o Apache 2.0 |
| Estensioni dei nomi dei file | .rkt |
| Sito web | racket-lang |
| dialetti | |
| FrTime, Racchetta pigra, Scribble, Racchetta digitata | |
| Influenzato da | |
| Eiffel , Schema | |
| influenzato | |
| Clojure , Ruggine , Schema | |
Racket è un general-purpose , linguaggio di programmazione multi-paradigma basato sul Scheme dialetto Lisp . È progettato come una piattaforma per la progettazione e l'implementazione del linguaggio di programmazione . Oltre al linguaggio di base Racket, Racket è anche usato per fare riferimento alla famiglia di linguaggi di programmazione e set di strumenti che supportano lo sviluppo su e con Racket. La racchetta viene utilizzata anche per lo scripting , l' educazione informatica e la ricerca.
La piattaforma Racket fornisce un'implementazione del linguaggio Racket (incluso un sistema runtime , librerie e compilatore JIT ) insieme all'ambiente di sviluppo integrato (IDE) DrRacket scritto in Racket. Racket è utilizzato dal programma di sensibilizzazione ProgramByDesign , che mira a trasformare l' informatica in "una parte indispensabile del curriculum delle arti liberali ".
Il linguaggio principale di Racket è noto per il suo ampio sistema di macro che consente di creare linguaggi incorporati e specifici del dominio , costrutti linguistici come classi o moduli e dialetti separati di Racket con semantica diversa .
La distribuzione della piattaforma è un software gratuito e open source distribuito con le licenze Apache 2.0 e MIT . Estensioni e pacchetti scritti dalla comunità possono essere caricati nel catalogo dei pacchetti di Racket .
Storia
Sviluppo
Matthias Felleisen ha fondato PLT Inc. a metà degli anni '90, prima come gruppo di ricerca, subito dopo come progetto dedicato alla produzione di materiali pedagogici per programmatori alle prime armi (lezioni, esercizi/progetti, software). Nel gennaio 1995, il gruppo ha deciso di sviluppare un ambiente di programmazione pedagogica basato su Scheme . Matthew Flatt ha messo insieme MrEd, la macchina virtuale originale per Racket, da libscheme, wxWidgets e pochi altri sistemi gratuiti. Negli anni che seguirono, un team composto da Flatt, Robby Findler , Shriram Krishnamurthi , Cormac Flanagan e molti altri produssero DrScheme, un ambiente di programmazione per programmatori Scheme alle prime armi e un ambiente di ricerca per la digitazione soft . Il principale linguaggio di sviluppo supportato da DrScheme è stato chiamato PLT Scheme.
Parallelamente, il team ha iniziato a condurre workshop per insegnanti delle scuole superiori, formandoli nella progettazione di programmi e nella programmazione funzionale. I test sul campo con questi insegnanti ei loro studenti hanno fornito indizi essenziali per dirigere lo sviluppo.
Negli anni successivi, PLT ha aggiunto a DrScheme le lingue di insegnamento, uno stepper algebrico, un ciclo trasparente di lettura-valutazione-stampa , una stampante basata sul costruttore e molte altre innovazioni, producendo un ambiente di sviluppo di programmi pedagogici di qualità applicativa. Nel 2001, il team principale (Felleisen, Findler, Flatt, Krishnamurthi) aveva anche scritto e pubblicato il loro primo libro di testo, How to Design Programs , basato sulla loro filosofia di insegnamento.
Il Manifesto Racket descrive in dettaglio i principi che guidano lo sviluppo di Racket, presenta il quadro di valutazione alla base del processo di progettazione e descrive le opportunità per miglioramenti futuri.
Cronologia delle versioni
La prima generazione di revisioni dello schema PLT ha introdotto funzionalità per la programmazione in grande sia con moduli che con classi . La versione 42 ha introdotto le unità, un sistema modulare di prima classe, per completare le classi per lo sviluppo su larga scala. Il sistema di classi ha guadagnato funzionalità (ad esempio interfacce in stile Java ) e ha anche perso diverse funzionalità (ad esempio l'ereditarietà multipla ) in queste versioni. Il linguaggio si è evoluto attraverso una serie di versioni successive e ha guadagnato una popolarità fondamentale nella versione 53, portando a un ampio lavoro e alla successiva versione 100, che sarebbe equivalente a una versione "1.0" negli attuali sistemi di versione popolare.
La successiva revisione principale è stata denominata Versione 200, che ha introdotto un nuovo sistema di moduli predefinito che coopera con le macro. In particolare, il sistema del modulo garantisce che il calcolo in fase di esecuzione e in fase di compilazione siano separati per supportare una "torre di lingue". A differenza delle unità, questi moduli non sono oggetti di prima classe .
La versione 300 ha introdotto il supporto Unicode , il supporto per librerie esterne e perfezionamenti al sistema di classi. Successivamente, la serie 300 ha migliorato le prestazioni del runtime del linguaggio con l'aggiunta di un compilatore JIT e il passaggio a una raccolta di rifiuti generazionale predefinita .
Con la successiva major release, il progetto era passato a una numerazione delle versioni basata sulla sequenza più convenzionale . La versione 4.0 ha introdotto la #langscorciatoia per specificare la lingua in cui è scritto un modulo. Inoltre, la revisione ha introdotto coppie ed elenchi immutabili , il supporto per il parallelismo a grana fine e un dialetto tipizzato in modo statico .
Il 7 giugno 2010, PLT Scheme è stato ribattezzato Racket. La ridenominazione ha coinciso con il rilascio della versione 5.0. Successivamente, il backend dell'interfaccia utente grafica (GUI) è stato riscritto in Racket da C++ nella versione 5.1 utilizzando toolkit UI nativi su tutte le piattaforme. La versione 5.2 includeva uno strumento di controllo della sintassi in background , una nuova libreria di plottaggio, una libreria di database e una nuova REPL estesa. La versione 5.3 includeva una nuova funzionalità di sottomodulo per moduli caricati facoltativamente, nuovi strumenti di ottimizzazione , una libreria JSON e altre funzionalità. La versione 5.3.1 ha introdotto importanti miglioramenti a DrRacket: il controllo della sintassi in background è stato attivato per impostazione predefinita ed è stato aggiunto un nuovo strumento di anteprima della documentazione.
Nella versione 6.0, Racket ha rilasciato il suo sistema di gestione dei pacchetti di seconda generazione. Come parte di questo sviluppo, il repository principale di DrRacket e Racket è stato riorganizzato e suddiviso in un ampio insieme di piccoli pacchetti, rendendo possibile l'installazione di un rack minimo e di installare solo i pacchetti necessari.
La versione 7 di Racket è stata rilasciata con un nuovo espansore di macro scritto in Racket come parte dei preparativi per supportare il passaggio al sistema runtime Chez Scheme e supportare più sistemi runtime. Il 19 novembre 2019 è stato rilasciato Racket 7.5. La licenza di Racket 7.5 era meno restrittiva. Ora usano la licenza Apache 2.0 o la licenza MIT.
Il 13 febbraio 2021 è stato rilasciato Racket 8.0. Racket 8.0 segna la prima versione in cui Racket CS è l'implementazione predefinita. Racket CS è più veloce, più facile da mantenere e sviluppare ed è compatibile con le versioni precedenti dei programmi Racket esistenti, ha una migliore raccolta di rifiuti paralleli e in genere offre una riduzione del 10%-30% delle dimensioni del codice generato.
Caratteristiche
Il linguaggio principale di Racket include macro , moduli , chiusure lessicali , chiamate di coda , continuazioni delimitate , parametri (variabili fluide), contratti software , thread verdi e thread del sistema operativo e altro ancora. Il linguaggio include anche primitive, come eventspace e custodi, che controllano la gestione delle risorse e consentono al linguaggio di agire come un sistema operativo per caricare e gestire altri programmi. Ulteriori estensioni al linguaggio vengono create con il potente sistema di macro, che insieme al sistema di moduli e ai parser personalizzati può controllare tutti gli aspetti di un linguaggio. La maggior parte dei costrutti linguistici in Racket sono implementati come macro nel linguaggio di base. Questi includono un sistema di classi mixin , un sistema di componenti (o modulo) espressivo quanto l'attribuzione opaca nel sistema di moduli ML e il pattern matching .
Inoltre, il linguaggio presenta il primo sistema contrattuale per un linguaggio di programmazione di ordine superiore . Il sistema contract di Racket si ispira al lavoro Design by Contract per Eiffel e lo estende per lavorare per valori di ordine superiore come funzioni di prima classe , oggetti, celle di riferimento e così via. Ad esempio, è possibile garantire che un oggetto controllato da un contratto esegua controlli del contratto quando i suoi metodi vengono infine invocati.
Racket include sia bytecode che compilatori JIT (JIT). Il compilatore bytecode produce un formato di bytecode interno eseguito dalla macchina virtuale Racket e il compilatore JIT traduce il bytecode in codice macchina in fase di esecuzione.
Dal 2004, il linguaggio è stato fornito anche con PLAneT, un gestore di pacchetti integrato nel sistema di moduli in modo che le librerie di terze parti possano essere importate e utilizzate in modo trasparente. Inoltre, PLAneT ha una politica di controllo delle versioni integrata per prevenire l' inferno delle dipendenze .
Alla fine del 2014, gran parte del codice di Racket è stato spostato in un nuovo sistema di confezionamento separato dalla base di codice principale. Questo nuovo sistema di confezionamento è servito da un programma client denominato raco . Il nuovo sistema di pacchetti offre meno funzionalità rispetto a PLAneT; un post sul blog di Jay McCarthy sul blog Racket spiega le ragioni del cambiamento e come duplicare il vecchio sistema.
Estendibilità del linguaggio e macro integrate
Le caratteristiche che distinguono più chiaramente Racket dagli altri linguaggi della famiglia Lisp sono le sue funzionalità integrate di estensibilità del linguaggio che supportano la creazione di nuovi linguaggi specifici del dominio e di uso generale . Le funzionalità di estensibilità di Racket sono integrate nel sistema di moduli per consentire il controllo sulla sintassi sensibile al contesto ea livello di modulo. Ad esempio, la #%appforma sintattica può essere sovrascritta per modificare la semantica dell'applicazione della funzione . Allo stesso modo, il #%module-beginmodulo consente un'analisi statica arbitraria dell'intero modulo. Poiché qualsiasi modulo può essere utilizzato come linguaggio, tramite la #langnotazione, ciò significa che virtualmente qualsiasi aspetto del linguaggio può essere programmato e controllato.
Le caratteristiche di estensibilità a livello di modulo sono combinati con uno schema -come macro sistema igienico, che fornisce più caratteristiche che Lisp del sistema di manipolazione s-espressione, Schema 84 del igienico estendono-sintassi macro, o R5RS s' di sintassi-regole . In effetti, è corretto affermare che il sistema macro è un'interfaccia di programmazione dell'applicazione (API) attentamente ottimizzata per le estensioni del compilatore . Utilizzando questa API del compilatore, i programmatori possono aggiungere funzionalità e interi linguaggi specifici del dominio in un modo che li rende completamente indistinguibili dai costrutti di linguaggio incorporati.
Il sistema macro in Racket è stato utilizzato per costruire interi dialetti linguistici . Ciò include Typed Racket, che è un dialetto di Racket tipizzato gradualmente che facilita la migrazione dal codice non digitato a quello digitato, Lazy Racket, un dialetto con valutazione pigra e Hackett, che combina Haskell e Racket. Il linguaggio di programmazione pedagogica Pyret è stato originariamente implementato in Racket.
Altri dialetti includono FrTime ( programmazione reattiva funzionale ), Scribble (linguaggio di documentazione), Slideshow ( linguaggio di presentazione ) e diverse lingue per l'istruzione.
La distribuzione principale di Racket fornisce librerie per aiutare lo sviluppo di linguaggi di programmazione. Tali linguaggi non sono limitati alla sintassi basata sull'espressione s . Oltre alle tradizionali estensioni di sintassi basate su readtable, la direttiva #langconsente l'invocazione di parser arbitrari, che possono essere implementati utilizzando la libreria degli strumenti di parser. Vedere Programmazione logica del rack per un esempio di tale linguaggio.
Ambiente di programmazione
La piattaforma linguistica fornisce un IDE self-hosted denominato DrRacket, un server Web basato sulla continuazione , un'interfaccia utente grafica e altri strumenti. Come valido strumento di scripting con librerie come i comuni linguaggi di scripting , può essere utilizzato per lo scripting della shell Unix. Può analizzare gli argomenti della riga di comando ed eseguire strumenti esterni.
DrRacket IDE
DrRacket (precedentemente DrScheme) è ampiamente utilizzato tra i corsi introduttivi di informatica che insegnano Scheme o Racket ed è apprezzato per la sua semplicità e attrattiva per i programmatori principianti. L'IDE è stato originariamente creato per essere utilizzato con TeachScheme! progetto (ora ProgramByDesign ), uno sforzo di sensibilizzazione della Northeastern University e una serie di università affiliate per attirare studenti delle scuole superiori ai corsi di informatica a livello universitario.
L'editor fornisce l' evidenziazione per gli errori di sintassi e di runtime, la corrispondenza tra parentesi, un debugger e uno stepper algebrico. Le sue caratteristiche a misura di studente includono il supporto per più "livelli linguistici" (studente principiante, studente intermedio e così via). Dispone inoltre di supporto libreria integrato e sofisticati strumenti di analisi per programmatori avanzati. Inoltre, la programmazione orientata al modulo è supportata con il browser del modulo, una vista di contorno, misurazioni integrate di test e copertura e supporto per il refactoring . Fornisce un accesso integrato e sensibile al contesto a un ampio sistema di guida ipertestuale denominato "Help Desk".
DrRacket è disponibile per Windows , macOS , Unix e Linux con il sistema X Window e i programmi si comportano in modo simile su tutte queste piattaforme.
Esempi di codice
Ecco un banale programma Hello World :
#lang racket
"Hello, World!"
L'esecuzione di questo programma produce l'output:
- "Ciao mondo!"
Ecco un programma un po' meno banale:
#lang racket
(require 2htdp/image)
(let sierpinski ([n 8])
(if (zero? n)
(triangle 2 'solid 'red)
(let ([t (sierpinski (- n 1))])
(freeze (above t (beside t t))))))
Questo programma, tratto dal sito Racket, disegna un triangolo di Sierpinski , annidato a profondità 8.
Utilizzando la #langdirettiva, un file sorgente può essere scritto in diversi dialetti di Racket. Ecco un esempio del programma fattoriale in Typed Racket, un dialetto di Racket tipizzato staticamente :
#lang typed/racket
(: fact (Integer -> Integer))
(define (fact n)
(if (zero? n) 1 (* n (fact (- n 1)))))
Applicazioni e utilizzo pratico
Oltre ad avere una base nella teoria del linguaggio di programmazione , Racket è stato progettato come linguaggio generico per i sistemi di produzione. Pertanto, la distribuzione Racket presenta un'ampia libreria che copre i sistemi e la programmazione di rete, lo sviluppo web, un'interfaccia uniforme al sistema operativo sottostante, un'interfaccia di funzioni esterne dinamiche , diversi tipi di espressioni regolari , generatori di lexer/parser, programmazione logica e un struttura GUI completa .
Racket ha diverse funzionalità utili per un linguaggio commerciale, tra cui la capacità di compilare eseguibili autonomi sotto Windows, macOS e Unix, un profiler e un debugger inclusi nell'ambiente di sviluppo integrato (IDE) e un framework di test delle unità .
Racket è stato utilizzato per progetti commerciali e applicazioni web. Un esempio notevole è il sito Web Hacker News , che gira su Arc , sviluppato in Racket. Naughty Dog lo ha usato come linguaggio di scripting in molti dei suoi videogiochi.
Racket viene utilizzato per insegnare agli studenti l'algebra attraverso la progettazione di giochi nel programma Bootstrap .
Riferimenti
Ulteriori letture
- Fellesen et al. , 2013. Regno della racchetta . Nessuna pressa per amido.
- Fellesen et al. , 2003. Come progettare programmi . MIT Press.
link esterno
| 1955 | 1960 | 1965 | 1970 | 1975 | 1980 | 1985 | 1990 | 1995 | 2000 | 2005 | 2010 | 2015 | 2020 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| LISP 1, 1.5, LISP 2 (abbandonato) | ||||||||||||||
| Maclisp | ||||||||||||||
| Interlisp | ||||||||||||||
| Lisp macchina Lisp | ||||||||||||||
| schema | R5RS | R6RS | R7RS piccolo | |||||||||||
| NIL | ||||||||||||||
| Franz Lisp | ||||||||||||||
| Lispa comune | ||||||||||||||
| Le Lisp | ||||||||||||||
| T | ||||||||||||||
| Schema Chez | ||||||||||||||
| Emacs Lisp | ||||||||||||||
| AutoLISP | ||||||||||||||
| PicoLisp | ||||||||||||||
| EuLisp | ||||||||||||||
| ISLISP | ||||||||||||||
| OpenLisp | ||||||||||||||
| Schema PLT | Racchetta | |||||||||||||
| GNU Guile | ||||||||||||||
| LISP visivo | ||||||||||||||
| Clojure | ||||||||||||||
| Arco | ||||||||||||||
| LFE | ||||||||||||||
| Hy | ||||||||||||||