Clean (langage de programmation) - Clean (programming language)
Paradigme | fonctionnel |
---|---|
Conçu par | Groupe de recherche sur la technologie logicielle de l'Université Radboud de Nimègue |
Première apparition | 1987 |
Version stable | 3.0 / 19 octobre 2018
|
Discipline de frappe | fort , statique , dynamique |
OS | Multiplateforme |
Licence | BSD simplifié |
Extensions de nom de fichier | .icl, .dcl, .abc |
Site Internet | nettoyer |
Influencé par | |
Maigre , Miranda , Haskell | |
Influencé | |
Haskell , Idris |
Clean est un langage de programmation informatique purement fonctionnel à usage général . Pendant une grande partie de l'histoire du développement actif du langage, il a été appelé Concurrent Clean , mais cela a été abandonné à un moment donné. Clean est développé par un groupe de chercheurs de l'Université Radboud de Nimègue depuis 1987.
Caractéristiques
Le langage Clean est apparu pour la première fois en 1987 et est encore en cours de développement. Il partage de nombreuses propriétés avec Haskell : transparence référentielle , compréhension de liste , gardes , garbage collection , fonctions d'ordre supérieur , currying et évaluation paresseuse .
Un environnement de développement intégré (IDE) pour Microsoft Windows est inclus dans la distribution Clean.
Clean traite l'état mutable et les E / S via un système de typage unique , contrairement à l'utilisation des monades par Haskell . Le compilateur tire parti du système de type d'unicité pour générer un code plus efficace, car il sait que tout ce qui a un type d'unicité ne peut être utilisé qu'une seule fois. Par conséquent, une valeur unique peut être modifiée sur place .
Exemples
Start = "Hello, world!"
fac :: Int -> Int
fac 0 = 1
fac n = n * fac (n-1)
Start = fac 10
|
fac :: Int -> Int
fac n = prod [1..n] // The product of the numbers 1 to n
Start = fac 10
|
fib :: Int -> Int
fib 0 = 1
fib 1 = 1
fib n = fib (n - 2) + fib (n - 1)
Start = fib 7
|
fibs :: Int Int -> [Int]
fibs x_2 x_1 = [x_2:fibs x_1 (x_2 + x_1)]
fib :: Int -> Int
fib n = (fibs 1 1) !! n
Start = fib 7
|
Opérateur Infix :
(^) infixr 8 :: Int Int -> Int
(^) x 0 = 1
(^) x n = x * x ^ (n-1)
La déclaration de type indique que la fonction est un opérateur d'infixe associatif droit avec la priorité 8: cela indique l' x*x^(n-1)
équivalent de x*(x^(n-1))
par opposition à (x*x)^(n-1)
. Cet opérateur est prédéfini dans StdEnv , la bibliothèque standard Clean.
Comment fonctionne Clean
Le calcul est basé sur la réécriture et la réduction de graphes . Les constantes telles que les nombres sont des graphiques et les fonctions sont des formules de réécriture de graphiques. Ceci, combiné à la compilation en code natif, permet aux programmes Clean qui utilisent une abstraction élevée de fonctionner relativement rapidement selon le Computer Language Benchmarks Game .
Compiler
- Les fichiers source (.icl) et les fichiers de définition (.dcl) sont traduits en Core Clean, une variante de base de Clean, dans Clean.
- Core Clean est converti en langage intermédiaire indépendant de la plate-forme (.abc) de Clean, implémenté en C et Clean.
- Code ABC intermédiaire est converti en code objet (.o) en utilisant C .
- Le code objet est lié à d'autres fichiers du module et du système d'exécution et converti en un exécutable normal à l'aide de l' éditeur de liens système (s'il est disponible) ou d'un éditeur de liens dédié écrit en Clean sur Windows .
Les versions antérieures du système Clean étaient entièrement écrites en C , évitant ainsi les problèmes de démarrage.
Le système SAPL compile Core Clean en JavaScript et n'utilise pas de code ABC.
La machine ABC
Pour combler l'écart entre Core Clean, un langage fonctionnel de haut niveau, et le code machine , la machine ABC est utilisée. Il s'agit d'une machine impérative de réécriture de graphes abstraits . La génération de code machine concret à partir de code ABC abstrait est une étape relativement petite, donc en utilisant la machine ABC, il est beaucoup plus facile de cibler plusieurs architectures pour la génération de code.
La machine ABC a un modèle de mémoire inhabituel . Il dispose d'un magasin de graphes pour contenir le graphe Clean qui est en cours de réécriture. La pile A (rgument) contient des arguments qui font référence aux nœuds dans le magasin de graphes. De cette façon, les arguments d'un nœud peuvent être réécrits, ce qui est nécessaire pour la correspondance de modèles . La pile B (valeur asique) contient des valeurs de base (entiers, caractères, réels, etc.). Bien que cela ne soit pas strictement nécessaire (tous ces éléments peuvent également être des nœuds dans le magasin de graphes), l'utilisation d'une pile séparée est beaucoup plus efficace. La pile C (ontrol) contient les adresses de retour pour le contrôle de flux.
Le système d'exécution , qui est lié à chaque exécutable, a une print
règle qui imprime un nœud sur le canal de sortie. Lorsqu'un programme est exécuté, le Start
nœud est imprimé. Pour cela, il doit être réécrit à la forme normale racine, après quoi ses enfants sont réécrits à la forme normale racine, etc., jusqu'à ce que le nœud entier soit imprimé.
Plateformes
Clean est disponible pour Microsoft Windows , Apple Macintosh , Solaris et Linux .
Certaines bibliothèques ne sont pas disponibles sur toutes les plates-formes, comme ObjectIO qui n'est disponible que sur Windows et Mac. La fonctionnalité permettant d'écrire des dynamiques dans des fichiers n'est disponible que sous Windows.
Comparaison avec Haskell
Un benchmark de 2008 a montré que le code natif Clean fonctionne à peu près aussi bien que Haskell ( GHC ), selon le benchmark.
Différences syntaxiques
La syntaxe de Clean est très similaire à celle de Haskell, avec quelques différences notables:
Haskell | Faire le ménage | Remarques |
---|---|---|
[ x | x <- [1..10] , isOdd x]
|
[ x \\ x <- [1..10] | isOdd x]
|
compréhension de liste |
x:xs
|
[x:xs]
|
opérateur contre |
data Tree a
= Empty
| Node (Tree a) a (Tree a)
|
:: Tree a
= Empty
| Node (Tree a) a (Tree a)
|
type de données algébrique |
(Eq a, Eq b) => ...
|
... | Eq a & Eq b
|
assertions et contextes de classe |
fun t@(Node l x r) = ...
|
fun t=:(Node l x r) = ...
|
en tant que modèles |
if x > 10 then 10 else x
|
if (x > 10) 10 x
|
si |
En général, Haskell a introduit plus de sucre syntaxique que Clean.