# Oz (linguagem de programação)

Oz é uma linguagem de programação multiparadigma, desenvolvida nos Laboratórios de Sistemas de Programação da Saarland University.
Oz foi primeiro desenvolvida por Gert Smolka e seus estudantes em 1991.
No ano de 1995, foi lançado a primeira versão do Oz, o OZ 1. Ele caracterizava-se por basear-se num modelo de concorrencia, que assume que qualquer expressão pode potencialmente ser executada de modo concorrente. Mais tarde, surgiu a versão Oz 2, que teve como principal novidade melhoramentos relativas ao modelo de concorrencia anterior. Em 1996 o desenvolvimento do Oz continuou em cooperação com o grupo de pesquisa de Seif Haridi no Swedish Institute of Computer Science. Desde 1999, Oz tem sido continuamente desenvolvido por um grupo internacional, o Mozart Consortium, que originalmente consistia da Saarland University, da Swedish Institute of Computer Science, e da Université catholique de Louvain. Em 2005, a responsabilidade do desenvolvimento Mozart foi transferida para um grupo, Mozart Board, com o propósito expresso de abrir o desenvolvimento Mozart para uma comunidade maior.
O Sistema de programação Mozart é a implementação do Oz 3. Ele foi lançado com uma licença de Código aberto pela Mozart Consortium. Mozart foi levado para várias plataformas, como Unix, FreeBSD, GNU/Linux, Microsoft Windows, e Mac OS X. As principais diferenças das versões anteriores estão relacionados a introdução de functors(componentes de softwares espalhados por diferentes URLs), e as futures (sincronização do fluxo de dados na internet)

## Características da linguagem

Oz é uma linguagem que veio a partir da experiência de outras linguagens, tais como prolog, Earland e lisp, portando a maior parte dos conceitos dos maiores paradigmas de programação, incluindo paradigmas lógico, funcional (tanto lazy quanto eager), imperativo, orientada a objeto com restrições, distribuída e concorrente. Oz tem tanto uma forma semântica simples e uma semântica eficiente$^[$. Oz é uma linguagem orientada a concorrencia, termo introduzido por Joe Armstrong, o principal designer da Erlang.
    Plataforma:
   * Possui maquina virtual, que é portável e pode ser executada em sistemas Unix ou Windows.
   * O sistema Mozart tem uma biblioteca orientada a objetos que disponibiliza funcionalidades de interface gráfico baseadas em Tcl/Tk.
   * Facilmente expansível, de forma a aumentar as suas funcionalidades através de suas DLLs.

## Modelo de programação

O modelo Oz é constituído por uma area de armazenamento abstrata feita por thread de fluxo de dados. Por meio delas, é possível realizar a execução de sequencias, expressões e realizar o bloqueio quando ocorre a indisponibilidade de dados na área de restrições. Sua área de armazenamento é composto por 3 componentes: a área de restrições, com as variáveis e valores instanciados, área de procedimentos, com as definições dos procedimentos e a área das células', com os apontadores mutáveis. A implementação da linguagem é realizada num ambiente de desenvolvimento chamado de OPI (Oz Programming Interface). Este ambiente de desenvolvimento usa o Emacs, expandindo os seus menus e coloração sintáctica, de forma a facilitarem a programação.

## Programando em OZ

A melhor forma de iniciar a programação é começando pela sequencial, levando-se em consideração que um conjunto de instruções podem ser executadas sequencialmente (thread). As variáveis em OZ são variáveis lógicas, ou seja, só podem ser instanciadas uma vez. Este tipo de variáveis é usada em linguagens lógicas, como prolog.

### Funções

Funções são valores de primeira classe, permitindo a programação de ordem superior funcional:

### Variáveis ​​de fluxo de dados e simultaneidade declarativa

Quando o programa encontra uma variável unbound (fora dos limites) ele espera por um valor:
Não é possível alterar o valor de uma variável de fluxo de dados, uma vez que é ligada:
Variáveis ​​de fluxo de dados tornam mais fácil a criação de agentes de fluxo concorrentes:
Devido à maneira como as variáveis ​​de fluxo de dados funcionam, é possível colocar threads em qualquer parte do programa e garante-se que ele terá o mesmo resultado. Isto faz com que a programação concorrente seja muito fácil. Threads são muito baratas: é possível ter centenas de milhares de threads em execução de uma só vez.

### Outro Exemplo

Esse exemplo calcula um fluxo de números primos usando o algoritmo Trial division, através da criação recursiva de agentes concorrentes de fluxo que filtram números não primos:

### Laziness

Oz faz uso de eager evaluation por padrão, mas lazy evaluation também é possível:

### Simultaneidade de passagem de mensagens

O modelo declarativo concorrente pode ser estendido com a passagem de mensagens através da semântica simples:
Com uma porta e uma thread o programador pode definir agentes assíncronos:

### Estado e objetos

É novamente possível estender o modelo declarativo para apoiar a programação orientada a objetos e a estado com uma semântica muito simples; nós criamos uma nova estrutura de dados mutável chamada Cells:
Com essas simples mudanças de semântica, podemos apoiar o paradigma orientado a objetos. Com um pouco de açúcar sintático (syntactic sugar) a programação orientada a objetos torna-se bem integrada em Oz.

## Velocidade de Execução

A velocidade de execução de um programa produzido pelo compilador Mozart (versão 1.4.0 implementando Oz 3) é muito lenta. Em um benchmark(teste de desempenho) é na média cerca de 50 vezes mais lento do que o compilador GCC para a linguagem C, resolvendo as tarefas de benchmark.

## Aplicações

* Linguagem para aprendizado: Desenvolvido para ensinar programação, introduzir conceitos novos e mostrar sua eficiencia;
* Simulações: Imita a operação de um processo do mundo real p sistema a longo tempo
* Sistema multi-agente:
* Processamento Natural da Linguagem:
* Realidade Virtual: