AccueilđŸ‡«đŸ‡·Chercher

Scheme

Scheme (prononciation : /skim/) est un langage de programmation dérivé du langage fonctionnel Lisp, créé dans les années 1970 au Massachusetts Institute of Technology (MIT) par Gerald Jay Sussman et Guy L. Steele.

Scheme
Logo.

Date de premiĂšre version
Paradigme Fonctionnel
Auteurs Guy L. Steele et Gerald Jay Sussman
DerniĂšre version R7RS ()
Typage fort, dynamique
Normes IEEE 1178-1990, ANSI, RnRS
Influencé par Lisp
A influencé JavaScript, Ruby, Hop, Snap!
Implémentations Bigloo, Gambit, PLT Scheme

Site web www.scheme-reports.org
Extension de fichier scm et ss

Le but des crĂ©ateurs du langage Ă©tait d'Ă©purer le Lisp en conservant les aspects essentiels, la flexibilitĂ© et la puissance expressive. Scheme a donc une syntaxe extrĂȘmement simple, avec un nombre trĂšs limitĂ© de mots-clĂ©s. Comme en Lisp, la notation prĂ©fixĂ©e permet de s'affranchir d'une prĂ©cĂ©dence des opĂ©rateurs. De plus, la puissance des macros de Scheme lui permet de s'adapter Ă  n'importe quel problĂšme, notamment de le rendre orientĂ© objet et donc multi-paradigme.

La spécification de Scheme[1] précise que toutes les implémentations doivent optimiser le cas de la récursion terminale.

Les types de donnĂ©es de base de Scheme sont les boolĂ©ens, les nombres, qui peuvent ĂȘtre entiers de taille indĂ©finie, rationnels ou complexes, les caractĂšres ou les symboles, qui sont des variables.

À ceux-lĂ  s'ajoutent des types de donnĂ©es composites suivants : chaĂźnes de caractĂšres, vecteurs, paires orientĂ©es, listes, listes associatives, tables de hachage et un type particulier gĂ©nĂ©rique, la S-expression, dont tous les autres types dĂ©rivent, rendant possible la mĂ©taprogrammation, c'est-Ă -dire la possibilitĂ© d'Ă©tendre le langage avec de nouveaux opĂ©rateurs spĂ©ciaux.

Histoire

Gérald Sussman et Guy Steele sont revenus sur la naissance de Scheme dans un article intitulé The First Report on Scheme Revisited[2] et publié en 1998.

En 1973, Carl Hewitt propose son modĂšle d'acteur et Ă©crit avec ses Ă©tudiants une implĂ©mentation en Lisp appelĂ©e Planner-73, puis PLASMA (acronyme de PLAnner-like System Modeled on Actors). Sussman et Steele voulant mieux comprendre le modĂšle d’Hewitt, notamment en le reliant aux notions traditionnelles de la programmation, Ă©crivent un petit interprĂšte Lisp et des primitives pour crĂ©er des acteurs et envoyer des messages entre eux. Ils utilisent la mĂȘme syntaxe pour les fonctions et les acteurs, les premiĂšres Ă©tant des fermetures dĂ©clarĂ©es par le mot clef lambda et retournant une valeur, et les seconds par alpha. Les acteurs ne retournant pas, mais appellent des continuations, qui sont les autres acteurs qu’il connait.

Le langage est nommĂ© « Schemer », suivant le nommage des langages Planner et Conniver, desquels il s’inspire. Cependant, le systĂšme ITS utilisĂ© Ă  l’époque limite les noms de fichiers Ă  6 caractĂšres, tronquant le nom Ă  « SCHEME ». Sussman et Steele disent ne plus se souvenir de pourquoi ils n’ont pas choisi d’abrĂ©ger en « SCHMR », comme Planner et Conniver qui utilisaient « PLNR » et « CNVR ».

Ils dĂ©couvrent, aprĂšs avoir Ă©crit des programmes avec des acteurs, que l’implĂ©mentation de l’interprĂšte Ă©tait identique, que le code Ă  Ă©valuer concerne des fonctions ou des acteurs, et qu’il en Ă©tait de mĂȘme pour le code qui crĂ©e les fonctions et acteurs. La diffĂ©rence entre le fait que seules les fonctions retournent des valeurs et pas les acteurs n’existait pas dans l’implĂ©mentation, mais seulement dans les primitives utilisĂ©es dans le corps des dĂ©finitions des fonctions et acteurs. Ils en dĂ©duisent que les acteurs et les fermetures sont en fait le mĂȘme concept, et Hewitt l’a lui-mĂȘme admis plus tard.

