Aller au menu - Aller au contenu

Le langage de programmation Clojure est disponible en version 1.2 !

Revenir à la liste des news
Participer à la discussion

Image

Informations

Contributeur(s) : acieroid, colbseton et Graphox
Publié : le 24/08/2010 à 05:00:00
Catégorie : Programmation
Visualisations : 13 007

Licence : Creative Commons BY SA

Le langage de programmation Clojure est disponible en [...]

Clojure, un langage de programmation, est maintenant disponible en version 1.2. Ce langage a hérité des traits fonctionnels d'Haskell, d'Erlang ou tout simplement de Lisp, une famille contenant des langages de programmation dits fonctionnels.
À l'occasion de la sortie de cette nouvelle version, nous en profitons pour vous présenter ce langage que certains d'entre vous ne connaissent peut-être pas, plutôt que de s'attarder sur les nouveautés, qui pourraient vous paraître obscures.


Un langage fonctionnel


Contrairement à la programmation impérative, le paradigme fonctionnel supprime les changements d'états de ses programmes. Ainsi, la modification de la valeur d'une variable est par exemple interdite. De plus, les boucles n'existent pas car la variable ne changeant pas d'état, la condition serait toujours évaluée à « vrai » ou « faux ». Néanmoins, les boucles ne sont pas utiles dans les langages fonctionnels, étant donné que la récursion permet d'en reproduire le principe.

Certains langages fonctionnels permettent néanmoins les changements d'états : c'est le cas par exemple d'OCaml. Il est en effet possible de faire une boucle : for i=1 to 10 do[] , caml fait donc partie des langages fonctionnels impurs, il en existe évidemment d'autres. En revanche, des langages comme Haskell, n'autorise pas cet effet de bord : ce sont des langages fonctionnels purs.


Fonctions


Image utilisateur

Une fonction reçoit des paramètres et retourne une valeur, ses entrées pouvant être des nombres, des caractères, des chaînes de caractères et des fonctions. Ce dernier point caractérise le paradigme fonctionnel : des fonctions peuvent en effet prendre en argument des autres fonctions. Des langages comme le C le permettent aussi, mais cela est plus complexe à traiter puisqu'il faut alors passer par des pointeurs de fonctions. Une fonction qui manipule d'autres fonctions est appelée fonction d'ordre supérieur.

Pour mieux expliquer l'intérêt de ces fonctions, définissons une fonction sort2 qui prend en arguments une fonction ainsi que deux objets. Cette fonction retourne une liste contenant les deux objets triés selon la fonction passée en argument :

Code : Clojure
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
> (defn sort2 [fun a b]  
    (if (fun a b)  
      (list a b)  
      (list b a)))

> (sort2 > 5 4) ; l'élément le plus grand sera placé en premier
(5 4)

> (sort2 < 5 4) ; ici c'est l'élément le plus petit qui sera en premier
(4 5)

;; ici c'est la chaîne la plus courte qui sera placée en premier (.length
;; calcule la longueur d'une chaîne de caractère)
> (sort2 (fn [a b] (< (.length a) (.length b))) "zéro" "un") 
("un" "zéro")


Clojure, un puissant dialecte de Lisp

Image utilisateur

Clojure, créé en 2007 par Rich Hickey, est un dialecte de Lisp. Inspiré par les langages Haskell, Erlang et ML, ce langage de programmation fonctionnel se veut à la fois moderne, efficace et robuste pour la programmation multitâche, simplifiée par la programmation concurrente.

Clojure possède un typage dynamique des données et un puissant système de macros qui permet d'étendre les fonctionnalités du langage avec des codes utilisateur.

Voici comment on pourrait définir la macro « when », qui est une forme raccourcie de « if » :

Code : Clojure
1
2
3
(defmacro when
  [test & body] 
  (list 'if test (cons 'do body)))

