112 votes

Quelles sont les différences réelles entre Scheme et Common Lisp? (Ou tout autre deux dialectes de Lisp)

Note : Je ne demande pas lequel apprendre, lequel est meilleur, ou quoi que ce soit de ce genre.

J'ai récupéré la version gratuite de SICP parce que j'ai eu envie de le lire (j'ai entendu de bonnes choses à ce sujet, et je suis intéressé par ce genre de côté de la programmation).

Je sais que Scheme est un dialecte de Lisp et je me demandais : quelle est la différence réelle entre Scheme et, disons, Common Lisp ?

Il semble y avoir beaucoup de choses à propos de "CL a une plus grande stdlib.. Scheme n'est pas bon pour la programmation réelle.." mais rien de concret disant "c'est parce que CL est ceci/a cela".

139voto

Matthias Benkard Points 11264

C'est un peu une question délicate, car les différences sont à la fois techniques et (plus important encore, à mon avis) culturelles. Une réponse ne peut jamais fournir qu'une vision imprécise et subjective. C'est ce que je vais fournir ici. Pour quelques détails techniques bruts, consultez le Wiki Scheme.

Scheme est un langage construit sur le principe de fournir un substrat de langage de base élégant, cohérent et bien pensé sur lequel des langages d'application pratiques et académiques peuvent être construits.

Vous trouverez rarement quelqu'un écrivant une application en pur Scheme R5RS (ou R6RS), et en raison de la norme minimaliste, la plupart du code n'est pas portable entre les implémentations de Scheme. Cela signifie que vous devrez choisir soigneusement votre implémentation de Scheme, si vous souhaitez écrire un type d'application pour l'utilisateur final, car le choix déterminera en grande partie les bibliothèques disponibles. En revanche, la liberté relative dans la conception du langage d'application réel signifie que les implémentations de Scheme fournissent souvent des fonctionnalités inédites ailleurs; PLT Racket, par exemple, vous permet d'utiliser le typage statique et fournit un IDE très conscient du langage.

L'interopérabilité au-delà du langage de base est assurée par le processus SRFI communautaire, mais la disponibilité de tout SRFI donné varie selon l'implémentation.

La plupart des dialectes et bibliothèques Scheme se concentrent sur des idiomes de programmation fonctionnelle comme la récursion au lieu de l'itération. Il existe divers systèmes d'objets que vous pouvez charger sous forme de bibliothèques lorsque vous souhaitez faire de la POO, mais l'intégration avec du code existant dépend fortement du dialecte de Scheme et de sa culture environnante (par exemple, Chicken Scheme semble être plus orienté objet que Racket).

La programmation interactive est un autre point sur lequel les sous-communautés de Scheme diffèrent. MIT Scheme est connu pour son fort support en termes d'interactivité, tandis que PLT Racket est beaucoup plus statique. Dans tous les cas, la programmation interactive ne semble pas être une préoccupation centrale pour la plupart des sous-communautés de Scheme, et je n'ai encore jamais vu un environnement de programmation aussi interactif que celui de la plupart des Lisp communs.

Common Lisp est un langage éprouvé sur le terrain conçu pour la programmation pratique. Il est plein de verrues laides et de correctifs de compatibilité - tout le contraire du minimalisme élégant de Scheme. Mais il est aussi beaucoup plus riche en fonctionnalités pris pour lui-même.

Common Lisp a engendré un écosystème relativement important de bibliothèques portables. Vous pouvez généralement changer d'implémentation à tout moment, même après le déploiement de l'application, sans trop de problèmes. Globalement, Common Lisp est beaucoup plus uniforme que Scheme, et les expérimentations linguistiques plus radicales, si elles sont faites, sont généralement intégrées en tant que bibliothèque portable plutôt que de définir un tout nouveau dialecte. En raison de cela, les extensions de langage ont tendance à être plus conservatrices, mais aussi plus combinables (et souvent optionnelles).

Les extensions de langage universellement utiles comme les interfaces de fonctions étrangères ne sont pas développées de manière formelle mais reposent sur des bibliothèques quasi-standard disponibles sur toutes les principales implémentations de Common Lisp.

Les idiomes de langage sont un mélange sauvage d'approches fonctionnelles, impératives et orientées objets, et en général, Common Lisp semble plus être un langage impératif qu'un fonctionnel. Il est également extrêmement dynamique, sans doute plus que la plupart des langages de script dynamiques populaires (la redéfinition de classe s'applique aux instances existantes, par exemple, et le système de gestion des conditions intègre directement l'interactivité), et la programmation interactive et exploratoire est une partie importante de "la voie de Common Lisp". Cela se reflète également dans les environnements de programmation disponibles pour Common Lisp, pratiquement tous offrant une sorte d'interaction directe avec le compilateur Lisp en cours d'exécution.

Common Lisp dispose d'un système d'objet intégré (CLOS), d'un système de gestion des conditions nettement plus puissant que la simple gestion des exceptions, de la patchabilité en temps d'exécution, et de divers types de structures de données et d'utilitaires intégrés (y compris le tristement célèbre LOOP macro, un mécanisme d'itération beaucoup trop laid pour Scheme mais beaucoup trop utile pour ne pas en parler, ainsi qu'un mécanisme de formatage semblable à printf avec un support GOTO dans les chaînes de format).

En raison du développement interactif basé sur l'image et de la plus grande complexité du langage, les implémentations de Lisp sont généralement moins portables entre les systèmes d'exploitation que les implémentations de Scheme. Faire tourner un Common Lisp sur un appareil embarqué n'est pas pour les âmes sensibles, par exemple. De même que la machine virtuelle Java, vous avez tendance à rencontrer des problèmes sur des machines où la mémoire virtuelle est limitée (comme les serveurs virtuels basés sur OpenVZ). Les implémentations de Scheme, en revanche, ont tendance à être plus compactes et portables. La qualité croissante de l'implémentation ECL a en partie atténué ce point, bien que son essence reste vraie.

Si vous recherchez un support commercial, il existe quelques entreprises qui proposent leurs propres implémentations de Common Lisp, y compris des constructeurs d'interfaces graphiques GUI, des systèmes de bases de données spécialisés, etc.

En résumé, Scheme est un langage plus élégamment conçu. C'est principalement un langage fonctionnel avec quelques fonctionnalités dynamiques. Ses implémentations représentent divers dialectes incompatibles avec des caractéristiques distinctives. Les dialectes de Scheme ont tendance à être plus statiques et moins interactifs que Common Lisp; les implémentations de Common Lisp sont généralement plus lourdes et plus complexes à installer.

Peu importe le langage que vous choisissez, je vous souhaite beaucoup de plaisir! :)