Ces dĂ©couvertes sur l’embryon qu’était alors Scheme ont menĂ© Ă  trois conclusions majeures. En premier lieu, le modĂšle d’acteur d’Hewitt se reprĂ©sentait parfaitement en λ-calcul. Ce n’était pas nouveau en soi pour les thĂ©oriciens de la sĂ©mantique dĂ©notationnelle, mais Scheme a permis d’apporter une dimension pratique Ă  ces thĂ©ories. Ensuite, il est apparu que le formalisme simple et petit du λ-calcul peut servir Ă  un noyau d’un langage de programmation expressif et puissant[note 1], Scheme est donc un λ-calcul appliquĂ©. Le corollaire est immĂ©diat : la sĂ©mantique dĂ©notationnelle est Ă©quivalente Ă  la sĂ©mantique opĂ©rationnelle. Enfin, la quĂȘte d’un langage ultime pour l’intelligence artificielle s’est rĂ©vĂ©lĂ©e tourner en rond, puisque les travaux sur les langages ont commencĂ© par Lisp, suivi de CONVERT, puis Planner, Conniver, PLASMA, lui-mĂȘme suivi par un dialecte simplifiĂ© de Lisp.

Aperçu de la syntaxe du langage

Les variables sont typées dynamiquement et leur portée est lexicale :

 (define var1 value)
  (let ([var2 value])
    ...)

