Raketa (programovací jazyk) - Racket (programming language)

Raketa
Racket-logo.svg
Drracket.png
DrRacket na Ubuntu
Paradigma Multi-paradigma : funkční , imperativní , logické , meta , modulární , objektově orientované , reflexní
Rodina Lisp
Navrhl PLT Inc.
Vývojář PLT Inc.
Poprvé se objevil 1995 ; Před 26 lety ( 1995 )
Stabilní uvolnění
8.1  Upravte to na Wikidata / 4. května 2021 ; Před 46 dny ( 4. května 2021 )
Psací disciplína Dynamické , statické , silné
Plošina x86 , PowerPC , SPARC , MIPS , ARM
OS Cross-platform
Licence MIT nebo Apache 2.0
Přípony názvu souboru .rkt
webová stránka raketa-lang .org
Dialekty
FrTime, Lazy Racket, Scribble, Typed Racket
Ovlivněno
Eiffel , schéma
Ovlivněno
Clojure , Rust , Scheme

Raketa je general-purpose , multi-paradigma programovací jazyk založený na schématu dialekt Lisp . Je navržen jako platforma pro návrh a implementaci programovacího jazyka . Kromě základního jazyka Racket se Racket také používá k označení rodiny programovacích jazyků a sady nástrojů podporujících vývoj na a s Racket. Raketa se také používá pro skriptování , výuku informatiky a výzkum.

Platforma Racket poskytuje implementaci jazyka Racket (včetně běhového systému , knihoven a kompilátoru JIT ) spolu s integrovaným vývojovým prostředím DrRacket (IDE) napsaným v Racket. Racket je používán terénním programem ProgramByDesign , jehož cílem je proměnit počítačovou vědu v „nepostradatelnou součást osnov svobodných umění “.

Jádrový jazyk Racket je známý svým rozsáhlým systémem maker , který umožňuje vytváření vložených jazyků a jazyků specifických pro doménu , jazykových konstrukcí, jako jsou třídy nebo moduly , a samostatných dialektů Racket s odlišnou sémantikou .

Distribuce platformy je bezplatný a open-source software distribuovaný pod licencemi Apache 2.0 a MIT . Rozšíření a balíčky napsané komunitou lze nahrát do katalogu balíčků Racket .

Dějiny

Rozvoj

Matthias Felleisen založil společnost PLT Inc. v polovině 90. let, nejprve jako výzkumná skupina, brzy poté jako projekt věnovaný výrobě pedagogických materiálů pro začínající programátory (přednášky, cvičení / projekty, software). V lednu 1995 se skupina rozhodla vyvinout prostředí pedagogického programování založené na Scheme . Matthew Flatt dláždil MrEd, původní virtuální stroj pro Racket, z libscheme, wxWidgets a několika dalších bezplatných systémů. V následujících letech tým včetně Flatta, Robbyho Findlera , Shrirama Krishnamurthiho , Cormaca Flanagana a mnoha dalších vytvořil DrScheme, programovací prostředí pro začínající programátory schémat a výzkumné prostředí pro měkké psaní . Hlavní vývojový jazyk, který DrScheme podporoval, byl pojmenován PLT Scheme.

Souběžně s tím tým začal organizovat workshopy pro učitele středních škol, které je školily v oblasti návrhu programu a funkčního programování. Terénní testy s těmito učiteli a jejich studenty poskytly základní vodítka pro řízení vývoje.

V následujících letech PLT přidala do DrScheme výukové jazyky, algebraický krokový program, transparentní smyčku čtení – eval – tisk , tiskárnu založenou na konstruktoru a mnoho dalších inovací, které vytvořily vývojové prostředí pedagogického programu v aplikační kvalitě. Do roku 2001 základní tým (Felleisen, Findler, Flatt, Krishnamurthi) také napsal a vydal svou první učebnici Jak navrhovat programy , založenou na jejich filozofii výuky.

