Clean (langage de programmation) - Clean (programming language)

Faire le ménage
Clean 3.0 (langage de programmation) logo.svg
Paradigme fonctionnel
Conçu par Groupe de recherche sur la technologie logicielle de l'Université Radboud de Nimègue
Première apparition 1987 ; Il y a 34 ans ( 1987 )
Version stable
3.0 / 19 octobre 2018 ; il y a 2 ans ( 19/10/2018 )
Discipline de frappe fort , statique , dynamique
OS Multiplateforme
Licence BSD simplifié
Extensions de nom de fichier .icl, .dcl, .abc
Site Internet nettoyer .cs .ru .nl
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

Bonjour tout le monde :

 Start = "Hello, world!"

Factorielle :

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

Séquence de Fibonacci :

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

  1. Les fichiers source (.icl) et les fichiers de définition (.dcl) sont traduits en Core Clean, une variante de base de Clean, dans Clean.
  2. Core Clean est converti en langage intermédiaire indépendant de la plate-forme (.abc) de Clean, implémenté en C et Clean.
  3. Code ABC intermédiaire est converti en code objet (.o) en utilisant C .
  4. 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 printrègle qui imprime un nœud sur le canal de sortie. Lorsqu'un programme est exécuté, le Startnœ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.

Les références

Liens externes