# Oz (langage)

Oz est un langage de programmation permettant d'employer et de combiner différents paradigmes de programmation :
* fonctionnel,
* procédural et objets,
* relationnel et logique,
* contraintes,
* concurrence massive,
* distribution.
Oz fournit par défaut des variables logiques même s'il est possible d'utiliser des variables mutables. De même, l'évaluation est stricte par défaut, mais l'évaluation paresseuse est possible.
L'originalité de ce langage par rapport à d'autres supportant la programmation logique (d'une part) ou concurrente et distribuée (d'autre part, comme Erlang), est l'intégration de ces paradigmes dans un tout cohérent. Une abstraction unique en son genre est fournie par Oz : l'espace de calcul, qui permet d'encapsuler des calculs à des fins spéculatives et permet de combiner les aspects logiques/contraintes, orientation objet et mutabilité, concurrence et distribution, dans le même langage.
Oz est doté d'un ramasse-miettes et d'un système de gestion d'exceptions distribués.
Oz est implémenté par le système Mozart, fournissant un compilateur, une machine virtuelle et un environnement de développement utilisant EMACS pour la partie édition, un débogueur graphique supportant la concurrence et la distribution, un outil d'exploration d'arbres de recherche pour la programmation par contraintes, etc.
Le livre Concepts, Techniques, and Models of Computer Programming (MIT Press, 2004) utilise Oz comme langage principal pour illustrer les différents concepts de programmation. Il existe des cours universitaires de programmation en français basés sur Oz et ce livre.
Ce langage a été développé par trois écoles :
* Université catholique de Louvain (UCL - Belgique)
* université de la Sarre (Allemagne)
* Swedish Institute of Computer Science (en) (Suède).
Remarque : l'origine du nom Oz vient du fameux conte pour enfants, Le Magicien d'Oz.

## Fonctionnalités du langage
### Structures de données

Oz est basé sur un sous-ensemble du langage, appelé « langage noyau » disposant de peu de types de données qui peuvent être étendus à d'autres, plus pratiques par le biais d'un sucre syntaxique.
Structures de données de base :
* Nombres : à virgule flottante ou entier
* Enregistrement: structure de données composée permettant de regrouper de l'information : circle(x:0 y:1 radius:3 color:blue style:dots). Ici, les termes x, y, radius... sont les champs (appelés « features »), avec leurs valeurs associées. « circle » est défini comme le nom du record, son « étiquette ».
* Tuple: Enregistrement avec des noms de champs entiers croissants: circle(1:0 2:1 3:3 4:blue 5:dots)
* Liste: simple structure linéaire
Ces structures de données sont des valeurs (constantes) typées dynamiquement. Les noms de variables en Oz sont écrites avec une première lettre majuscule afin de les différencier des constantes littérales (atomes qui eux, commencent par une minuscule).

### Fonctions

Les fonctions sont des valeurs de première classe, permettant la programmation d'ordre supérieur:
Les fonctions peuvent utiliser à la fois des variables libres et liées. Les variables libres sont trouvées par portée lexicale.

#### Programmation d'ordre supérieur

Les fonctions sont comme d'autres éléments de Oz. Une fonction peut être passée comme attribut à une autre fonction ou encore être retournée par celle-ci.

#### Fonctions anonymes

Comme de nombreux autres langages fonctionnels, Oz supporte l'utilisation de fonctions anonymes (qui n'ont pas de noms) avec la programmation d'ordre supérieur. Le symbole $ est utilisé à cet usage.
Comme les fonctions anonymes n'ont pas de nom, il est impossible de définir récursivement des fonctions anonymes.

#### Procédures

Les fonctions en Oz doivent retourner une valeur comme dernière instruction de la fonction durant l'exécution. Dans l'exemple suivant, la fonction Ret retourne 5 si X > 0 et -5 dans les autres cas.
Mais Oz fournit aussi une fonctionnalité dans le cas où nous ne souhaitons pas retourner de valeur. De telles fonctions sont appelées procédures. Les procédures sont définies en utilisant le mot-clef proc, comme suit:
L'exemple ci-dessus ne retourne aucune valeur, il affiche juste 5 ou -5 dans l'interface de Oz en fonction du signe de X.

### Variable dataflow et concurrence déclarative

Quand le programme rencontre une variable non liée, il attend une valeur:
Il n'est pas possible de changer la valeur d'une variable dataflow une fois assignée (assignement unique)
Les variables dataflow rendent facile la création d'agents concurrents:
De par le mode de fonctionnement des variables dataflow, il est possible de placer des threads n'importe où dans le programme et il sera garanti qu'il gardera le même résultat. Ceci rend la programmation concurrente vraiment facile. Les threads sont assez légers: il est possible de faire tourner des milliers de threads à la fois

### Exemple : Divisions successives

Cet exemple calcule un flux de nombres premiers en utilisant l'algorithme de divisions successives en créant des agents qui filtrent les nombres non premiers.

### Paresse

Oz utilise l'évaluation stricte mais aussi l'évaluation paresseuse si possible:
L'évaluation paresseuse donne la possibilité de stocker presque une infinité de structures de données en Oz. Le pouvoir de l'évaluation paresseuse peut se voir par le biais du fragment de code suivant:
Le code ci-dessus calcule de manière élégante tous les nombres premiers réguliers dans une liste infinie. Les nombres réels ne sont calculés que si on les utilise.

### Concurrence par envoi de messages

Le modèle déclaratif concurrent peut être étendu par l'envoi de message à l'aide d'une sémantique simple:
Par un port et un thread, le programmeur peut définir des agents asynchrones:

### État et objets

Il est encore possible d'étendre le model déclaratif afin de supporter l'état et la programmation orientée objet par une sémantique très simple; nous créons une nouvelle strucure mutable, les cellules (Cells).
Avec cette sémantique très simple, Oz peut supporter tout le paradigme orienté-objet. Un peu de sucre syntaxique permet d'intégrer très facilement l'OOP comme suit: