Raquette (langage de programmation) - Racket (programming language)

Raquette
Raquette-logo.svg
Drracket.png
DrRacket sur Ubuntu
Paradigme Multi-paradigme : fonctionnel , impératif , logique , méta , modulaire , orienté objet , réflexif
Famille Zézayer
Conçu par PLT inc.
Développeur PLT inc.
Première apparition 1995 ; il y a 26 ans ( 1995 )
Version stable
8.1  Modifiez ceci sur Wikidata / 4 mai 2021 ; il y a 46 jours ( 4 mai 2021 )
Discipline de frappe Dynamique , statique , fort
Plate-forme x86 , PowerPC , SPARC , MIPS , ARM
Système d'exploitation Multiplateforme
Licence MIT ou Apache 2.0
Extensions de nom de fichier .rkt
Site Internet racket-lang .org
Dialectes
FrTime, Raquette Lazy, Scribble, Raquette typée
Influencé par
Eiffel , Schéma
Influencé
Clojure , Rouille , Schéma

Racket est un usage général , langage de programmation multi-paradigme basé sur le schéma dialecte de Lisp . Il est conçu comme une plate-forme pour la conception et la mise en œuvre de langages de programmation . En plus du langage de base Racket, Racket est également utilisé pour désigner la famille de langages de programmation et l'ensemble d'outils prenant en charge le développement sur et avec Racket. Racket est également utilisé pour les scripts , l' enseignement de l' informatique et la recherche.