Le code ci-dessus représente la définition de la macro when telle qu'elle l'est dans le langage. Elle prend en argument une condition test et un corps à exécuter body. Une macro retourne une liste, qui est en fait le code qui sera généré par la macro.

D'autre part, Clojure utilise des structures de données persistantes et des objets non-mutables (types de données ne pouvant être modifiées après leur création). De plus, son évaluation paresseuse lui offre une certaine optimisation étant donné que les séquences ne sont évaluées seulement si elles sont nécessaires par la suite.

Clojure dispose aussi d'une interface interactive (comme le langage Python) qui permet de saisir les commandes à la suite des autres, dans une console. Ce procédé se nomme REPL et se lance en tapant simplement clj dans la console. À noter qu'un site nommé tryclojure permet d'exécuter du code Clojure en ligne, sans installer de logiciel sur votre ordinateur.


Syntaxe


Clojure utilise l'Expression Symbolique (ou S-expression), une convention concernant la représentation des différentes données des langanges de la famille Lisp. Celle-ci inclut la notation préfixée (ou polonaise), qui est utilisée dans Clojure. Par exemple, le calcul ((7 + 3) * 2) / 4 s'écrit : (/ (* 2 (+ 7 3)) 4) .

Contrairement à la notation habituelle, les opérateurs arithmétiques de Clojure (et des langages Lisp en général) ont une arité quelconque, cela veut dire qu'ils peuvent recevoir autant de nombres que vous le voulez : (+ 1 2 3 4 5) , équivaut à 1 + 2 + 3 + 4 + 5.

Il serait inutile de décrire la syntaxe de tous les types de données de Clojure, voyez plutôt la documentation.
Néanmoins, voici quelques différences syntaxiques et sémantiques entre Clojure et les autres langages de la famille des Lisp.


Clojure et Java


Clojure est un langage qui compile du bytecode utilisable par la JVM, ce qui fait de lui un langage multiplate-forme. Outre le fait qu'il utilise la machine virtuelle de Java, Clojure est très « proche » de ce dernier. En effet, il offre un accès rapide aux frameworks Java comme Swing, une bibliothèque graphique, et il est très simple d'appeler un code Clojure au sein d'une application Java. Par exemple, voici une ligne de Clojure qui permet d'afficher « Bonjour les zéros ! » dans une GUI :

Code : Clojure
1
(javax.swing.JOptionPane/showMessageDialog nil "Bonjour les zéros !")

Pour un exemple plus complet d'utilisation de Swing avec Clojure, consultez cette page.


La programmation concurrente


Comme dit précédemment, Clojure a été inspiré par Erlang, un langage se basant sur la programmation concurrente. Ce type de programmation constitue un autre paradigme, différent de l'impératif ou du fonctionnel, qui permet d'exécuter différents morceaux du programme en parallèle, grâce à plusieurs fils d'exécution (threads). Pour y parvenir, le processeur passe la main à un thread, exécute un certain nombre d'instructions puis alterne avec un autre thread, et ainsi de suite. De nos jours, grâce aux processeurs dits « multi-cœurs » ou à la technologie Hyper-Threading d'Intel, l'exécution de ces différents threads peut se dérouler en même temps.

Observez donc ce code :

Code : Clojure
1
2
3
4
(def counter (ref 0)) ; définition d'une variable mutable counter avec la valeur 0
(defn next-counter []
  (dosync 
    (ref-set counter (+ 1 @counter))))

counter est une variable mutable : pour accéder à sa valeur on utilise le symbole @. Dans l'exemple ci-dessus, on incrémente la variable de 1. ref-set counter sert à affecter les modifications à la variable (en C par exemple : foo += 1; ).

Maintenant, imaginons qu'un processus A fasse appel à next-counter en même temps qu'un processus B. Le processus B est plus rapide que le A et appelle next-counter : counter va donc valoir 1. A lit @counter avant que B ne le modifie, A va faire son ref-set , ce qui va donc donner (+ 1 0) . Or, il y a un problème car counter ne vaut plus 0, mais 1. La concurrence règle donc ce type de problèmes, ici grâce à dosync qui va s'assurer qu'aucun thread ne touche à @counter pendant un temps.