Manifest rakety podrobně popisuje principy, které řídí vývoj rakety, představuje rámec hodnocení za procesem návrhu a podrobně popisuje příležitosti pro budoucí vylepšení.

Historie verzí

První generace revizí schématu PLT představila funkce pro programování ve velkém s moduly i třídami . Verze 42 představila jednotky - prvotřídní modulový systém - jako doplněk tříd pro vývoj ve velkém měřítku. Systém tříd získal v těchto verzích funkce (např. Rozhraní stylu Java ) a také ztratil několik funkcí (např. Vícenásobné dědictví ). Jazyk se vyvinul v celé řadě po sobě jdoucích verzí a ve verzi 53 získal milníkovou popularitu, což vedlo k rozsáhlé práci a následující verzi 100, která by byla ekvivalentem vydání „1.0“ v současných populárních verzních systémech.

Další hlavní revize byla pojmenována Verze 200, která představila nový výchozí systém modulů, který spolupracuje s makry. Zejména modulový systém zajišťuje, aby byly výpočty za běhu a za kompilace odděleny, aby podporovaly „věž jazyků“. Na rozdíl od jednotek nejsou tyto moduly prvotřídními objekty .

Verze 300 představila podporu Unicode, podporu zahraničních knihoven a vylepšení systému tříd. Později řada 300 vylepšila výkon jazykového modulu runtime přidáním kompilátoru JIT a přepnutím na výchozí generační uvolňování paměti .

Od příštího významného vydání se projekt změnil na konvenčnější číslování verzí na základě sekvencí . Verze 4.0 zavedla #langzkratku k určení jazyka, ve kterém je modul zapsán. Dále revize zavedla neměnné páry a seznamy, podporu jemnozrnného paralelismu a dialekt staticky zadaného.

Dne 7. června 2010 bylo schéma PLT přejmenováno na Racket. Přejmenování se shodovalo s vydáním verze 5.0. Následně byl backend grafického uživatelského rozhraní (GUI) přepsán do Racket z C ++ ve verzi 5.1 pomocí nativních UI nástrojů na všech platformách. Verze 5.2 zahrnovala nástroj pro kontrolu syntaxe pozadí , novou knihovnu vykreslování, knihovnu databází a nový rozšířený REPL. Verze 5.3 obsahovala novou funkci submodulu pro volitelně načtené moduly, nové optimalizační nástroje, knihovnu JSON a další funkce. Verze 5.3.1 představila hlavní vylepšení DrRacket: ve výchozím nastavení byla zapnuta kontrola syntaxe pozadí a byl přidán nový nástroj pro náhled dokumentace.

Ve verzi 6.0 Racket vydal svůj systém pro správu balíků druhé generace. V rámci tohoto vývoje došlo k reorganizaci hlavního úložiště DrRacket a Racket, které bylo rozděleno na velkou sadu malých balíčků, což umožnilo instalovat minimální raketu a instalovat pouze tyto potřebné balíčky.

Verze 7 Racket byla vydána s novým expandérem maker napsaným v Racket jako součást příprav na podporu přechodu na runtime systém Chez Scheme a podporu více runtime systémů. Dne 19. listopadu 2019 byla vydána raketa 7.5. Licence rakety 7.5 byla méně omezující. Nyní používají buď licenci Apache 2.0, nebo licenci MIT.

Dne 2021 13. února byla vydána raketa 8.0. Racket 8.0 označuje první vydání, kde je výchozí implementací Racket CS. Racket CS je rychlejší, snadněji se udržuje a vyvíjí a je zpětně kompatibilní s existujícími programy Racket, má lepší paralelní sběr odpadků a obvykle poskytuje 10–30% zmenšení velikosti generovaného kódu.

Funkce