32voto

newacct Points 42530

Quelques différences pratiques de base :

  • Common Lisp a des portées séparées pour les variables et les fonctions ; alors que dans Scheme il n'y a qu'une seule portée -- les fonctions sont des valeurs et définir une fonction avec un certain nom revient simplement à définir une variable définie par le lambda. En conséquence, dans Scheme, vous pouvez utiliser un nom de fonction comme une variable et la stocker ou la passer à d'autres fonctions, puis effectuer un appel avec cette variable comme si c'était une fonction. Mais en Common Lisp, vous devez explicitement convertir une fonction en une valeur en utilisant (function ...), et appeler explicitement une fonction stockée dans une valeur en utilisant (funcall ...)
  • En Common Lisp, nil (la liste vide) est considéré comme faux (par exemple dans if), et c'est la seule valeur fausse. Dans Scheme, la liste vide est considérée comme vraie, et #f (le distinct) est la seule valeur fausse

13voto

John Clements Points 7195

C'est une question difficile à répondre de manière impartiale, surtout parce que beaucoup de personnes de LISP classeraient Scheme comme un LISP.

Josh Bloch (et cette analogie n'est peut-être pas de son invention) décrit le choix d'un langage comme étant semblable au choix d'un pub local. Dans cette optique, alors :

Le pub "Scheme" a beaucoup de chercheurs en langages de programmation en lui. Ces personnes accordent beaucoup d'attention au sens du langage, à le maintenir bien défini et simple, et à discuter de nouvelles fonctionnalités innovantes. Chacun a sa propre version du langage, conçue pour leur permettre d'explorer leur propre coin particulier des langages de programmation. Les personnes de Scheme aiment vraiment la syntaxe parenthésée qu'ils ont prise de LISP ; c'est flexible et léger et uniforme et élimine de nombreux obstacles à l'extension du langage.

Le pub "LISP" ? Eh bien... je ne devrais pas commenter ; je n'ai pas passé assez de temps là-bas :).

2voto

Moe Points 390

Schéma :

  • à l'origine, très peu de spécifications (le nouveau R7RS semble être plus lourd)
  • grâce à la syntaxe facile, scheme peut être appris rapidement
  • les implémentations fournissent des fonctions supplémentaires, mais les noms peuvent varier selon les implémentations

Common Lisp :

  • de nombreuses fonctions sont définies par la spécification plus grande
  • espace de noms différent pour les fonctions et les variables (lisp-2)

ce ne sont que quelques points, il y en a sûrement beaucoup plus, que je ne me souviens pas en ce moment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X