A Linguagem de Programação Paralela Occam

EDUARDO TEODORO SILVA JÚNIOR SÉRGIO AUGUSTO CARVALHO GOMES UFLA - UNIVERSIDADE FEDERAL DE LAVRAS DCC - DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO teodoro@comp.ufla.br gomes@comp.ufla.br Resumo. Este trabalho apresenta as principais características e estruturas da linguagem de programação Occam. O objetivo é apresentar o modelo e a linguagem citando suas vantagens, aplicações e funcionamento, bem como a arquitetura do transputer. Palavras Chaves: Occam, transputer, paralelismo, programação paralela, sistemas distribuídos, INMOS, VLSI, MFLOPS.

1 - Introdução A linguagem de programação Occam foi criada por David May em 1983 na empresa INMOS, na Inglaterra. Tinha como objetivo desenvolver uma linguagem de programação paralela baseada na comunicação seqüencial de processos e que tivesse como característica a simplicidade, o que deu origem a seu nome. A linguagem tem um número reduzido de instruções que estão diretamente ligadas à arquitetura do hardware em que é executada, o transputer, um computador paralelo que foi desenvolvido especificamente para rodar o modelo Occam.

que pode ser feito com menos", que evidencia a simplicidade, outra citação sua diz que “A existência de Deus não pode ser deduzida usando-se apenas a razão” o que gerou uma “impopularidade” com a Igreja Católica. 2.1 - A Navalha de Occam Um enunciado de Willian de Occam é muito usado pelos cientistas, este princípio é conhecido como a “navalha de Occam”, e diz que "quando existem duas teorias competindo e que culminam no mesmo resultado, a mais simples é a melhor”. Occam enunciou vários princípios com esta mesma ênfase, como: "Entidades não podem ser múltiplas desnecessariamente.", ou "A explicação que requer o menor número de hipóteses é provavelmente a correta." [2]

2 - Origem do Nome Occam O nome OCCAM advém de William of Occam, que viveu entre os anos de 1270 e 1349. Occam ou Ockham era o nome da vila onde nasceu, no município de Surrey na Inglaterra. Willian de Occan era monge Franciscano, filósofo e erudito, defendia o princípio de que "É inútil fazer com mais o

3 - O Modelo Occam OCCAM define o modelo de programação para os transputers. Em OCCAM, os processos são conectados para a

formação de sistemas concorrentes, podendo cada um deles ser visto como uma "caixa preta", com seu próprio estado interno e estabelecendo comunicação com os demais pelo uso de canais de comunicação ponto-aponto. Processos podem modelar o comportamento de muitas coisas, por exemplo, uma porta lógica, um microprocessador, um escritório, etc. Um processo inicia, efetua ações e termina. Uma ação pode ser um conjunto de processos seqüenciais, um executado após o outro, ou um conjunto de processos paralelos, a serem executados de forma concorrente. Visto que um processo pode conter outros processos, os quais podem ser executados simultaneamente, pode-se observar um certo grau de concorrência intra-processo, variando à medida que a execução evolui. No transputer, um processo escreve um mensagem em um canal e, outro, lê a mesma mensagem do referido canal. A comunicação definida no modelo é sincronizada e destituída de buffer, somente tendo efeito quando ambos processos estiverem prontos. Evidencia-se a perfeita analogia entre tal esquema de comunicação e os mecanismos de handshake usados em sistemas de hardware. Posto que um processo permita concorrência interna, é possível que haja vários canais de entrada e de saída realizando comunicação ao mesmo tempo. Variantes dos processadores do tipo transputer podem ter diferentes conjuntos de instruções, dependendo do desejado equilíbrio entre custo, performance, concorrência interna e suporte a hardwares especiais; porém, o modelo OCCAM é sempre o irrefutável padrão que os define. [1]

o modelo Occam, apesar de suportar também outros tipos de linguagens mas sem a mesma eficiência. O primeiro modelo da família dos transputers, o transputer de 32 bits IMS T414, foi introduzido em 1985. Sistemas com múltiplos transputers começaram, então, a ser utilizados em aplicações intensamente numéricas, tais como simulação, controle de robôs, síntese de imagens, processamento de sinais, dentre outras. Portanto, o desempenho dos sistemas dependia do número da performance com que operações de pontoflutuante eram executadas. O segundo modelo (T8000) melhorou este aspecto e era capaz de executar 20 MFLOPS (Milions of Float Point Operations per Second) e 10 MIPS (Milions of Instrutions per Second). Apesar de já existirem vários modelos todos os transputers possuem as seguintes características: • Processador, com escalonador de processos em microcódigo; • Memória estática presente no chip; • Quatro links de comunicação com outros transputers; • Interface com memória externa ao chip. O transputer possui ligações de comunicação para conexão direta com outros transputers, permitindo que sistemas concorrentes possam ser construídos a partir de uma coleção de tais dispositivos, os quais operam paralelamente e se comunicam através das ligações. Segundo a taxonomia de computadores paralelos proposta por Flynn, percebe-se que um sistema de computação baseado em uma rede de transputers enquadra-se na classe MIMD (Multiple Instruction, Multiple Data), sendo que cada transputer possui sua própria memória local. O transputer provê mecanismos para comunicação rápida entre processadores, denotando que os objetivos do projeto estavam centrados na idéia de sistemas com vários

4 - Transputers Transputer é um dispositivo VLSI (Very Large Scale Integration) com chips integrados, desenvolvido pela empresa INMOS Ltda. na Inglaterra em 1985, com o objetivo de suportar