Les nouveautés de Clojure 1.2


En plus de la soixantaine de bugs corrigés, comme à chaque nouvelle version, il y a eu des modifications sur l'implémentation du langage. On peut noter l'amélioration des performances de plusieurs fonctions, la refonte de certains modules (dont le module gérant les fractions), de nouvelles fonctionnalités (possibilité de lancer la documentation Java à partir de l'ERPL, de nouveaux namespaces, support des macros de primitifs de Java, sans boxing), etc.

Comme nous vous l'avons dit en introduction, nous n'avons pas l'intention de nous éterniser sur les nouveautés de cette nouvelle version de Clojure, qui ne vous intéresseraient sans doute pas si vous n'avez jamais entendu parler de Clojure.

Néanmoins, pour ceux qui Clojure intéresse, un lien regroupant toutes les modifications de la version 1.2 est disponible ci-dessous.


Liens et sources

71 Participations

Pour accéder à cette section
Connectez-vous !
connexion_rpx
Page Précédente  1  2  3 
Pseudo Discussion
3 visiteurs sur cette news (0 membre et 3 anonymes)
Page Précédente  1  2  3 
Hors ligne Graphox # Posté le 26/08/2010 à 09:18:52
Avatar
Groupe : Anciens

Pourquoi certaines personnes trouvent dommage qu'il y ait beaucoup de langages de programmation ?
Chaque langage est « unique » et convient à différents besoins. Personne ne vous oblige à en apprendre de nouveaux, tant que ceux que vous connaissez vous conviennent.

gg++ > Cette news a été relue et corrigée par acieroid, qui a fait pas mal de Clojure (il nous a d'ailleurs donné des codes d'exemple). De plus, quand nous (les newsers) écrivons des articles, nous nous méfions des erreurs de traduction.
 
Hors ligne gg++ # Posté le 26/08/2010 à 09:38:56
Ca gère la fougère
Avatar

Re,

Citation : Einstein++
1- ça n'a rien à voir avec prolog, la syntaxe et le "fonctionnement" des deux langages sont très différents.


Oui je me suis trompé Prolog c'est un langage déclaratif ! :D

Citation : Einstein++
2- la news sur Ruby était correcte mais peu précise, et celle-ci est parfaite :)

Sa va les chevilles enflent pas trop! :-°

Citation : Einstein++
3- un petit cadeau pour toi (réponse à ta 1ère phrase :-° )


Merci pour le cadeau j'apprécie le geste :p


Citation : Graphox
Pourquoi certaines personnes trouvent dommage qu'il y ait beaucoup de langages de programmation ?
Chaque langage est « unique » et convient à différents besoins. Personne ne vous oblige à en apprendre de nouveaux, tant que ceux que vous connaissez vous conviennent.


A mon humble avis je pense que trop de language ne sert pas à grand chose ! J'ai l'impression que c'est pour que son auteur est son nom dans le lanagage cela reste mon avis :colere2:

Citation : Graphox
gg++ > Cette news a été relue et corrigée par acieroid, qui a fait pas mal de Clojure (il nous a d'ailleurs donné des codes d'exemple). De plus, quand nous (les newsers) écrivons des articles, nous nous méfions des erreurs de traduction.


Je ne doute pas un instant de votre bonne fois mais il faut faire attention avant d'en écrire news parce qu'après si l'on souhaite apprendre un nouveau langage les première briques seront fausse



C'est bon j'ai finis de répondre à toutes ces réactions

:-°

Image utilisateur
 
Hors ligne Graphox # Posté le 26/08/2010 à 09:43:49
Avatar
Groupe : Anciens

« Je ne doute pas un instant de votre bonne fois mais il faut faire attention avant d'en écrire news parce qu'après si l'on souhaite apprendre un nouveau langage les première briques seront fausse. »

