necessario. Nao deixando de considerar, tambem, o lado do programador que, com certeza, encontrara severas dificuldades para conseguir expressar sua logica de programacao, em uma linguagem que nao apresente notacoes concisas para tais situacoes.Problemas graves com tipos de dados podem surgir em circunstancias nas quais, por exemplo, uma estrutura de dados complexa deva ser passada como parte de uma mensagem, para um processo remoto. O sistema operacional, desconhecendo a forma como os dados estao representados, e incapaz de converter essa estrutura em pacotes - sequencias de bytes - para envia-los pela rede. Novamente, o programador e quem devera escrever o codigo explicitamente, arranjando a estrutura de dados no envio da mensagem, em uma sequencia de bytes, de tal forma que possa ser reconstituida no seu recebimento. Por outro lado, uma linguagem especificamente projetada para programacao distribuida, faria essa conversao automaticamente, alem de oferecer outras importantes vantagens na programacao, tais como, melhor legibilidade, portabilidade e verificacoes em tempo de compilacao.Normalmente, os servicos de cooperacao entre processos oferecidos pelos sistemas operacionais sao extremamente simples, podendo ser sintetizados em duas primitivas, ver Ben (1985): SEND (mensagem): envia uma mensagem a um processo destinatario e RECEIVE (mensagem): recebe uma mensagem de um processo origem.Dependendo do sistema operacional, estas primitivas podem ter efeito bloqueante ou nao. Um bloqueio, normalmente, se estende ate que a operacao seja efetivamente realizada, caracterizando assim uma forma primitiva de sincronizacao.A rigidez desses servicos oferecidos pelos sistemas operacionais constitui o aspecto mais relevante no contraste entre os suportes oferecidos pelos sistemas operacionais, e as linguagens de programacao distribuida. Grande parte das linguagens construidas para esse fim apresentam modelos de programacao de niveis mais elevados, possibilitando que o programador tenha um poder de abstracao muito maior do que naqueles oferecidos pelo modelo simples de troca de mensagens, suportado pela maioria dos sistemas operacionais.4.6 Modelos de Linguagens de Programacao DistribuidaUm grande numero de linguagens para programacao distribuida surgiu na decada 1980, dificultando ate a tarefa da escolha da linguagem mais adequada para uma determinada aplicacao, principalmente porque os seus modelos basicos de programacao dessas linguagens diferenciavam consideravelmente.O modelo de programacao distribuida considerado basico e aquele no qual um conjunto de processos sequenciais rodam em paralelo, comunicam-se por meio de passagem de mensagens e a deteccao de falhas e feita explicitamente Bal et al. (1989). Este padrao reflete diretamente a concepcao de sistemas distribuidos, ou seja, um conjunto de processadores autonomos conectados por meio de uma rede de comunicacao. Para muitas aplicacoes, esse modelo de processos e passagem de mensagens e o suficiente e muitas vezes ate vantajoso, pois ele pode ser eficientemente mapeado sobre a arquitetura distribuida, munindo o programador do controle total sobre os recursos de hardware (processadores e rede) disponiveis.Entretanto, modelos alternativos de programacao distribuida vem sendo projetados pois, para muitas aplicacoes que exigem niveis de abstracao maiores, o padrao basico se torna insuficiente.A primitiva de comunicacao, originalmente baseada em passagem de mensagens, tambem passou a ser questionada e novos padroes, que nao necessariamente refletem diretamente o modelo de comunicacao do hardware, comecaram a surgir. Dentre os modelos alternativos que maiores impactos causaram