processadores realizando comunicação por troca de mensagens. Ademais, somou-se o suporte explícito a múltiplos processos em cada transputer. O escalonador de processos usa a política Round-Robin, e suporta um número arbitrário de processos concorrentes. O processador apresenta um conjunto reduzido de instruções, fato que leva alguns autores considerarem-no um processador RISC. Outros, entretanto, não ousam qualificálo como RISC, tampouco como CISC, advogando que o transputer não pertence a qualquer das duas categorias. No contexto desta discórdia, defende que o transputer não é CISC porque seu conjunto de instruções é reduzido, porém, é muito mais do que RISC, por ser detentor de funcionalidades extras, como por exemplo, o suporte ao conceito de processo e à comunicação entre processos, ou seja, suporte a conceitos de alto nível. Ao contrário da maioria das máquinas RISC’s, o transputer dispõe de um pequeno conjunto de registradores. Em última análise, um sistema de transputers consiste em processadores do tipo transputer, interconectados, cada qual executando um processo OCCAM, efetivando a comunicação através de canais OCCAM, alocados aos links de comunicação [1].

Em Occam não existe precedência de operadores, logo é sempre necessário indicar com parênteses a ordem das operações. Ex: w := x * y + z, não se pode afirmar qual operação será feita primeiro, a multiplicação ou a soma, a sintaxe correta seria: w := (x * y) + z. ou w := x * (y + z). A linguagem possui 5 processos primitivos:
Primitiva Sintaxe Exemplo Atribuição <variável> := <expressão> x := y Recebe <canal> ? <variável> Ch ? x Envia <canal> ! <expressão> Ch ! y Salto SKIP SKIP Parada STOP STOP

• • • • •

Atribuição – Armazena em uma variável o valor de uma expressão. Recebe – Recebe um valor pelo canal de comunicação indicado e armazena na variável. Envia – Envia o valor de uma expressão para o canal indicado. Salto – Cria um processo que não faz nada e o encerra, é como a instrução NOP do assembly. Parada – Para o processamento.

5 - A Linguagem Occam Um programa escrito em Occam deve ter todas as palavras reservadas escritas em letras maiúsculas. A indentação deve ser feita com 2 espaços para se indicar blocos, não existem limitadores como begin-end ou { - }. Não são necessários indicadores de final de linha, cada início de linha é entendido como uma nova instrução, para se escrever duas instruções na mesma linha deve-se separá-las por ponto e vírgula (;), as variáveis podem ser declaradas em qualquer parte do código e não apenas no início e comentários são indicados por dois hífens (--) e seguem até o final da linha.

A linguagem Occam possui dois construtores para avisar ao compilador se um bloco é paralelo ou seqüencial, são eles SEQ e PAR, como visto anteriormente os blocos são definidos através da indentação com dois espaços. Ex: SEQ x := a + b y := b + c PAR x := x * x y := x + 1 Como podemos notar a sintaxe do bloco seqüencial (linha 2 e 3) é similar à do bloco paralelo (linha 5 e 6), são os construtores que avisam ao compilador para enviar os processos para canais de

comunicação e distribuí-los ou executá-los seqüencialmente.

6 - Vantagens da Linguagem Occam • projeto de hardware do transputer foi desenvolvido especificamente para esta linguagem, por isso apesar da linguagem ser de alto nível ela é enxergada como um assembly. Um algoritmo escrito para rodar em uma rede de transputers pode indiferentemente ser compilado e executado em apenas uma máquina, o que facilita testes. A comunicação entre processos é feita através de troca de mensagens por de canais de comunicação, ou seja, não há variáveis compartilhadas, o que evita uma série de problemas. Possui um conjunto reduzido de instruções, apesar de permitir o emprego de uma ampla variedade de técnicas de programação. O paralelismo é explicito, ao contrário de outras linguagens, existe um construtor para dizer que parte do código é paralela (PAR) e qual é seqüencial (SEQ).

5.1 - Tipos de Dados A linguagem Occam possui os seguintes tipos de dados [3]: Tipo INT BOOL BYTE REAL32 REAL64 CHAN Descrição Número inteiro Valor booleano Caracter Número real Número real Canal Bytes 2 1 1 4 8 Variável •

5.2 - If Diferentemente de outras linguagens de programação esta estrutura não analisa apenas uma condição, o if funciona também como um select, ou seja pode-se enunciar várias condições sem se acrescentar um elseif. A primeira condição verdadeira tem seu bloco executado e então a execução ai para o final do bloco if. Exemplo: IF x > y opcao := 1 x < y opcao := 2 x = y opcao :=3 •

7 - Conclusão Occam é uma linguagem eficiente e fácil para se implementar sistemas concorrentes, ela possibilita ao programador desenvolver projetos de uma maneira simples e rápida através do paradigma da troca de mensagens e da distribuição de processos. Os programas são facilmente adaptados para executar de forma seqüencial ou paralela já que o paralelismo ou não de um bloco é explícito. As instruções são próximas ao hardware do transputer, o que permite uma melhor performance tanto do programa como do próprio hardware. O fato de ser simples e ter recursos limitados e bem definidos também permite um melhor controle da segurança dos sistemas além de facilitar a depuração de código. É também uma boa linguagem para ser aproveitada para fins didáticos.

5.3 - While A instrução while é semelhante às das linguagens comuns, enquanto a condição testada for verdadeira o bloco é executado. Ex: WHILE i < 10 i := i + 1 x := x * 2

8 - Referências [1] - http://www.inf.ufrgs.br/procpar/disc/cmp134/trabs/T1/991/Transputer/ [2] - Gibbs, Phil, “What is Occam's Razor?”, 1996. [3] - Hyde, Daniel C., “Introduction to the Programming Language Occam”, Department of Computer Science Bucknell University, Lewisburg, 1995.