Si quelqu'un souhaite apprendre le Clojure, ce n'est pas cette news qui va lui permettre de le faire. Il y a des tutoriels sur Internet, autant s'en servir. Cet article a pour but de vous faire découvrir ce qu'est la programmation fonctionnelle avec un exemple : Clojure, rien de plus.
Tu as le droit d'être méfiant quant au contenu de la news, mais dans ce cas, documente-toi par toi-même (il y a les principaux liens en fin de news).
 
Hors ligne gg++ # Posté le 26/08/2010 à 09:51:52
Ca gère la fougère
Avatar

Citation : Graphox
Si quelqu'un souhaite apprendre le Clojure, ce n'est pas cette news qui va lui permettre de le faire. Il y a des tutoriels sur Internet, autant s'en servir. Cet article a pour but de vous faire découvrir ce qu'est la programmation fonctionnelle avec un exemple : Clojure, rien de plus.


Je parlais pour Rubis...:-°

Après comme tu a s l'air tatillon :D
j'aurais peu être mis la syntaxe avant les fonctions mais bon c'est que mon avis

:-°

Image utilisateur
 
Hors ligne Karl Yeurl # Posté le 26/08/2010 à 11:36:51
Orange et gris.
Avatar
Flux RSS

Ville : Flémalle
Pays : Belgique
Études : FSA ULG

Citation : gg++
Je parlais pour Rubis...:-°

AFAIK, il n’existe pas de langage de programmation nommé Rubis.
Si tu savais un tant soit peu coder en Ruby, tu ne ferais pas la faute. Il paraît que les rubyists sont des gens fiers de leur langage de programmation.

Tu joues donc au chat échaudé qui n’a fait que lire les commentaires d’Eregon, mais en fait tu n’y connais rien.
Tu ne sais pas quelles sont les lacunes de la news sur Ruby, si ce n’est ce qu’Eregon en a dit.

Bref, arrête de faire ton troll comme ça. Ou continue, mais emploie des arguments convaincants. Merci.


« Défendre le c cédille majuscule n’est-il pas vain ? Ca m’isole, comme disent les fous. »
Stéphane ARLEN
 
Hors ligne gg++ # Posté le 26/08/2010 à 13:41:33
Ca gère la fougère
Avatar

Citation : Karl Yeurl
AFAIK, il n’existe pas de langage de programmation nommé Rubis.
Si tu savais un tant soit peu coder en Ruby, tu ne ferais pas la faute


Est-ce que j'ai dis que je savais codé en Rubis ? Non :-°
Contrairement à certain quand je connais pas je fais pas une news sur le coins de table en ne vérifiant pas mes sources surtout sur un site aussi connu que celui-ci

Je trouve que Eregon a bien eu raison de remettre le point sur les i

Citation
Il paraît que les rubyists sont des gens fiers de leur langage de programmation.

Ce qui on fait la news non plus mais cela ne les as pas empêché de la faire
Tu n'a pas l'air de t'y connaitre non plus on est deux :)


Citation
Bref, arrête de faire ton troll comme ça. Ou continue, mais emploie des arguments convaincants. Merci.


Les arguments convaincants c'est Eregon qui les as mis en avant :p

Je trouve déplorable de faire des news sans vérifier ces sources et dire même des détails faux ! Il n'ont pas refait la même erreur sur celle-ci ouffff

:D


Sa y est les susceptible ont finis? :-°

Image utilisateur
 
Hors ligne bluestorm # Posté le 26/08/2010 à 13:46:36
dont ask to ask
Avatar
Groupe : Anciens
Flux RSS

Merci de rester dans le sujet (cette news ne parle pas spécialement de Ruby), et de rester correct (l'ironie et les attaques n'améliorent pas une discussion).