La plate-forme Racket fournit une implémentation du langage Racket (y compris un système d'exécution , des bibliothèques et un compilateur JIT ) ainsi que l' environnement de développement intégré (IDE) DrRacket écrit en Racket. Racket est utilisé par le programme de sensibilisation ProgramByDesign , qui vise à faire de l' informatique « un élément indispensable du programme d'études en arts libéraux ».

Le langage de base de Racket est connu pour son vaste système de macros qui permet de créer des langages intégrés et spécifiques à un domaine , des constructions de langage telles que des classes ou des modules , et des dialectes distincts de Racket avec une sémantique différente .

La plate-forme de distribution est un logiciel libre et open source distribué sous les licences Apache 2.0 et MIT . Les extensions et packages écrits par la communauté peuvent être téléchargés dans le catalogue de packages de Racket .

Histoire

Développement

Matthias Felleisen a fondé PLT Inc. au milieu des années 1990, d'abord en tant que groupe de recherche, peu après en tant que projet dédié à la production de matériel pédagogique pour les programmeurs débutants (conférences, exercices/projets, logiciels). En janvier 1995, le groupe a décidé de développer un environnement de programmation pédagogique basé sur Scheme . Matthew Flatt a bricolé MrEd, la machine virtuelle originale pour Racket, à partir de libscheme, wxWidgets et quelques autres systèmes gratuits. Dans les années qui ont suivi, une équipe comprenant Flatt, Robby Findler , Shriram Krishnamurthi , Cormac Flanagan et bien d'autres ont produit DrScheme, un environnement de programmation pour les programmeurs novices de Scheme et un environnement de recherche pour la dactylographie douce . Le principal langage de développement pris en charge par DrScheme s'appelait PLT Scheme.

En parallèle, l'équipe a commencé à animer des ateliers pour les enseignants du secondaire, les formant à la conception de programmes et à la programmation fonctionnelle. Des tests sur le terrain avec ces enseignants et leurs élèves ont fourni des indices essentiels pour orienter le développement.

Au cours des années suivantes, PLT a ajouté des langages d'enseignement, un stepper algébrique, une boucle transparente de lecture-évaluation-impression , une imprimante basée sur un constructeur et de nombreuses autres innovations à DrScheme, produisant un environnement de développement de programmes pédagogiques de qualité applicative. En 2001, l'équipe principale (Felleisen, Findler, Flatt, Krishnamurthi) avait également écrit et publié son premier manuel, Comment concevoir des programmes , basé sur leur philosophie d'enseignement.

Le Manifeste de Racket détaille les principes qui guident le développement de Racket, présente le cadre d'évaluation derrière le processus de conception et détaille les opportunités d'améliorations futures.

Historique des versions

La première génération de révisions du schéma PLT a introduit des fonctionnalités pour la programmation à grande échelle avec à la fois des modules et des classes . La version 42 a introduit des unités - un système de modules de première classe - pour compléter les cours pour le développement à grande échelle. Le système de classes a gagné des fonctionnalités (par exemple les interfaces de style Java ) et a également perdu plusieurs fonctionnalités (par exemple l' héritage multiple ) dans ces versions. Le langage a évolué à travers un certain nombre de versions successives et a gagné en popularité dans la version 53, ce qui a conduit à un travail approfondi et à la version 100 suivante, qui équivaudrait à une version "1.0" dans les systèmes de versions populaires actuels.

La prochaine révision majeure a été nommée Version 200, qui a introduit un nouveau système de modules par défaut qui coopère avec les macros. En particulier, le système de modules garantit que les calculs à l' exécution et à la compilation sont séparés pour prendre en charge une "tour de langages". Contrairement aux unités, ces modules ne sont pas des objets de première classe .

La version 300 a introduit la prise en charge d' Unicode, la prise en charge des bibliothèques étrangères et des améliorations du système de classes. Plus tard, la série 300 a amélioré les performances du langage d'exécution avec l'ajout d'un compilateur JIT et un passage à un ramasse-miettes générationnel par défaut .

Lors de la prochaine version majeure, le projet était passé à une numérotation de version plus conventionnelle basée sur la séquence . La version 4.0 a introduit le #langraccourci pour spécifier la langue dans laquelle un module est écrit. De plus, la révision a introduit des paires et des listes immuables , la prise en charge du parallélisme à grain fin et un dialecte à typage statique .

Le 7 juin 2010, PLT Scheme a été renommé Racket. Le changement de nom a coïncidé avec la sortie de la version 5.0. Par la suite, le backend de l' interface utilisateur graphique (GUI) a été réécrit dans Racket à partir de C++ dans la version 5.1 à l'aide de kits d' outils d'interface utilisateur natifs sur toutes les plateformes. La version 5.2 comprenait un outil de vérification de syntaxe en arrière-plan , une nouvelle bibliothèque de traçage, une bibliothèque de base de données et un nouveau REPL étendu. La version 5.3 incluait une nouvelle fonctionnalité de sous-module pour les modules chargés en option, de nouveaux outils d' optimisation , une bibliothèque JSON et d'autres fonctionnalités. La version 5.3.1 a apporté des améliorations majeures à DrRacket : le vérificateur de syntaxe en arrière-plan a été activé par défaut et un nouvel outil de prévisualisation de la documentation a été ajouté.

Dans la version 6.0, Racket a publié son système de gestion de paquets de deuxième génération. Dans le cadre de ce développement, le référentiel principal DrRacket et Racket a été réorganisé et divisé en un grand ensemble de petits packages, permettant d'installer une raquette minimale et d'installer uniquement les packages nécessaires.

La version 7 de Racket a été publiée avec une nouvelle extension de macro écrite dans Racket dans le cadre des préparatifs pour la prise en charge du passage au système d' exécution Chez Scheme et de la prise en charge de plusieurs systèmes d'exécution. Le 19 novembre 2019, Racket 7.5 est sorti. La licence de Racket 7.5 était moins restrictive. Ils utilisent désormais soit la licence Apache 2.0, soit la licence MIT.

Le 13 février 2021, Racket 8.0 est sorti. Racket 8.0 marque la première version où Racket CS est l'implémentation par défaut. Racket CS est plus rapide, plus facile à maintenir et à développer, et est rétrocompatible avec les programmes Racket existants, a une meilleure récupération de place en parallèle et permet généralement une réduction de 10 à 30 % de la taille du code généré.

Caractéristiques

Le langage de base de Racket comprend des macros , des modules , des fermetures lexicales , des appels de queue , des continuations délimitées , des paramètres (variables fluides), des contrats logiciels , des threads verts et des threads de système d'exploitation , et plus encore. Le langage est également livré avec des primitives, telles que des espaces d'événements et des dépositaires, qui contrôlent la gestion des ressources et permettent au langage d'agir comme un système d'exploitation pour charger et gérer d'autres programmes. D'autres extensions du langage sont créées avec le puissant système de macros, qui, avec le système de modules et les analyseurs personnalisés, peut contrôler tous les aspects d'un langage. La plupart des constructions de langage dans Racket sont implémentées sous forme de macros dans le langage de base. Ceux-ci incluent un système de classe mixin , un système de composant (ou module) aussi expressif qu'une attribution opaque dans le système de module ML et une correspondance de modèle .

De plus, le langage présente le premier système de contrat pour un langage de programmation d'ordre supérieur . Le système de contrat de Racket s'inspire du travail de conception par contrat pour Eiffel et l'étend pour fonctionner pour des valeurs d'ordre supérieur telles que des fonctions de première classe , des objets, des cellules de référence , etc. Par exemple, un objet contrôlé par un contrat peut être assuré d'effectuer des contrôles de contrat lorsque ses méthodes sont finalement appelées.

Racket inclut à la fois des compilateurs bytecode et JIT (JIT). Le compilateur de bytecode produit un format de bytecode interne exécuté par la machine virtuelle Racket , et le compilateur JIT traduit le bytecode en code machine lors de l'exécution.

Depuis 2004, le langage est également livré avec PLANeT, un gestionnaire de packages intégré au système de modules afin que les bibliothèques tierces puissent être importées et utilisées de manière transparente. De plus, PLANeT a une politique de versioning intégrée pour empêcher l' enfer des dépendances .

À la fin de 2014, une grande partie du code de Racket a été déplacée dans un nouveau système d'emballage séparé de la base de code principale. Ce nouveau système d'emballage est desservi par un programme client nommé raco . Le nouveau système de packages offre moins de fonctionnalités que PLANeT ; un article de blog de Jay McCarthy sur le blog Racket explique la justification du changement et comment dupliquer l'ancien système.

Extensibilité du langage intégré et macros

Les fonctionnalités qui distinguent le plus clairement Racket des autres langages de la famille Lisp sont ses fonctionnalités d' extensibilité linguistique intégrées qui prennent en charge la création de nouveaux langages spécifiques à un domaine et à usage général . Les fonctionnalités d'extensibilité de Racket sont intégrées au système de modules pour permettre un contrôle contextuel et au niveau du module sur la syntaxe. Par exemple, la #%appforme syntaxique peut être remplacée pour modifier la sémantique de la fonction application . De même, le #%module-beginformulaire permet une analyse statique arbitraire de l'ensemble du module. Étant donné que n'importe quel module peut être utilisé comme langage, via la #langnotation, cela signifie effectivement que pratiquement n'importe quel aspect du langage peut être programmé et contrôlé.

Les fonctionnalités d'extensibilité au niveau du module sont combinées à un système de macro hygiénique de type Scheme , qui fournit plus de fonctionnalités que le système de manipulation d'expression s de Lisp, les macros hygiéniques d' extension de syntaxe de Scheme 84 ou les règles de syntaxe de R5RS . En effet, il est juste de dire que le système de macros est une interface de programmation d'applications (API) soigneusement réglée pour les extensions de compilateur . À l'aide de cette API de compilateur, les programmeurs peuvent ajouter des fonctionnalités et des langages spécifiques à un domaine entier d' une manière qui les rend totalement impossibles à distinguer des constructions de langage intégrées.

Le système de macro de Racket a été utilisé pour construire des dialectes entiers . Cela inclut Typed Racket, qui est un dialecte progressivement typé de Racket qui facilite la migration du code non typé vers le code typé, Lazy Racket, un dialecte avec évaluation paresseuse , et Hackett, qui combine Haskell et Racket. Le langage de programmation pédagogique Pyret a été initialement implémenté dans Racket.

Les autres dialectes incluent FrTime ( programmation réactive fonctionnelle ), Scribble (langage de documentation), Slideshow ( langage de présentation ) et plusieurs langues pour l'éducation.

La distribution principale de Racket fournit des bibliothèques pour aider au développement de langages de programmation. De tels langages ne sont pas limités à la syntaxe basée sur l' expression s . En plus des extensions de syntaxe conventionnelles basées sur des tables de lecture, la directive #langpermet l'invocation d'analyseurs arbitraires, qui peuvent être implémentés à l'aide de la bibliothèque d'outils d'analyse. Voir Programmation de logique de raquette pour un exemple d'un tel langage.

Environnement de programmation

La plate-forme linguistique fournit un IDE auto-hébergé nommé DrRacket, un serveur Web basé sur la continuation , une interface utilisateur graphique et d'autres outils. En tant qu'outil de script viable avec des bibliothèques telles que les langages de script courants , il peut être utilisé pour scripter le shell Unix. Il peut analyser les arguments de ligne de commande et exécuter des outils externes.

IDE DrRacket

DrRacket (anciennement DrScheme) est largement utilisé parmi les cours d'introduction à l'informatique qui enseignent Scheme ou Racket et est loué pour sa simplicité et son attrait pour les programmeurs débutants. L'IDE a été conçu à l'origine pour être utilisé avec TeachScheme ! (maintenant ProgramByDesign ), un effort de sensibilisation de l'Université Northeastern et d'un certain nombre d'universités affiliées pour attirer des étudiants du secondaire vers des cours d'informatique au niveau collégial.

L'éditeur fournit la mise en évidence des erreurs de syntaxe et d'exécution, la correspondance des parenthèses, un débogueur et un pas à pas algébrique. Ses fonctionnalités conviviales pour les étudiants incluent la prise en charge de plusieurs "niveaux de langue" (étudiant débutant, étudiant intermédiaire, etc.). Il dispose également d'un support de bibliothèque intégré et d' outils d' analyse sophistiqués pour les programmeurs avancés. De plus, la programmation orientée module est prise en charge avec le navigateur de module, une vue de contour, des tests intégrés et des mesures de couverture , et la prise en charge de la refactorisation . Il fournit un accès intégré et contextuel à un vaste système d'aide hyperlié nommé "Help Desk".

DrRacket est disponible pour Windows , macOS , Unix et Linux avec le système X Window et les programmes se comportent de la même manière sur toutes ces plates-formes.

Exemples de codes

Voici un programme trivial hello world :

#lang racket
"Hello, World!"

L'exécution de ce programme produit la sortie :

"Bonjour le monde!"

Voici un programme un peu moins trivial :

Le résultat de ce programme, comme montré dans 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))))))