Listes :

  (cons 1 (cons 2 (cons 3 (cons 4 '()))))

Cette concatĂ©nation peut ĂȘtre abrĂ©gĂ©e en

  (list 1 2 3 4)

ou en

  '(1 2 3 4)

Fonctions : elles sont définies comme des lambda-expressions

  (define fun
    (lambda (arg1 arg2)
       ...))

ou plus simplement

  (define (fun arg1 arg2)
    ...)

Application Ă  une liste :

  (apply fun (list value1 value2))

Évaluations conditionnelles :

  (cond (test1 expr1)
        (test2 expr2)
        ...
        (else exprn))

et aussi

  (if condition
        then-expr
        else-expr)

Exemple 1 - calcul d'une factorielle :

  (define (factorial n)
    (if (= n 0)
        1
        (* n (factorial (- n 1)))))
 (factorial 5)
 ;; ⇒ 120

Exemple 2 - définition d'une fonction map, qui applique une lambda-expression (qui élÚve son argument au carré) à tous les éléments d'une liste :

  (define (map f lst)
    (cond ((null? lst) lst)
          (else (cons (f (car lst))
                      (map f (cdr lst))))))
 (map (lambda (x) (* x x)) '(1 2 3 4))
 ;;  ⇒ (1 4 9 16)

Versions tail-récursives des deux exemples précédents :

  (define (factorial n)
    (let loop ((fact 1)
               (n n))
      (cond ((= n 0) fact)
            (else (loop (* n fact) (- n 1))))))
 (factorial 5)
 ;; ⇒ 120
  (define (map f lst)
    (do ((lst lst (cdr lst))
         (res '() (cons (f (car lst)) res)))
        ((null? lst) (reverse res))))
 (map (lambda (x) (* x x)) '(1 2 3 4))
 ;; ⇒ (1 4 9 16)

Mises en Ɠuvre

RnRS

Scheme est, avec Common Lisp, le dialecte de Lisp le plus populaire. Comme Lisp, il existe de multiples implĂ©mentations chacune ajoutant des fonctionnalitĂ©s en fonction des besoins de leurs utilisateurs. Un rapport fait rĂ©guliĂšrement le point sur les diffĂ©rentes implĂ©mentations, afin de dĂ©gager une dĂ©finition du langage consensuelle. Ces rapports sont nommĂ©s Revisedn Report on the Algorithmic Language Scheme[note 2], oĂč n est le numĂ©ro de la rĂ©vision, et abrĂ©gĂ©s en RnRS. Leur but est de pouvoir Ă©changer du code entre diffĂ©rentes implĂ©mentations conformes Ă  une rĂ©vision donnĂ©e du rapport.

La sixiĂšme rĂ©vision[1] a Ă©tĂ© publiĂ©e en et ratifiĂ©e par 102 personnes, soit 2/3 des votants[3]. Ce rapport est immĂ©diatement controversĂ©, une partie des auteurs des principales implĂ©mentations ont indiquĂ© qu’ils intĂ©greraient quelques nouveautĂ©s du R6RS, mais pas la totalitĂ© du rapport[4], Marc Feeley considĂšre que le but du R6RS ne pourra pas ĂȘtre atteint et qu’il faut travailler sur un nouveau standard.

En 2009, le Scheme Steering Committee a publiĂ© un communiquĂ©[3] dans lequel il rappelle la diversitĂ© des implĂ©mentations de Scheme, qui sont Ă  la fois sa faiblesse et sa force. Il annonce que la diversitĂ© actuelle justifie la distinction entre deux langages Scheme, l’un dit small, hĂ©ritant de IEEE Scheme et du R5RS, et un large, hĂ©ritant du R6RS, mais nĂ©anmoins compatibles entre eux. Le Steering Committee crĂ©e deux groupes de travail pour prĂ©parer la nouvelle rĂ©vision (R7RS) du langage.

La premiÚre partie du rapport, dit R7RS-small a été finalisée en [5].

Principales implémentations

  • MIT/GNU Scheme
  • Chez Scheme (en), un interprĂšte Scheme libre et compilateur commercial pour Microsoft Windows et plusieurs systĂšmes Unix
  • Chicken est un compilateur Scheme-vers-C.
  • Gambit est un compilateur Scheme-vers-C conforme Ă  R5RS.
  • Guile est le langage d'extension du projet GNU. L'interprĂšte Scheme est une bibliothĂšque qui peut servir comme langage de script pour des applications.
  • Racket, anciennement PLT-Scheme, une suite de programmes incluant un interprĂšte (racket), un outil de dĂ©veloppement graphique (MrEd), un Ă©diteur orientĂ© pĂ©dagogie (DrRacket), et divers composants incluant des bibliothĂšques Component object model (COM) et ODBC.
  • Kawa est une implĂ©mentation de Scheme en Java.
  • Scsh ou Scheme Shell est un produit R5RS utilisable comme langage de script systĂšme et interprĂšte de commandes.
  • Gauche est un produit R5RS multilingue sous licence BSD, pour programmeurs et administrateurs systĂšmes.
  • Bigloo (en) [6] est un compilateur Scheme-vers-C et Scheme-vers-Java qui produit des exĂ©cutables compacts et rapides, dotĂ© d'un nombre relativement important de bibliothĂšques.
  • STklos est une implĂ©mentation libre du langage Scheme de l'UniversitĂ© de Nice qui est lĂ©gĂšre et efficace.
  • Elk est une implĂ©mentation libre du langage.
  • Le logiciel de retouche d'images GIMP inclut un interprĂšte d'un langage dĂ©rivĂ© de Scheme, TinyScheme, pour Ă©crire sous forme de script (appelĂ© script-fu) certaines manipulations d'image.
  • D'autres produits se trouvent sur la schemers.org FAQ

Différences avec Lisp

Scheme reprend la syntaxe des S-expressions de Lisp en changeant quelques mots clefs. Une expression scheme est soit une valeur atomique (nombre, chaĂźne de caractĂšre, identificateur, etc.), soit une liste d’expressions. Les diffĂ©rences notables avec Lisp sont :

  • PortĂ©e lexicale Ă  travers des fermetures ;
  • Espace de noms unique pour fonctions et variables : Scheme utilise define lĂ  oĂč Lisp choisissait ou defvar ou defun ;

Common Lisp vs. Scheme

Notes et références

Notes

  1. Bien que Lisp ait utilisé la notation λ, mais sans savoir gérer les variables libres, le noyau théorique de Lisp reposait sur des équations récursives, et non le λ-calcul.
  2. Que l’on pourrait traduire par : « ne rĂ©vision du rapport sur le langage algorithmique Scheme ».

Références

  1. (en) Revised⁶ Report on the Algorithmic Language Scheme.
  2. (en) Gerald Jay Sussman et Guy L. Steele, Jr., « The First Report on Scheme Revisited », Higher-Order and Symbolic Computation, vol. 11, no 4,‎ , p. 399-404 (ISSN 1388-3690 et 1573-0557, lire en ligne).
  3. (en) Scheme Steering Committee Position Statement, 20 août 2009, consulté le 26 janvier 2013.
  4. (en) Marc Feeley, « Implementors' intentions concerning R6RS », sur lists.r6rs.org, (consultĂ© le ) : « It seems clear to me that few Scheme implementors have the intention to modify their implementation to support R6RS fully. Generally each implementor intends to pick and choose minor R6RS features that will be supported (but not the same set of features for all Scheme implementations). For this reason I believe that R6RS will fail to achieve its goal of allowing the sharing of code between different Scheme subcommunities. We need to start working on a standard that will. ».
  5. (en) Revised7 Report on the Algorithmic Language Scheme [PDF].
  6. Bigloo chez inria.fr

Voir aussi

Articles connexes

Liens externes

Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.