Si vous voulez continuer à discuter de la news Ruby (dont les commentaires sont fermés), je suggère que vous le fassiez soit sur un topic du forum, soit par MP. Si vous continuez à dérailler de façon agressive, je pense que vous serez sanctionnés (et d'ailleurs je ne comprends pas pourquoi ça n'a pas déjà été fait).
 
Hors ligne colbseton # Posté le 26/08/2010 à 13:53:07
Have you met me ?
Avatar
Groupe : Anciens

Faut pas généraliser la dernière sur news Ruby à toutes les news qui parlent des langages de programmation.

Bref', stop le hs et troll : dernier avertissement.

 
Hors ligne gg++ # Posté le 26/08/2010 à 14:17:53
Ca gère la fougère
Avatar

Merci de dire les chose ! On me parle de façon agressive !

Citation
Si vous continuez à dérailler de façon agressive, je pense que vous serez sanctionnés (et d'ailleurs je ne comprends pas pourquoi ça n'a pas déjà été fait).


Parce que tu n'es pas admin et c'est pas toi qui fais la loi :p

Je ne fais que me défendre de ces méchancetés :)

J'ouvrirai un topic sur cette news puisque les commentaires ont été fermé

Citation : Colb-Seton
Faut pas généraliser la dernière sur news Ruby a toutes les news qui parlent des langages de programmation.


Après tout c'est vrai qu'il ne faut pas généraliser
j'ai été quelques peu déçu sur la pertinence
de la source mais bon il y a pas mort d'homme :p


Peas mes frères :D

Image utilisateur
 
Hors ligne Lukas # Posté le 26/08/2010 à 16:52:54
Groupe : Anciens

Ville : Mont-dol
Pays : France métropolitaine

Bluestorm n'est pas admin, mais ça ne l'empêche pas de pouvoir réfléchir, et c'est _normalement_ quelque chose à la portée de tous les membres.
Ensuite puisque tu n'as pas compris, le message de Colb-Seton t'invitait à aller parler de la news ruby dans suggestions et commentaires si tu le souhaitais, et à arrêter d'en parler ici.
Ca fera donc +5% à monsieur gg++
EDIT: Colb-Seton a déjà sanctionné en fait.
Hors ligne laurent.petit # Posté le 07/09/2010 à 09:33:08

Bonjour,

J'en profite pour faire une petite pub personnelle. Et oui, il y a des "p'tits français" qui s'intéressent à Clojure, et depuis longtemps ! Votre serviteur par ex. est (actuellement) le principal contributeur d'un effort pour simplifier le codage de projets clojure dans Eclipse. Le projet s'appelle Counterclockwise (ccw en abrégé), et est disponible ici : http://code.google.com/p/counterclockwise/

Bonne chance à tous ceux qui voudront essayer clojure. Ca change beaucoup de ce qu'on a l'habitude de voir par ex. en java, et en plus comme la syntaxe utilisée est différente de toute la famille de langages C/C++/Ruby/Java/Python, souvent elle rebute alors qu'il ne s'agit que de la surface des choses à découvrir.

Un point important qui même s'il a été abordé dans la news mérite d'être martelé encore et encore : clojure n'est pas un langage fonctionnel pur. D'abord, il ne peut pas y prétendre, puisqu'il fournit les moyens d'intéropérer avec tout le code java existant.
Ensuite, il se démarque des langages fonctionnels purs ainsi: quand on écrit du code clojure sans intéropérer avec des librairies java, le code est "fonctionnel" par défaut. Ensuite, pour toutes les parties de code qui nécessitent de gérer des états, le langage (et pas des librairies annexes) fournit des mécanismes intégrés ("managés"). Pour faire un parallèle, on peut dire que Clojure apporte en termes de "gestion automatique des changements d'état" par rapport à Java (par ex.) ce que Java apporta en termes de "gestion automatique de la mémoire (ramasse-miettes)" à C++.

Laurent
Pour accéder à cette section
Connectez-vous !
connexion_rpx

Revenir à la liste des news