Základní jazyk rakety zahrnuje makra , moduly , lexikální uzávěry , koncová volání , oddělená pokračování , parametry (proměnné proměnné), softwarové smlouvy , zelená vlákna a vlákna OS a další. Jazyk také přichází s primitivy, jako jsou události a správci, kteří řídí správu zdrojů a umožňují jazyku chovat se jako operační systém pro načítání a správu dalších programů. Další rozšíření jazyka jsou vytvářena výkonným systémem maker, který spolu s modulovým systémem a vlastními analyzátory může ovládat všechny aspekty jazyka. Většina jazykových konstrukcí v raketě je implementována jako makra v základním jazyce. Patří mezi ně systém tříd mixin, systém komponent (nebo modulů) expresivní jako neprůhledné připisování v systému modulů ML a porovnávání vzorů .

Jazyk dále obsahuje první kontrakční systém pro programovací jazyk vyššího řádu . Kontraktační systém Racket je inspirován prací Design by Contract pro Eiffel a rozšiřuje jej tak, aby fungoval pro hodnoty vyššího řádu, jako jsou prvotřídní funkce , objekty, referenční buňky atd. Například objekt, který je kontrolován smlouvou, může být zajištěn, aby provedl kontrolu smlouvy, když jsou jeho metody nakonec vyvolány.

Raketa obsahuje jak bytecode, tak kompilátory JIT (JIT). Kompilátor bytecode vytváří interní formát bytecode spuštěný virtuálním strojem Racket a kompilátor JIT překládá bytecode do strojového kódu za běhu.

Od roku 2004 je tento jazyk dodáván také s PLaneT, správcem balíků, který je integrován do modulového systému, takže lze transparentně importovat a používat knihovny třetích stran . PLaneT má také integrovanou zásadu správy verzí, aby se zabránilo peklu závislostí .

Na konci roku 2014 byla velká část kódu Racket přesunuta do nového systému balení odděleně od hlavní kódové základny. Tento nový balicí systém obsluhuje klientský program s názvem raco . Nový systém balíků poskytuje méně funkcí než PLaneT; blogový příspěvek Jaye McCarthyho na blogu Racket vysvětluje důvody této změny a způsob duplikování staršího systému.

Integrovaná jazyková rozšiřitelnost a makra

Funkce, které nejjasněji odlišují Racket od jiných jazyků v rodině Lisp, jsou jeho integrované funkce rozšiřitelnosti jazyků, které podporují vytváření nových jazyků specifických pro doménu a pro obecné účely . Funkce rozšiřitelnosti rakety jsou zabudovány do modulového systému, aby umožňovaly kontextově citlivou a na úrovni modulu kontrolu nad syntaxí. Například #%appsyntaktický formulář lze přepsat, aby se změnila sémantika aplikace funkcí . Podobně #%module-beginformulář umožňuje libovolnou statickou analýzu celého modulu. Protože jakýkoli modul lze použít jako jazyk, prostřednictvím #langnotace to efektivně znamená, že lze programovat a ovládat prakticky jakýkoli aspekt jazyka.

Funkce rozšiřitelnosti úrovni modulu jsou spojeny s schématu like hygienické makro systému, který poskytuje více funkcí, než LISP je systém manipulace s expresí schématu 84 je hygienický rozšířit-syntaxe makra nebo R5RS je syntaxe pravidla . Je skutečně třeba říci, že systém maker je pečlivě vyladěným aplikačním programovacím rozhraním (API) pro rozšíření kompilátoru . Pomocí tohoto API kompilátoru mohou programátoři přidávat funkce a celé jazyky specifické pro doménu způsobem, který je činí zcela nerozeznatelnými od integrovaných jazykových konstrukcí.

Systém maker v raketě byl použit ke konstrukci celých jazykových dialektů . To zahrnuje Typed Racket, což je postupně psaný dialekt Racket, který usnadňuje migraci z netypového na typovaný kód, Lazy Racket - dialekt s líným hodnocením a Hackett, který kombinuje Haskell a Racket. Pedagogický programovací jazyk Pyret byl původně implementován v Racket.

Mezi další dialekty patří FrTime ( funkční reaktivní programování ), Scribble (jazyk dokumentace), Slideshow ( jazyk prezentace ) a několik jazyků pro vzdělávání.