Ce programme, tiré du site Racket, dessine un triangle de Sierpinski , imbriqué à la profondeur 8.

En utilisant la #langdirective, un fichier source peut être écrit dans différents dialectes de Racket. Voici un exemple du programme factoriel dans Typed Racket, un dialecte statiquement typé de Racket :

#lang typed/racket

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

Applications et utilisation pratique

En plus d'avoir une base dans la théorie des langages de programmation , Racket a été conçu comme un langage à usage général pour les systèmes de production. Ainsi, la distribution Racket propose une bibliothèque complète qui couvre la programmation système et réseau, le développement Web, une interface uniforme avec le système d'exploitation sous-jacent, une interface de fonction étrangère dynamique , plusieurs types d' expressions régulières , des générateurs lexer/parser, une programmation logique et un cadre graphique complet .

Racket possède plusieurs fonctionnalités utiles pour un langage commercial, parmi lesquelles une capacité à compiler des exécutables autonomes sous Windows, macOS et Unix, un profileur et un débogueur inclus dans l' environnement de développement intégré (IDE) et un cadre de test unitaire .

Racket a été utilisé pour des projets commerciaux et des applications Web. Un exemple notable est le site Web Hacker News , qui fonctionne sur Arc , qui est développé en Racket. Naughty Dog l' a utilisé comme langage de script dans plusieurs de leurs jeux vidéo.

Racket est utilisé pour enseigner l'algèbre aux étudiants via la conception de jeux dans le programme Bootstrap .

Les références

Lectures complémentaires

Liens externes