# Occam (linguagem de programação)

occam (de William de Ockham, da Navalha de Occam) é uma linguagem de programação utilizada em computação paralela que constrói uma seqüência de processos seqüenciais de comunicação (CSPs) que compartilham muitas de suas características. Desta forma, é uma implementação prática do CSP.
Occam é uma linguagem imperativa processual (como o Pascal). Ela foi desenvolvida por David May e outros da INMOS, aconselhada por Tony Hoare, como a língua nativa de programação para os seus microprocessadores, embora implementações para outras plataformas estão disponíveis. A versão mais conhecida é Occam 2; O manual da linguagem de programação Occam 2 foi feito em conjunto por Steven Ericsson-Zenith e outros em INMOS.

## Visão geral

Nos exemplos a seguir a indentação e a formatação são aspectos críticos para se analisar o código: expressões são terminadas por um fim de linha, listas de expressões precisam estar no mesmo nível de indentação (esse recurso, também conhecido como a regra de off-side, também é encontrado em outras linguagens).
Comunicação entre processos trabalham através dos chamados canais. Um processo emite saídas de dados para um canal através de um "!" enquanto outro fornece entradas de dados com um "?". Entrada e saída irão bloquear até que a outra extremidade esteja pronta para aceitar ou oferecer dados. Exemplos (c é uma variável):
SEQ introduz uma lista de expressões que são avaliadas sequencialmente. Isto não está implícito como na maioria das outras linguagens de programação. Exemplo:
PAR inicia uma lista de expressões que podem ser avaliadas concorrentemente. Exemplo:
ALT especifica uma lista de comandos guardas. Os guardas são uma combinação de condições booleanas e uma expressão de entrada (ambos opcionais). Cada guarda para o qual tanto a condição é verdadeira quanto o canal de entrada está pronto é bem sucedido. Uma das alternativas bem sucedidas é selecionada para a execução. Exemplo:
Isto irá ler dados a partir de canais C1 ou C2 (dependendo do que está pronto) e passá-lo em um canal fundido. Se countN alcançar a 100, leituras do canal correspondente serão desabilitadas. Um pedido sobre a condição do canal é atendido enviando a contagem de saída para out.

## Revisões da linguagem
### occam 1

occam 1 (lançada em 1983) foi uma versão preliminar da linguagem. Suportava apenas o tipo de dados VAR , que era um tipo integral correspondente ao comprimento da palavra nativa da arquitetura objeto, e matrizes de apenas uma dimensão.

### occam 2

occam 2 é uma extensão produzida pela INMOS Ltd, em 1987, que acrescenta suporte a ponto flutuante, funções, arrays multi-dimensionais e mais tipos de dados, tais como inteiros de tamanhos variados (INT16, Int32) e bytes.
Com esta revisão, Occam tornou-se uma linguagem capaz de expressar programas úteis, enquanto que Occam 1 foi mais adequada para análise de algoritmos e exploração da nova linguagem (embora deve-se notar que o compilador Occam 1 foi escrito em Occam 1, para que haja uma prova de que se podia escrever programas úteis em Occam 1, apesar das suas limitações).

### Occam 2.1

occam 2.1 foi o último da série de desenvolvimentos da linguagem Occam de contribuição da INMOS. Definida em 1994, foi influenciada por uma proposta anterior para uma linguagem 'Occam 3' (também referenciada como "occam91" durante os estágios iniciais de desenvolvimento) criada por Geoff Barrett na INMOS no início dos anos 90. Um Manual de Referência revisado descrevendo Occam 3 foi distribuído para a comunidade tecer comentários Geoff Barrett and Steven Ericsson-Zenith (31 de março de 1992). «occam 3 Reference Manual» (PDF). INMOS. Consultado em 24 de março de 2008 </ref>, mas a linguagem nunca foi plenamente implementada em um compilador.
occam 2.1 introduziu vários novos recursos na linguagem Occam 2, incluindo:
* Tipos de Dados nomeados (DATA TYPE x IS y)
* Registros Nomeados
* Packed Records
* Relaxação de algumas regras do tipo conversão
* Novos operadores (e.g. BYTESIN)
* Channel retyping e channel arrays
* Capacidade para retornar arrys de tamanho fixo de uma função
Para uma lista completa das mudanças ver apêndice do P INMOS occam 2.1 Reference Manual.

### occam-π

occam-π é o nome comum para a variante Occam implementada através de versões tardias de KRoC, um compilador Occan para Kent. A adição do símbolo "π" (pi) ao nome de Occan é uma alusãoao fato de que o KRoC occam inclui diversas idéias inspiradaspelo cálculo Pi. Ela contém um número significativo de extensões para o compilador Occam 2.1, por exemplo:
* Protocolos aninhados
* Criação de processos em Run-time
* Canais móveis, dados e processos
* Recursão
* Herança de protocolos