Základní distribuce rakety poskytuje knihovny na podporu vývoje programovacích jazyků. Tyto jazyky nejsou omezeny na syntaxi založenou na výrazu s . Kromě konvenčních rozšíření syntaxe založených na čitelnosti směrnice #langumožňuje vyvolání libovolných analyzátorů, které lze implementovat pomocí knihovny nástrojů analyzátoru. Příklad takového jazyka najdete v logickém programování rakety .

Programovací prostředí

Jazyková platforma poskytuje IDE s vlastním hostitelem s názvem DrRacket, webový server založený na pokračování , grafické uživatelské rozhraní a další nástroje. Jako životaschopný skriptovací nástroj s knihovnami, jako jsou běžné skriptovací jazyky , lze použít ke skriptování prostředí Unix. Může analyzovat argumenty příkazového řádku a spouštět externí nástroje.

DrRacket IDE

DrRacket (dříve DrScheme) je široce používán mezi úvodními kurzy informatiky, které učí Scheme nebo Racket, a je chválen svou jednoduchostí a přitažlivostí pro začínající programátory. IDE bylo původně vytvořeno pro použití s ​​TeachScheme! Projekt (nyní ProgramByDesign ), terénní snaha Northeastern University a řady přidružených univerzit o přilákání studentů středních škol k kurzům informatiky na vysokoškolské úrovni.

Editor poskytuje zvýraznění pro chyby syntaxe a běhu, shodu závorek, debugger a algebraický krok. Mezi jeho funkce vhodné pro studenty patří podpora více „jazykových úrovní“ (Beginning Student, Intermediate Student a tak dále). Má také integrovanou podporu knihoven a sofistikované analytické nástroje pro pokročilé programátory. Dále programování modulu orientovaná je podporován modulu prohlížeče, cílem kontury, integrované testování a pokrytí měření a refaktoringu podporu. Poskytuje integrovaný, kontextově citlivý přístup k rozsáhlému hypertextovému systému nápovědy s názvem „Help Desk“.

DrRacket je k dispozici pro Windows , macOS , Unix a Linux s X Window System a programy se chovají podobně na všech těchto platformách.

Příklady kódu

Zde je triviální program Hello World :

#lang racket
"Hello, World!"

Spuštění tohoto programu vytvoří výstup:

"Ahoj světe!"

Zde je o něco méně triviální program:

Výsledek tohoto programu, jak ukazuje DrRacket
#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))))))

Tento program převzatý z webových stránek Racket kreslí Sierpinského trojúhelník vnořený do hloubky 8.

Pomocí #langsměrnice lze zdrojový soubor zapsat v různých dialektech rakety. Zde je příklad faktoriálního programu v Typed Racket, staticky napsaném dialektu Racket:

#lang typed/racket

(: fact (Integer -> Integer))
(define (fact n)
  (if (zero? n) 1 (* n (fact (- n 1)))))

Aplikace a praktické využití

Kromě základů v teorii programovacího jazyka byl Racket navržen jako univerzální jazyk pro produkční systémy. Distribuce Racket tedy obsahuje rozsáhlou knihovnu, která pokrývá systémové a síťové programování, vývoj webových aplikací, jednotné rozhraní se základním operačním systémem, dynamické rozhraní cizích funkcí , několik příchutí regulárních výrazů , generátory lexer / parser, logické programování a kompletní GUI rámec.

Racket má několik funkcí užitečných pro komerční jazyk, mezi nimi schopnost kompilovat samostatné spustitelné soubory pod Windows, macOS a Unix, profiler a debugger obsažený v integrovaném vývojovém prostředí (IDE) a rámec testování jednotek .

Raketa se používá pro komerční projekty a webové aplikace. Pozoruhodným příkladem je web Hacker News , který běží na Arc , který je vyvinut v Racket. Naughty Dog jej použil jako skriptovací jazyk v několika svých videohrách.

Racket se používá k výuce studentů algebry prostřednictvím herního designu v programu Bootstrap .

Reference

Další čtení

externí odkazy