• Nenhum resultado encontrado

Definição e implementação do sistema de tipos da linguagem circus

N/A
N/A
Protected

Academic year: 2021

Share "Definição e implementação do sistema de tipos da linguagem circus"

Copied!
181
0
0

Texto

(1)Universidade Federal de Pernambuco Centro de Inform´atica. P´os-gradua¸c˜ao em Ciˆencia da Computa¸c˜ao. ˜ E IMPLEMENTAC ˜ DO DEFINIC ¸ AO ¸ AO SISTEMA DE TIPOS DA LINGUAGEM. Circus Manuela de Almeida Xavier ˜ DE MESTRADO DISSERTAC ¸ AO. Recife Julho, 2006.

(2)

(3) Universidade Federal de Pernambuco Centro de Inform´atica. Manuela de Almeida Xavier ˜ E IMPLEMENTAC ˜ DO SISTEMA DE DEFINIC ¸ AO ¸ AO TIPOS DA LINGUAGEM Circus. Trabalho apresentado ao Programa de P´ os-gradua¸ c˜ ao em Ciˆ encia da Computa¸ c˜ ao do Centro de Inform´ atica da Universidade Federal de Pernambuco como requisito parcial para obten¸ c˜ ao do grau de. Mestre em Ciˆ encia da Com-. puta¸ c˜ ao.. Orientadora: Profa. Dra. Ana Cavalcanti Co-orientador: Prof. Dr. Augusto Sampaio. Recife Julho, 2006.

(4) iv.

(5) Aos meus grandes amores: minha m˜ ae, meu pai e Jorge..

(6)

(7) AGRADECIMENTOS Em primeiro lugar, agrade¸co a Deus por toda luz, equil´ıbrio e inspira¸c˜ao. Sou eternamente grata a minha orientadora, Ana Cavalcanti, que muito contribuiu para o meu crescimento intelectual e pessoal. Agrade¸co pela sua dedica¸ca˜o e amizade durante estes cinco anos de orienta¸c˜ao, desde a inicia¸ca˜o cient´ıfica at´e o mestrado. O ato de orientar, na minha concep¸c˜ao, consiste em compartilhar conhecimento, cobrar resultados e vibrar com as vit´orias. Estes, sem d´ uvida, foram os pap´eis muito bem desempenhados por ela, o que resulta na minha profunda admira¸c˜ao pelo seu profissional. Agrade¸co tamb´em ao Augusto Sampaio pelo apoio na ausˆencia de Ana e pelas sugest˜oes no rumo da pesquisa. Augusto foi algu´em com quem pude contar sempre nas horas de sufoco e com seu excelente bom humor desempenhou plenamente seu papel de co-orientador. Agrade¸co aos componentes da banca examinadora, Alexandre Vasconcelos e M´arcio Corn´elio, por todas as observa¸co˜es feitas ao trabalho realizado, contribuindo para a melhoria do mesmo. Gostaria de agradecer tamb´em `as pessoas que contribu´ıram bastante na evolu¸c˜ao do ˆ meu trabalho de pesquisa. Agrade¸co `a Angela e L´eo Freitas pela troca de id´eias e apoio no desenvolvimento do verificador de tipos, pela evolu¸c˜ao conjunta do analisador l´exico e sint´atico de Circus, pelos testes e integra¸co˜es realizadas, e pelas sugest˜oes de melhorias apresentadas. Apesar da distˆancia, os dois foram pessoas bastante presentes durante este u ´ltimo ano de mestrado. Agrade¸co tamb´em a minha querida amiga Carla, pelas dicas com o JLex e JCup, e pelo esclarecimento de d´ uvidas sobre CSP, juntamente com Alexandre Mota. Nada disso teria se realizado se n˜ao fosse o apoio dos meus pais. Agrade¸co a eles pelo amor constante, carinho, paciˆencia e recursos disponibilizados ao longo de toda minha vida. Admiro-os profundamente e agrade¸co pela oportunidade de estudo que me proporcionaram durante todos estes anos. Tudo o que tenho, ou que terei, devo a eles. Agrade¸co profundamente ao meu querido e amado Jorge pelo seu amor, palavras de otimismo, pelas horas de lazer sacrificadas e pela sua admir´avel paciˆencia e apoio durante estes longos anos de gradua¸c˜ao e mestrado. S´o posso dizer que tudo isto fortaleceu a nossa rela¸c˜ao e que agora podemos seguir na dire¸ca˜o da realiza¸c˜ao do nosso grande sonho, que consiste na constru¸c˜ao da nossa fam´ılia. Agrade¸co ao CNPq, pelo apoio financeiro no primeiro ano do meu mestrado, e ao SERPRO, em especial Helena Cristina e Pedro Rodrigues, pelo apoio prestado no final do mestrado. Por fim, agrade¸co a toda minha turma da gradua¸c˜ao pela amizade e pelos momentos de descontra¸c˜ao, aos amigos conquistados no mestrado, aos funcion´arios do Centro de Inform´atica e a todos que, de uma forma ou de outra, contribu´ıram para a conclus˜ao deste trabalho. vii.

(8)

(9) A felicidade e a paz interior dependem do calor do cora¸ c˜ ao. — DALAI LAMA.

(10)

(11) RESUMO A busca constante pelo desenvolvimento de sistemas de software com qualidade vem despertando o interesse das grandes empresas na aplica¸c˜ ao de t´ecnicas formais. Dentre as linguagens formais, existem aquelas pr´oprias para a modelagem de dados complexos, tal como Z, e outras pr´oprias para a modelagem de comunica¸c˜ao e concorrˆencia, tal como CSP. Circus ´e uma linguagem de especifica¸c˜ ao, projeto e programa¸c˜ ao que combina Z e CSP. Al´em de possibilitar a especifica¸c˜ao de aspectos de dados e comportamentais de sistema concorrentes, Circus inclui um c´alculo de refinamentos. Este ´e seu diferencial em rela¸c˜ ao a outras integra¸c˜oes de Z com uma ´algebra de processos. Circus vem despertando interesse no meio industrial, manifestado atrav´es de colabora¸c˜ oes cient´ıficas e tecnol´ogicas, e possui uma equipe envolvida na constru¸c˜ao de ferramentas que visam facilitar sua utiliza¸c˜ ao. Muitas destas ferramentas precisam de um verificador de tipos para prover mais garantias quanto a consistˆencia das especifica¸c˜oes e programas, e, conseq¨ uentemente, de seus resultados. Neste trabalho, apresentamos uma defini¸c˜ ao formal para o sistema de tipos de Circus, com o intuito de auxiliar o desenvolvimento de um verificador de tipos para a linguagem. Optamos por primeiramente definir as regras de tipos de Circus para depois implementar o software que automatiza a aplica¸c˜ao dessas regras. Esta decis˜ao de projeto contribuiu para a constru¸c˜ ao robusta do verificador, pois a implementa¸c˜ ao consiste em um mapeamento direto das regras de tipos para linhas de c´odigo. O verificador desenvolvido tamb´em oferece recursos adicionais, tais como, a disponibilidade de informa¸c˜ oes de tipos para cada fragmento da especifica¸c˜ ao ou programa passado para an´alise, e o fornecimento de mensagens claras e objetivas dos poss´ıveis erros de tipos detectados ao longo da verifica¸c˜ ao. Adicionalmente, projetamos o verificador como um componente de f´acil integra¸c˜ ao, manuten¸c˜ ao e extens˜ao. Tamb´em apresentamos neste trabalho a nossa estrat´egia de valida¸c˜ ao do verificador. Elaboramos testes de pequeno e grande porte, a partir de estudos de casos de sistemas reais, tal como o sistema de SmartCard que descrevemos neste trabalho. Adicionalmente, integramos o verificador com outra ferramenta: o JCircus, que ´e um tradutor de Circus para Java. Tamb´em implementamos uma vers˜ao inicial de uma ferramenta de refinamentos, chamada CircusRefine, para integrar o verificador de tipos. Apesar de n˜ao termos constru´ıdo uma vers˜ ao completa de CircusRefine, nos preocupamos em definir a arquitetura da ferramenta de tal forma que sejam poss´ıveis futuras evolu¸c˜oes de forma simples e estruturada. Os testes e integra¸c˜ oes contribu´ıram para a corre¸c˜ao de defeitos da implementa¸c˜ ao e para a evolu¸c˜ ao e verifica¸c˜ ao de consistˆencia do verificador de tipos de Circus. Ao definir o sistema de tipos de Circus, e disponibilizar um verificador de tipos, acreditamos que estamos dando uma importante contribui¸c˜ ao na evolu¸c˜ ao de Circus, esclarecendo pontos essenciais de sua defini¸c˜ao como uma linguagem fortemente tipada e compat´ıvel com Z e CSP, e estamos tamb´em contribuindo para o desenvolvimento de outras ferramentas da linguagem. Esperamos que o nosso trabalho possa servir de base para a defini¸c˜ ao e implementa¸c˜ ao dos sistemas de tipos das extens˜oes de Circus. Palavras-chave: Linguagens formais, concorrˆencia, m´etodos formais, ferramentas.. xi.

(12)

(13) ABSTRACT The constant search for the development of systems with quality is resulting in industrial interest in the application of formal techniques. Currently, there are formal languages for modeling complex data structures, like Z, and others for modeling communication and concurrency, like CSP. Circus is a specification, design and programming language that combines Z and CSP. Besides making possible the specification of data and behavior aspects of concurrent systems, Circus includes a refinement calculus. This is its differential in comparison to other integrations of Z with an algebra of processes. Currently, Circus has a research team involved in the construction of tools that can facilitate its use. Many of these tools need a type checker to provide more guarantees about the consistency of the specifications and programs, and of its results. In this work, we present a formal definition of the Circus type system, with the intention of assisting the development of a type checker for this language. At first, we define the Circus type rules, and afterwards we describe how we implemented the type checker using a direct mapping of the type rules to code. This contributed to the robustness of the type checker. The developed type checker also offers extra facilities, such as the annotation of type information for each fragment of a specification or program, and the availability of clear and objective error messages. Additionally, we designed the type checker as a component of easy integration, maintenance and evolution. We also present in this work our validation strategy for the type checker. We elaborated tests using small specifications, to verify specific behaviors of the tool, and large specifications, from case studies of real systems, like the SmartCard specification that we describe in this work. Additionally, we integrated the type checker with another tool: JCircus, that it is a translator of Circus to Java. We also implemented an initial version of a refinement tool, called CircusRefine, to integrate the type checker. Although we have not constructed a complete version of CircusRefine, we defined the architecture of the tool to provide simple and structured evolutions. The tests and integrations have contributed for the correction of implementation defects and for the evolution and consistency verification of the Circus type checker. With the definition of the Circus type system and the implementation of its type checker, we believe that we are giving an important contribution in the evolution of Circus, clarifying essential points of its definition as a strongly typed language that is compatible with Z and CSP. Additionally, we are also contributing to the development of other tools for Circus. We hope that our work can serve as base for the definition and implementation of the type systems of the Circus extensions. Keywords: Formal languages, concurrency, formal methods, tools. xiii.

(14)

(15) ´ SUMARIO. Cap´ıtulo 1 – Introdu¸c˜ ao 1.1 1.2. 1.3 1.4. 1. Motiva¸c˜ao . . . . . . . . . . . . . . . . . . . . . . . . . . . Tipos e Sistema de Tipos . . . . . . . . . . . . . . . . . . . 1.2.1 Formaliza¸c˜ao de um Sistema de Tipos . . . . . . . 1.2.2 Inferˆencia de Tipos . . . . . . . . . . . . . . . . . . 1.2.3 Sistemas de Tipos para Linguagens de Especifica¸ca˜o Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . Estrutura da Disserta¸c˜ao . . . . . . . . . . . . . . . . . . .. . . . . . . .. . . . . . . .. . . . . . . .. . . . . . . .. . . . . . . .. . . . . . . .. . . . . . . .. . . . . . . .. Cap´ıtulo 2 – Circus 2.1 2.2. 2.3. 2.4. Hist´orico . . . . . . . . . . . . Descri¸ca˜o Informal da Sintaxe 2.2.1 Par´agrafos de Circus . 2.2.2 Processos . . . . . . . 2.2.3 Par´agrafos de Processo 2.2.4 A¸co˜es . . . . . . . . . 2.2.5 Comandos . . . . . . . Estudo de Caso . . . . . . . . 2.3.1 Modelo Abstrato . . . 2.3.2 Modelo Concreto . . . Considera¸co˜es Finais . . . . .. 9 . . . . . . . . . . .. . . . . . . . . . . .. . . . . . . . . . . .. . . . . . . . . . . .. . . . . . . . . . . .. . . . . . . . . . . .. . . . . . . . . . . .. . . . . . . . . . . .. . . . . . . . . . . .. . . . . . . . . . . .. . . . . . . . . . . .. . . . . . . . . . . .. . . . . . . . . . . .. . . . . . . . . . . .. . . . . . . . . . . .. . . . . . . . . . . .. . . . . . . . . . . .. . . . . . . . . . . .. . . . . . . . . . . .. . . . . . . . . . . .. . . . . . . . . . . .. . . . . . . . . . . .. . . . . . . . . . . .. . . . . . . . . . . .. Cap´ıtulo 3 – Sistema de Tipos de Circus 3.1 3.2. 1 3 4 5 5 6 7. 9 11 12 13 16 17 19 21 21 24 33 35. Ambiente de Tipos . . . . . . . . . . . . Regras de Tipos . . . . . . . . . . . . . . 3.2.1 Programa . . . . . . . . . . . . . 3.2.2 Par´agrafo de Circus . . . . . . . . 3.2.3 Declara¸ca˜o de Canal . . . . . . . 3.2.4 Express˜ao de Conjunto de Canais 3.2.5 Declara¸ca˜o de Processo . . . . . . 3.2.6 Defini¸ca˜o de Processo . . . . . . . 3.2.7 Processo . . . . . . . . . . . . . . 3.2.8 Express˜ao de Conjunto de Nomes 3.2.9 Par´agrafo de Processo . . . . . . 3.2.10 Defini¸c˜ao de A¸c˜ao . . . . . . . . . xv. . . . . . . . . . . . .. . . . . . . . . . . . .. . . . . . . . . . . . .. . . . . . . . . . . . .. . . . . . . . . . . . .. . . . . . . . . . . . .. . . . . . . . . . . . .. . . . . . . . . . . . .. . . . . . . . . . . . .. . . . . . . . . . . . .. . . . . . . . . . . . .. . . . . . . . . . . . .. . . . . . . . . . . . .. . . . . . . . . . . . .. . . . . . . . . . . . .. . . . . . . . . . . . .. . . . . . . . . . . . .. . . . . . . . . . . . .. 36 39 40 41 43 44 45 47 48 55 56 56.

(16) ´ SUMARIO. xvi. 3.3. 3.4 3.5. 3.2.11 A¸c˜ao Parametrizada . . . . . . 3.2.12 A¸c˜ao . . . . . . . . . . . . . . . 3.2.13 Comunica¸c˜ao . . . . . . . . . . 3.2.14 Parˆametros de Comunica¸c˜ao . . 3.2.15 Comando Parametrizado . . . . 3.2.16 Declara¸c˜ao de Parˆametros . . . 3.2.17 Comando . . . . . . . . . . . . 3.2.18 A¸c˜oes Guardadas . . . . . . . . Associa¸ca˜o entre as Regras de Tipos de 3.3.1 Par´agrafo de Estado . . . . . . 3.3.2 Par´agrafo Z . . . . . . . . . . . 3.3.3 Express˜ao . . . . . . . . . . . . 3.3.4 Express˜ao de Esquema . . . . . 3.3.5 Predicado . . . . . . . . . . . . 3.3.6 Declara¸ca˜o . . . . . . . . . . . . ´ Arvore de Julgamentos . . . . . . . . . Considera¸co˜es Finais . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Circus e as . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Regras de . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . Z. . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . .. Cap´ıtulo 4 – Verificador de Tipos de Circus 4.1. 4.2. 4.3. 4.4 4.5. 77. Cen´ario Inicial . . . . . . . . . . . . . . . . . . . . . 4.1.1 Padr˜ao de Projeto Visitor . . . . . . . . . . 4.1.2 Verificador de Tipos para Z . . . . . . . . . CZT . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2.1 O Padr˜ao de Projeto Visitor do CZT . . . . 4.2.2 Verificador de Tipos do CZT . . . . . . . . . Verificador de Tipos de Circus . . . . . . . . . . . . 4.3.1 Arquitetura do Verificador . . . . . . . . . . 4.3.2 Classes Adicionais do Verificador de Circus . 4.3.3 Representa¸ca˜o do Ambiente de Tipos . . . . 4.3.4 Exemplo de Comportamento do Verificador Integra¸c˜ao com o Verificador de Tipos de Circus . . Considera¸co˜es Finais . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . .. . . . . . . . . . . . . .. . . . . . . . . . . . . .. . . . . . . . . . . . . .. . . . . . . . . . . . . .. . . . . . . . . . . . . .. . . . . . . . . . . . . .. . . . . . . . . . . . . .. . . . . . . . . . . . . .. . . . . . . . . . . . . .. . . . . . . . . . . . . .. . . . . . . . . . . . . .. Cap´ıtulo 5 – Valida¸c˜ ao do Verificador de Tipos 5.1 5.2. 5.3. Testes . . . . . . . . . . . . . . Integra¸c˜oes . . . . . . . . . . . 5.2.1 Integra¸ca˜o do Verificador 5.2.2 CircusRefine . . . . . . . Considera¸co˜es Finais . . . . . .. . . . . . . . . . . . . . . com JCircus . . . . . . . . . . . . . .. 57 58 62 64 66 66 67 70 71 72 72 72 73 73 73 73 74. 77 78 80 80 81 82 84 85 87 89 89 93 93 95. . . . . .. . . . . .. . . . . .. . . . . .. . . . . .. . . . . .. . . . . .. . . . . .. . . . . .. . . . . .. . . . . .. . . . . .. . . . . .. . . . . .. . . . . .. . . . . .. 95 97 98 98 111.

(17) xvii. ´ SUMARIO. Cap´ıtulo 6 – Conclus˜ oes 6.1 6.2 6.3. 115. Contribui¸c˜oes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Trabalhos Relacionados . . . . . . . . . . . . . . . . . . . . . . . . . . . . Trabalhos Futuros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 115 116 118. Apˆ endice A – Sintaxe de Circus. 121. Apˆ endice B – Fun¸c˜ oes Auxiliares. 123. B.1 B.2 B.3 B.4 B.5 B.6 B.7 B.8 B.9 B.10 B.11 B.12 B.13 B.14 B.15 B.16 B.17 B.18 B.19 B.20 B.21 B.22 B.23 B.24 B.25 B.26 B.27 B.28 B.29 B.30 B.31 B.32 B.33 B.34. Fun¸c˜ao Fun¸c˜ao Fun¸c˜ao Fun¸c˜ao Fun¸c˜ao Fun¸c˜ao Fun¸c˜ao Fun¸c˜ao Fun¸c˜ao Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o. Chan . . . . . . . . . Check . . . . . . . . . CheckChansRenaming CheckVarsRenaming . Compare . . . . . . . DeclareNewChans . . Decs . . . . . . . . . . DecsParDec . . . . . . Defs . . . . . . . . . . DefsAction . . . . . . DefsP . . . . . . . . . DefsPL . . . . . . . . DefsProc . . . . . . . DefsPSchema . . . . . DefsState . . . . . . . DiffDecs . . . . . . . . Extract . . . . . . . . ExtractAct . . . . . . ExtractActDefs . . . . ExtractFreeTypes . . . ExtractFT . . . . . . . ExtractGenTypes . . . ExtractGivenTypes . . ExtractParDecs . . . . ExtractProc . . . . . . ExtractProcDefs . . . ExtractVars . . . . . . ExtractVarsCP . . . . FindCA . . . . . . . . FindCComm . . . . . FindCCommand . . . FindCCSE . . . . . . FindCGA . . . . . . . FindCP . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 123 123 123 124 124 124 124 124 125 125 125 126 126 126 127 127 127 127 127 128 128 128 128 128 129 129 129 129 129 130 130 131 131 131.

(18) ´ SUMARIO. xviii B.35 B.36 B.37 B.38 B.39 B.40 B.41 B.42 B.43 B.44 B.45 B.46 B.47 B.48 B.49 B.50 B.51 B.52 B.53 B.54 B.55 B.56 B.57 B.58 B.59 B.60 B.61 B.62 B.63 B.64 B.65 B.66 B.67. Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o Fun¸ca˜o. FindCPP . . . . . . . . . FindImplicitChans . . . . FiniteDecs . . . . . . . . GenChans . . . . . . . . . GetTypeHead . . . . . . . GetTypeTail . . . . . . . . ImplicitChans . . . . . . . ImplicitRenameChans . . InstantiateTypesGenChan Into . . . . . . . . . . . . IsFinite . . . . . . . . . . IsNormalProc . . . . . . . MakeName . . . . . . . . MakeType . . . . . . . . . MakeTypeChan . . . . . . NewChans . . . . . . . . NewDefs . . . . . . . . . NoConflicts . . . . . . . . NoRep . . . . . . . . . . . NotInto . . . . . . . . . . NotRedeclare . . . . . . . NumTypes . . . . . . . . . NumTypesChan . . . . . . RefGenParam . . . . . . . RefState . . . . . . . . . . ReplaceChanType . . . . . Set . . . . . . . . . . . . . VarsC . . . . . . . . . . . VarsDec . . . . . . . . . . VarsParDec . . . . . . . . Verify . . . . . . . . . . . VerifyParDec . . . . . . . override . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. Apˆ endice C – Regras de Tipos de Circus C.1 C.2 C.3 C.4 C.5 C.6 C.7 C.8. Regra de Programa . . . . . . . . . . . . . . . Regras de Listas de Par´agrafos de Circus . . . Regras de Par´agrafos de Circus . . . . . . . . . Regras de Declara¸ca˜o de Canais . . . . . . . . Regras de Express˜oes de Conjuntos de Canais Regras de Declara¸ca˜o de Processos . . . . . . Regras de Listas de Par´agrafos de Processos . Regras de Processos . . . . . . . . . . . . . . .. 132 132 132 133 133 133 133 133 134 134 134 134 134 135 135 135 135 136 136 136 136 136 136 137 137 137 137 138 138 138 138 138 139 141. . . . . . . . .. . . . . . . . .. . . . . . . . .. . . . . . . . .. . . . . . . . .. . . . . . . . .. . . . . . . . .. . . . . . . . .. . . . . . . . .. . . . . . . . .. . . . . . . . .. . . . . . . . .. . . . . . . . .. . . . . . . . .. . . . . . . . .. 141 141 141 141 142 142 143 143.

(19) xix. ´ SUMARIO. C.9 Regras de Express˜oes de Conjuntos de Nomes . C.10 Regras de Par´agrafos de Processo . . . . . . . . C.11 Regras de Defini¸c˜ao de A¸c˜oes . . . . . . . . . . C.12 Regras de A¸c˜oes . . . . . . . . . . . . . . . . . . C.13 Regras de Comunica¸ca˜o . . . . . . . . . . . . . C.14 Regras de Listas de Parˆametros de Comunica¸ca˜o C.15 Regras de Parˆametros de Comunica¸ca˜o . . . . . C.16 Regras de Comandos Parametrizados . . . . . . C.17 Regras de Comandos . . . . . . . . . . . . . . . C.18 Associa¸co˜es com as Regras de Z . . . . . . . . .. . . . . . . . . . .. Apˆ endice D – Diagramas do Padr˜ ao de Projeto Visitor. . . . . . . . . . .. . . . . . . . . . .. . . . . . . . . . .. . . . . . . . . . .. . . . . . . . . . .. . . . . . . . . . .. . . . . . . . . . .. . . . . . . . . . .. . . . . . . . . . .. . . . . . . . . . .. . . . . . . . . . .. . . . . . . . . . .. . . . . . . . . . .. 145 145 145 145 147 148 148 148 148 149 151.

(20)

(21) LISTA DE FIGURAS 2.1 2.2 2.3. Especifica¸ca˜o do Processo CookieMachine . . . . . . . . . . . . . . . . . . Modelo Abstrato . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Modelo Concreto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 20 22 25. 3.1 3.2 3.3. Contextos de um Programa de Circus . . . . . . . . . . . . . . . . . . . . ´ Arvore de Julgamentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ambientes de Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 38 74 75. 4.1 4.2 4.3 4.4 4.5 4.6 4.7. Estrutura do C´odigo utilizando Visitor . . Estrutura de Classes do Padr˜ao Visitor . . Hierarquia de Classes do CZT . . . . . . . Classes do verificador de tipos de Z . . . . Esquema para Integra¸c˜ao do Verificador de Hierarquia das Classes de Circus . . . . . . Classes do verificador de tipos de Circus . .. . . . . . . .. . . . . . . .. . . . . . . .. 78 79 81 83 84 85 86. 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10 5.11 5.12 5.13 5.14. Interface Gr´afica de CircusRefine . . . . . . . . . . . . . . . . . . . . . Template das Leis de Refinamento de A¸c˜oes . . . . . . . . . . . . . . Exemplo do Template de Lei Preenchido . . . . . . . . . . . . . . . . Integra¸c˜oes de CircusRefine . . . . . . . . . . . . . . . . . . . . . . . . Diagrama de casos de uso de CircusRefine . . . . . . . . . . . . . . . . Pacotes de CircusRefine . . . . . . . . . . . . . . . . . . . . . . . . . . Mensagem de Erro de Tipo . . . . . . . . . . . . . . . . . . . . . . . . Tela de Leis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tela de Argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lista das A¸co˜es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tela de Desenvolvimento com A¸c˜ao Coletada . . . . . . . . . . . . . . Diagrama de Classes do Verificador de Tipos das Leis de Refinamento Mensagem de Erro de Tipo da Lei . . . . . . . . . . . . . . . . . . . . Templates da Lei Assumption Introduction . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. 100 101 101 103 104 105 106 107 107 108 108 109 111 114. D.1 Estrutura de Classes do Padr˜ao Visitor . . . . . . . . . . . . . . . . . . . D.2 Diagrama de Seq¨ uˆencia do Padr˜ao Visitor . . . . . . . . . . . . . . . . .. 151 151. xxi. . . . . . . . . . . . . . . . . Tipos . . . . . . . .. . . . . . . .. . . . . . . .. . . . . . . .. . . . . . . .. . . . . . . .. . . . . . . .. . . . . . . .. . . . . . . .. . . . . . . .. . . . . . . ..

(22)

(23) CAP´ITULO 1. Introdu¸c˜ ao Neste cap´ıtulo, apresentamos as motiva¸c˜oes e os objetivos do nosso trabalho. Tamb´em descrevemos os conceitos de tipos e sistemas de tipos e destacamos sua importˆancia para linguagens de especifica¸ca˜o e programa¸c˜ao. Por fim, apresentamos uma vis˜ao geral deste documento, destacando o que ser´a apresentado nos demais cap´ıtulos.. 1.1. Motiva¸c˜ ao. Apesar de d´ecadas de preocupa¸co˜es na ind´ ustria e no meio acadˆemico com o desenvolvimento de sistemas com qualidade, ainda s˜ao comuns as falhas, muitas vezes custosas, de grandes projetos de software. Os m´etodos formais tˆem sido cada vez mais utilizados para resolver problemas de desenvolvimento de software, contribuindo para a produ¸ca˜o de programas corretos ou, pelo menos, para minimizar a ocorrˆencia de erros. Uma vez tendo a especifica¸ca˜o formal de um sistema, podemos provar propriedades sobre a especifica¸ca˜o, assim como provar que um programa satisfaz a especifica¸ca˜o. M´etodos formais s˜ao utilizados hoje em dia em projetos industriais, e estes m´etodos tˆem se mostrado efetivos no desenvolvimento de sistemas de software de larga escala, cujo custo de falhas em termos econˆomicos ´e alto; e tamb´em no desenvolvimento de sistemas de seguran¸ca cr´ıtica, onde o custo de falhas ´e medido em termos de danos pessoais e vidas. Entre os muitos exemplos de aplica¸co˜es industriais de m´etodos formais, podemos citar o projeto SLAM [2] da Microsoft, que tem por objetivo verificar automaticamente se programas escritos em C utilizam corretamente as interfaces de uma biblioteca externa. O projeto utiliza e estende id´eias de verifica¸ca˜o de modelos, an´alise de programas e prova de teoremas. O objetivo da Microsoft ao utilizar m´etodos formais ´e provar a consistˆencia destes programas. A IBM ´e outra empresa que utiliza t´ecnicas formais. O IBM CICS ´e um grande sistema de processamento de transa¸co˜es e foi utilizada a linguagem formal Z [57] para especifica¸c˜ao parcial de alguns de seus componentes. A utiliza¸ca˜o das t´ecnicas formais na IBM resultou na redu¸ca˜o de erros e no aumento da qualidade do produto final [28, 15]. Por sua vez, a equipe de projeto da empresa Praxis utilizou uma combina¸ca˜o de m´etodos formais para ajudar a especificar, projetar e verificar o CDIS, um grande sistema respons´avel por exibir informa¸c˜oes dentro de um sistema de controle de tr´afego a´ereo (ATC). O resultado do projeto mostrou que a utiliza¸c˜ao de m´etodos formais em projetos reais de larga escala, al´em de ser pratic´avel, trouxe muitos benef´ıcios [23]. J´a a empresa Intel tem aplicado m´etodos formais para v´arios problemas que surgem durante o processo de definir as arquiteturas de plataforma para fam´ılias de processadores [1]. Propostas de melhorias para a qualidade de software incluem, entre outras id´eias, uma grande quantidade de t´ecnicas que ajudam a garantir que um sistema de software se 1.

(24) 2. ˜ INTRODUC ¸ AO. comporta corretamente com respeito a alguma especifica¸ca˜o do comportamento desejado. A escolha de uma linguagem adequada para a especifica¸c˜ao e programa¸c˜ao do sistema ´e um fator de extrema importˆancia para a busca pela qualidade do software. De todas as linguagens formais, a linguagem de especifica¸ca˜o Z [57, 66] tem sido a mais aceita na academia e na ind´ ustria. Z ´e bastante utilizada na descri¸ca˜o de sistemas seq¨ uenciais e seu ponto forte ´e a modelagem de dados complexos. No entanto, esta linguagem tem recursos limitados para modelagem de aspectos comportamentais, e n˜ao consegue expressar concorrˆencia diretamente. Por sua vez, a linguagem de especifica¸c˜ao CSP [25, 50] tamb´em vem sendo bastante aceita na ind´ ustria e tem como proposta a modelagem de comunica¸ca˜o e concorrˆencia. Trata-se de uma ´algebra de processos que enfatiza a ordem de execu¸c˜ao das opera¸c˜oes de um sistema. Diferentemente de Z, o ponto forte de CSP ´e a modelagem comportamental. No entanto, CSP n˜ao tem facilidades para defini¸ca˜o de estruturas de dados complexas e opera¸co˜es sobre elas. A modelagem de dados ´e simulada pela parametriza¸ca˜o de processos, com os parˆametros manipulados utilizando uma linguagem funcional. As duas linguagens possuem pontos positivos e negativos, mas as duas se completam. Enquanto Z ´e mais bem utilizada para modelagem de dados, e CSP para a modelagem de comunica¸ca˜o e concorrˆencia, a combina¸ca˜o das duas linguagens pode resultar em uma linguagem bastante poderosa e que atende aos aspectos estruturais e comportamentais na modelagem de sistemas. Desta forma, com o intuito de agregar as qualidades de duas linguagens de especifica¸ca˜o consolidadas, Z e CSP, e com o objetivo de propor e formalizar um c´alculo de refinamentos para programas concorrentes, surgiu o projeto de cria¸ca˜o da linguagem Circus [67, 68]. Existem na literatura diversas outras propostas de integra¸c˜oes de linguagens formais para modelagem de dados com ´algebras de processos. Fischer [16] prop˜oe a linguagem CSP-Z, que combina CSP com esquemas de Z para a descri¸ca˜o de tipos de dados. Nesta linguagem, para cada evento usado na parte CSP existe uma opera¸ca˜o correspondente na parte de Z, diferentemente de Circus, que dissocia comunica¸ca˜o de opera¸c˜oes sobre o estado. J´a em [17], Fischer define uma combina¸ca˜o de Object-Z, uma extens˜ao orientada a objetos de Z, com CSP. A linguagem resultante, CSP-OZ, estende Object-Z com a no¸c˜ao de canais de comunica¸ca˜o e a sintaxe de CSP. Em [42] ´e investigada a no¸c˜ao de heran¸ca para a linguagem CSP-OZ. A linguagem TCOZ [35, 33, 34], por sua vez, descreve uma nota¸c˜ao para especifica¸ca˜o de sistemas de tempo real, concorrentes e reativos. A linguagem inclui primitivas de tempo e suporta a modelagem de concorrˆencia m´ ultipla. Em [49] ´e proposta a tradu¸ca˜o de especifica¸co˜es Z em CSP. Smith, em [56], prop˜oe a integra¸c˜ao do Real-Time Object-Z [55] com a ´algebra de processos CSP, com o objetivo de possibilitar a especifica¸ca˜o de sistemas concorrente de tempo real. J´a em [27] ´e apresentada a linguagem CSP-OZ-DC, que estende a linguagem CSP-OZ com o aspecto de tempo real cont´ınuo. Buscando uma integra¸c˜ao com outra ´algebra de processos, em [20, 59] ´e proposta uma integra¸c˜ao da linguagem Z e do value-passing CCS. J´a em [4, 3] ´e descrita uma t´ecnica para o projeto de sistemas distribu´ıdos utilizando a nota¸ca˜o de m´aquina abstrata B. Em [5] ´e apresentada a ferramenta csp2B que converte especifica¸c˜oes escritas em CSP em especifica¸co˜es B. J´a em [62, 51, 63] ´e descrita uma forma de usar a ´algebra de processos.

(25) 1.2 TIPOS E SISTEMA DE TIPOS. 3. CSP para permitir a intera¸ca˜o controlada entre m´aquinas B concorrentes. Circus, no entanto, n˜ao ´e apenas mais uma proposta de integra¸ca˜o de Z com uma ´algebra de processos. Ela tamb´em inclui construtores da linguagem de comandos guardados de Dijkstra [13]. Em Circus n˜ao existe a separa¸ca˜o expl´ıcita da parte de dados da parte comportamental. Os construtores de Z e de CSP s˜ao utilizados livremente dentro da especifica¸c˜ao. Adicionalmente, Circus ´e uma linguagem de refinamentos, pois inclui uma teoria e um c´alculo de refinamentos que permite se chegar a c´odigo a partir de uma especifica¸ca˜o abstrata de um sistema. Sua semˆantica ´e baseada na UTP [26] e redefine as semˆanticas de Z e CSP. Uma linguagem de especifica¸c˜ao ou programa¸ca˜o deve fornecer todos os recursos necess´arios para a constru¸c˜ao de programas corretos. O conceito de tipos de dados ´e um importante aux´ılio para linguagens, j´a que incorporam caracter´ısticas desej´aveis de corretude, abstra¸c˜ao, seguran¸ca, flexibilidade e portabilidade. Uma linguagem que tem um sistema de tipos associado pode agregar a verifica¸ca˜o de tipos no seu pr´oprio compilador, no caso de uma linguagem de programa¸ca˜o, ou em outras ferramentas de processamento, no caso de uma linguagem de especifica¸ca˜o ou de projeto. Um sistema de tipos ´e um m´etodo sint´atico para provar ausˆencia de certos comportamentos do programa pela classifica¸ca˜o de express˜oes de acordo com os valores que elas denotam [47]. Na programa¸ca˜o, os tipos podem esclarecer v´arias quest˜oes, tais como a caracteriza¸ca˜o de valores que surgem dinamicamente no curso de uma computa¸ca˜o e a conformidade de representa¸ca˜o de tais valores. Tipos tamb´em podem impor certas limita¸c˜oes que ir˜ao ajudar a refor¸car a corretude dos programas. O uso de uma linguagem bem projetada e que disponibiliza uma verifica¸ca˜o autom´atica de tipos garante a ausˆencia de certas classes de erros em tempo de execu¸ca˜o. Apesar das linguagens de programa¸c˜ao terem sido a base para o desenvolvimento da teoria de tipos [24], tamb´em podemos aplicar muitos dos conceitos desta teoria para as linguagens de especifica¸c˜ao formal. Linguagens de especifica¸c˜ao s˜ao formas especiais de linguagens de programa¸c˜ao que n˜ao podem ser executadas. Embora exista uma grande quantidade de m´etodos ou nota¸c˜oes formais dispon´ıveis atualmente, tais m´etodos e nota¸c˜oes ainda s˜ao menos utilizados na comunidade industrial que no meio acadˆemico. Uma das principais raz˜oes para isto ´e a indisponibilidade e, muitas vezes, as limita¸co˜es das ferramentas de suporte automatizadas, tais como verificadores sint´aticos e verificadores de tipos. Certamente, a disponibilidade de tais ferramentas ´e essencial para a aplica¸ca˜o bem sucedida dos m´etodos formais em problemas de escala industrial. A existˆencia destas ferramentas pode encorajar e facilitar a utiliza¸ca˜o dos m´etodos formais, reduzindo a possibilidade de ocorrˆencias de erros; e pode aumentar a produtividade e a qualidade na produ¸ca˜o de especifica¸c˜oes formais.. 1.2. Tipos e Sistema de Tipos. Um sistema de tipos ´e uma cole¸ca˜o de regras de tipos para uma linguagem de programa¸c˜ao ou de especifica¸ca˜o. As regras de tipos determinam condi¸co˜es necess´arias para a execu¸ca˜o correta de programas. Sistemas de tipos podem adicionar regularidade `as linguagens. Quando uma linguagem est´a associada a um sistema de tipos, dizemos que ela ´e uma.

(26) ˜ INTRODUC ¸ AO. 4. linguagem tipada. Sistemas de verifica¸c˜ao de tipos para linguagens de programa¸ca˜o podem ser classificados como est´aticos ou dinˆamicos. Em uma linguagem estaticamente tipada, o tipo de cada express˜ao pode ser deduzido, e cada programa pode ser verificado em tempo de compila¸c˜ao. Um sistema de verifica¸ca˜o est´atico detecta erros de tipos e previne a gera¸ca˜o de c´odigo execut´avel inapropriado. Assim, n´os podemos dizer que um programa que foi verificado estaticamente ´e livre de erros de tipo em tempo de execu¸ca˜o. Isto permite que o compilador gere c´odigo execut´avel de forma mais eficiente, pois n˜ao ´e necess´ario incluir qualquer tipo de informa¸ca˜o ou mecanismos de verifica¸c˜ao de tipos no c´odigo. J´a em uma linguagem dinamicamente tipada, apenas os valores tˆem tipos fixos. Uma vari´avel ou parˆametro n˜ao tem um tipo associado, mas pode receber valores de tipos diferentes em tempos diferentes. Isto implica que os operandos devem ter seus tipos verificados imediatamente antes de uma opera¸ca˜o ser realizada em tempo de execu¸c˜ao. Sistemas de verifica¸ca˜o de tipos dinˆamicos geralmente abortam a execu¸c˜ao do programa quando um erro ´e detectado. Linguagens em que todas as vari´aveis e express˜oes s˜ao garantidamente usadas de forma consistente s˜ao chamadas de linguagens fortemente tipadas. Se uma linguagem ´e fortemente tipada, seu compilador pode garantir que os programas que ele aceita ser˜ao executados sem erros de tipos. Todas as linguagens que precisam apenas de verifica¸ca˜o est´atica s˜ao fortemente tipadas, mas o inverso nem sempre ´e verdadeiro, pois algumas linguagens fortemente tipadas precisam da determina¸c˜ao de alguns tipos em tempo de execu¸c˜ao. No caso de linguagens de especifica¸ca˜o, se o sistema de tipos n˜ao permite verifica¸c˜ao est´atica, isto significa que a verifica¸ca˜o de tipos n˜ao pode ser feita automaticamente. Conseq¨ uentemente, estabelecer que uma especifica¸c˜ao est´a bem tipada requer prova de teorema. Em geral, n˜ao ´e poss´ıvel executar a especifica¸ca˜o e testar a conformidade de tipos `a medida que a execu¸c˜ao evolui como ´e feito no caso de linguagens de programa¸ca˜o. Os teoremas que garantem conformidade de tipos se tornam obriga¸co˜es de prova do especificador, e tornam a tarefa de especifica¸ca˜o mais dif´ıcil. Esta ´e mais uma raz˜ao para projetar o sistema de tipos de uma linguagem de forma a possibilitar verifica¸c˜ao est´atica. 1.2.1. Formaliza¸c˜ ao de um Sistema de Tipos. O objetivo de se formalizar o sistema de tipos de uma linguagem ´e eliminar ambig¨ uidades em quest˜oes de tipos que uma defini¸ca˜o informal pode apresentar. Isto, conseq¨ uentemente, pode garantir a constru¸c˜ao robusta de verificadores de tipos para a linguagem, e uma vez se baseando na defini¸c˜ao formal do sistema de tipos, projetos distintos de verificadores apresentar˜ao o mesmo comportamento. A formaliza¸ca˜o de sistemas de tipos requer a defini¸c˜ao de nota¸co˜es precisas. O sistema de tipos formal de uma linguagem de programa¸c˜ao ou especifica¸ca˜o ´e uma caracteriza¸ca˜o matem´atica do sistema de tipos informal descrito nos manuais desta linguagem. Para a formaliza¸c˜ao do sistema de tipos de uma linguagem, essencialmente ´e necess´aria a formaliza¸c˜ao de toda a linguagem. O primeiro passo na formaliza¸c˜ao de uma linguagem ´e a descri¸c˜ao de sua sintaxe. O pr´oximo passo ´e definir as regras de escopo da linguagem.

(27) 1.2 TIPOS E SISTEMA DE TIPOS. 5. que associam, sem ambig¨ uidades, as ocorrˆencias de identificadores aos locais onde eles s˜ao declarados. Uma vez estabelecidas as regras de escopo, o pr´oximo passo consiste na defini¸c˜ao das regras de tipos da linguagem. Entretanto, as regras de tipos n˜ao podem ser formalizadas sem antes ser definido o ambiente de tipos est´atico da linguagem. Este ambiente de tipos define o escopo das vari´aveis de um termo em an´alise. Por fim, o u ´ltimo passo na formaliza¸c˜ao de uma linguagem consiste na defini¸ca˜o de sua semˆantica. A viola¸ca˜o do sistema de tipos de uma linguagem resulta na manipula¸ca˜o dos dados de forma n˜ao intencional, causando resultados n˜ao esperados em programas escritos nesta linguagem. Com o objetivo de prevenir viola¸c˜oes no sistema de tipos, ´e geralmente imposta aos programas uma estrutura de tipos est´atica. No caso das express˜oes com pouca ou nenhuma informa¸ca˜o de tipo fornecida explicitamente, um sistema de inferˆencia de tipos ´e usado para determinar os tipos destas express˜oes. 1.2.2. Inferˆ encia de Tipos. Em linguagens tipadas convencionais, o compilador atribui um tipo para toda express˜ao e sub-express˜ao. Contudo, o programador n˜ao precisa especificar o tipo de toda express˜ao e sub-express˜ao: as informa¸co˜es de tipos precisam apenas ser colocadas em pontos cr´ıticos de um programa e o restante ´e deduzido do contexto. Este processo de dedu¸c˜ao ´e chamado inferˆencia de tipos. No geral, a informa¸c˜ao de tipo ´e dada para vari´aveis locais e para argumentos e resultados de fun¸c˜oes. Os tipos de express˜oes e comandos podem ser inferidos, j´a que os tipos de vari´aveis e constantes s˜ao conhecidos. A inferˆencia de tipos de um termo escrito em um determinada linguagem est´a muito relacionada ao sistema de tipos desta linguagem. Um algoritmo de inferˆencia de tipos pode ser muito simples, muito complexo, ou imposs´ıvel de se determinar, dependendo do sistema de tipos. A utilidade pr´atica de um sistema de tipos depende da disponibilidade de um bom algoritmo de inferˆencia de tipos. 1.2.3. Sistemas de Tipos para Linguagens de Especifica¸c˜ ao. Na linha das linguagens de especifica¸ca˜o formal, Z se destaca por possuir uma defini¸ca˜o formal bem estabelecida do seu sistema de tipos e diversas implementa¸c˜oes do seu verificador de tipos. Em [72, 61] est˜ao definidas todas as regras de tipos da linguagem, juntamente com a defini¸c˜ao de sua sintaxe e semˆantica. A descri¸ca˜o de um verificador de tipos para Z, resultante da implementa¸c˜ao destas regras, pode ser encontrada em [37, 39]. J´a em [32] ´e definido um sistema de tipos de segunda ordem [9] para CSP. Um sistema de tipos ´e chamado de segunda ordem quando inclui quantificadores universais e existenciais para modelar fun¸co˜es gen´ericas, tipos de dados abstratos e subtipos. No entanto, as regras propostas neste sistema de tipos de CSP focam mais no c´alculo de processos e, desta forma, n˜ao contemplam toda a sintaxe da linguagem. Adicionalmente, n˜ao encontramos na literatura implementa¸co˜es de verificadores de tipos de CSP que referenciem este sistema de tipos. Em [53], s˜ao definidas regras de tipos para classes de Object-Z, e, em [14], estas regras de tipos s˜ao estendidas para os construtores adicionais de TCOZ. Em [30], s˜ao apresentadas algumas defini¸c˜oes informais das regras de tipos de Object-Z e ´e apresentado.

(28) ˜ INTRODUC ¸ AO. 6. o projeto do verificador de tipos da linguagem. N˜ao ´e feita nenhuma rela¸c˜ao entre as regras de tipos propostas em [53] e o verificador de Object-Z. Finalmente, em [65], ´e dada uma breve descri¸ca˜o do verificador de tipos da linguagem B, mas n˜ao s˜ao feitas referˆencias `as regras de tipos da linguagem. Os usu´arios de Circus vˆem assumindo que temos uma linguagem fortemente tipada, compat´ıvel com Z e CSP. Mas n˜ao h´a, na literatura, qualquer detalhamento ou descri¸ca˜o formal das regras de tipos de Circus.. 1.3. Objetivos. Nesta disserta¸ca˜o, definimos o sistema de tipos de Circus, com o intuito de auxiliar o desenvolvimento e garantir a ausˆencia de erros de tipos de especifica¸co˜es e programas escritos nesta linguagem, sendo este um passo importante para o desenvolvimento de sistemas de qualidade. Circus ´e uma linguagem relativamente nova, que vem sendo muito bem aceita pela ind´ ustria e atualmente possui uma equipe envolvida na sua evolu¸c˜ao e na constru¸c˜ao de ferramentas que visam facilitar sua utiliza¸ca˜o [46, 18, 19]. Muitas das ferramentas em desenvolvimento pelo grupo de Circus precisam de uma integra¸c˜ao com um verificador de tipos da linguagem para possibilitar a gera¸ca˜o de resultados com maior confiabilidade. O objetivo do nosso trabalho ´e formalizar o sistema de tipos de Circus tomando como base a defini¸c˜ao formal do sistema de tipos de Z e preservando tamb´em o comportamento de CSP do ponto de vista de tipos. A id´eia ´e manter a compatibilidade entre as linguagens e tornar mais f´acil o uso de Circus por pessoas j´a familiarizadas com Z e CSP. A defini¸ca˜o formal do sistema de tipos de Z envolve 57 regras e 2 ambientes; para CSP, temos 45 regras e 1 ambiente. Nosso desafio ´e integrar e harmonizar estas defini¸c˜oes, e ainda considerar os construtores adicionais de Circus. Isto envolve a necessidade de inferˆencia de tipos. N˜ao ´e do nosso interesse redefinir as regras de tipos de Z, uma vez que o sistema de tipos da linguagem j´a ´e muito bem estabelecido. O nosso objetivo ´e reutilizar as regras de Z em nosso sistema de tipos e, para tal, fazer associa¸co˜es entre as regras de Circus e as de Z. A formaliza¸ca˜o do sistema de tipos de uma linguagem possibilita a verifica¸ca˜o de programas para garantir o uso consistente de valores e express˜oes dos diversos tipos dispon´ıveis na linguagem. Adicionalmente, a formaliza¸ca˜o do sistema de tipos ´e uma especifica¸ca˜o precisa para um verificador de tipos e, como tal, um artefato importante para o seu desenvolvimento com qualidade. Uma defini¸c˜ao informal do sistema de tipos poderia levar a constru¸co˜es amb´ıguas de verificadores de tipos de uma mesma linguagem. Com o intuito de automatizar o sistema de tipos que propomos neste trabalho, e, desta forma, possibilitar a execu¸c˜ao das demais ferramentas de Circus com especifica¸c˜oes v´alidas e bem tipadas, tamb´em ´e nosso objetivo implementar um verificador de tipos para Circus. Para a constru¸ca˜o robusta do verificador, faremos um mapeamento direto de cada regra de tipos, definida na formaliza¸c˜ao do sistema de tipos, para c´odigo. O desenvolvimento do verificador de Circus torna poss´ıvel sua integra¸ca˜o com as demais ferramentas da linguagem j´a desenvolvidas ou em fase de desenvolvimento. No entanto, ´e de nosso interesse fazer com que o verificador ofere¸ca recursos adicionas `as.

(29) ˜ 1.4 ESTRUTURA DA DISSERTAC ¸ AO. 7. ferramentas de Circus, e n˜ao apenas retorne sucesso ou erro no final de uma verifica¸ca˜o. Para tal, o nosso prop´osito ´e fazer com que o verificador disponibilize informa¸c˜oes de tipos de cada fragmento da especifica¸c˜ao ou programa passado para an´alise. Com tais informa¸c˜oes, as ferramentas de Circus podem acessar os tipos de fragmentos de uma especifica¸ca˜o que foi analisada sem precisar implementar recursos adicionais para capturar estas informa¸co˜es. Adicionalmente, ´e de nosso interesse fazer com que o verificador, no caso de encontrar erros de tipos, apresente mensagens claras, objetivas e precisas dos erros capturados. ´ nosso objetivo tamb´em desenvolver o verificador como um componente de f´acil inE tegra¸c˜ao com as demais ferramentas de Circus. Para tal, decidimos pela implementa¸ca˜o do verificador utilizando o padr˜ao de projeto visitor e o framework do CZT [37, 39], que consiste em um projeto para o desenvolvimento estruturado de ferramentas de Z e de suas extens˜oes. Al´em do verificador, outras ferramentas de Circus tamb´em foram implementadas utilizando este framework, tais como o verificador de modelos [19] e JCircus, um tradutor de Circus para Java [18]. Um outro objetivo ´e projetar o verificador de forma que seja poss´ıvel sua f´acil manuten¸c˜ao e futuras extens˜oes para eventuais evolu¸c˜oes da linguagem Circus. Para tal, seguiremos um processo de desenvolvimento, passando pelas fases de an´alise, projeto, implementa¸c˜ao e testes. Documenta¸ca˜o apropriada tanto no n´ıvel de projeto quanto de c´odigo ´e fundamental; em particular, utilizamos diagramas e artefatos UML. A decis˜ao de projeto de utilizar o padr˜ao visitor e o framework do CZT tamb´em contribuir´a para a manuten¸c˜ao ou evolu¸c˜ao do verificador sem impacto nas demais ferramentas. Isto, sem d´ uvida, ´e de grande importˆancia para o desenvolvimento conjunto de ferramentas para Circus. Com o intuito de validar o verificador de tipos de Circus, elaboramos testes e realizamos integra¸co˜es com outras ferramentas da linguagem, com o objetivo de detectar poss´ıveis falhas e melhorias na implementa¸ca˜o do verificador. Dentre as integra¸c˜oes a realizar, escolhemos a ferramenta JCircus, que j´a se encontra desenvolvida, e propomos uma implementa¸c˜ao inicial da ferramenta de refinamentos de Circus, chamada CircusRefine. A necessidade de desenvolvimento desta ferramenta surgiu devido ao fato de ainda n˜ao existirem ferramentas suficientes de Circus em um est´agio adequado para a integra¸ca˜o. Pretendemos, com o desenvolvimento de CircusRefine, validar a utilidade do verificador de tipos e apresentar uma proposta inicial de uma ferramenta u ´til para o refinamento de especifica¸co˜es da linguagem. Enfim, nosso objetivo principal ´e a execu¸ca˜o do trabalho cient´ıfico e tecnol´ogico necess´ario para resolver o problema de verifica¸c˜ao de tipos de especifica¸c˜oes e programas em Circus. Assim, contribu´ımos para o desenvolvimento de outras ferramentas da linguagem.. 1.4. Estrutura da Disserta¸c˜ ao. Al´em deste cap´ıtulo introdut´orio, este documento ´e composto de outros cinco cap´ıtulos e trˆes apˆendices. No Cap´ıtulo 2, descrevemos a linguagem formal Circus, apresentamos sua sintaxe.

(30) 8. ˜ INTRODUC ¸ AO. e exibimos um estudo de caso. Neste estudo de caso apresentamos uma especifica¸c˜ao abstrata de um sistema de controle de cart˜oes, o SmartCard, e sugerimos um refinamento apresentando uma especifica¸c˜ao concreta do sistema. No Cap´ıtulo 3, apresentamos a formaliza¸ca˜o de um sistema de tipos para a linguagem Circus, onde descrevemos o ambiente de tipos da linguagem, destacando os registros que guardam informa¸co˜es sobre os tipos, e apresentamos as regras de tipo para cada estrutura sint´atica de Circus. Ainda neste cap´ıtulo mostramos as associa¸c˜oes entre as regras de tipos de Circus e as regras de tipos de Z. No Cap´ıtulo 4, apresentamos o projeto do verificador de tipos de Circus, onde discutimos as estrat´egias de desenvolvimento, o framework utilizado, e apresentamos um exemplo de comportamento do verificador. O sistema de tipos definido no Cap´ıtulo 3, com as regras de tipos elaboradas, foi mapeado em c´odigo, resultando no verificador de tipos apresentado. No Cap´ıtulo 5, discutimos as estrat´egias de valida¸ca˜o do verificador de tipos desenvolvido e descrevemos os testes e as integra¸co˜es realizadas com o verificador. Adicionalmente, apresentamos CircusRefine, uma ferramenta de refinamentos para Circus que foi desenvolvida especialmente para integra¸ca˜o com o verificador. Finalmente, no Cap´ıtulo 6, fazemos considera¸c˜oes gerais sobre o trabalho realizado, discutimos em detalhe alguns trabalhos relacionados, e descrevemos algumas propostas de trabalhos futuros. Este documento possui quatro apˆendices. A sintaxe completa da linguagem Circus ´e apresentada no Apˆendice A. O Apˆendice B lista e define todas as fun¸co˜es usadas na defini¸c˜ao das regras de tipos de Circus. O Apˆendice C lista todas as regras de tipos definidas neste trabalho. Finalmente, o Apˆendice D exibe diagramas que ilustram a estrutura do padr˜ao de projeto visitor..

(31) CAP´ITULO 2. Circus Neste cap´ıtulo, descrevemos a linguagem Circus. Na Se¸c˜ao 2.1, apresentamos um breve hist´orico da linguagem. Uma descri¸c˜ao informal da sua sintaxe pode ser encontrada na Se¸c˜ao 2.2. Na Se¸c˜ao 2.3, apresentamos um exemplo de especifica¸ca˜o de um sistema real com a linguagem Circus. Finalmente, na Se¸c˜ao 2.4, fazemos algumas considera¸co˜es finais sobre a linguagem.. 2.1. Hist´ orico. Circus (Concurrent Integrated Refinement CalculUS) [67, 68] ´e uma linguagem de especifica¸c˜ao, projeto e programa¸c˜ao que combina outras duas linguagens: Z [57, 66], que possibilita a especifica¸ca˜o de estruturas de dados complexas; e CSP [25], que ´e uma ´algebra de processos que suporta a modelagem de comunica¸ca˜o e concorrˆencia. Adicionalmente, Circus engloba alguns construtores do c´alculo de refinamentos de Morgan [40] e os construtores da linguagem de comandos guardados de Dijkstra [13]. Os objetivos principais do projeto de Circus s˜ao: facilidade de uso para usu´arios acostumados com Z e CSP, especifica¸ca˜o e projeto, baseado em refinamento, de sistemas concorrentes e distribu´ıdos envolvendo estruturas de dados complexas, e a possibilidade de reuso de teorias, t´ecnicas e m´etodos j´a existentes. A semˆantica de Circus ´e baseada na Unifying Theories of Programming [26]. A linguagem Z ´e amplamente utilizada na descri¸ca˜o de sistemas seq¨ uenciais, mas n˜ao consegue expressar concorrˆencia diretamente. Existem alguns trabalhos que definem conven¸co˜es para definir concorrˆencia em Z. O resultado, no entanto, ´e artificial porque a linguagem n˜ao oferece construtores apropriados. J´a CSP (Communicating Sequential Processes) ´e uma linguagem de especifica¸ca˜o pr´opria para sistemas concorrentes, pois ela enfatiza a ordem em que as opera¸co˜es dos sistemas podem ser executadas. No entanto, CSP n˜ao tem facilidades para defini¸ca˜o de estruturas de dados e opera¸c˜oes associadas mais complexas. Os dados s˜ao tratados em CSP como parˆametros de processos e manipulados usando uma linguagem funcional. O objetivo ao se integrar uma linguagem formal para especifica¸c˜ao e modelagem de dados com uma ´algebra de processos ´e justamente agregar as principais caracter´ısticas destas linguagens, possibilitando uma modelagem mais adequada e ampla de sistemas. Diversos outros trabalhos se prop˜oem a integrar Z, ou uma de suas extens˜oes, com alguma ´algebra de processos. A linguagem CSP-Z [16] tem a mesma proposta de Circus ao utilizar CSP para descrever aspectos dinˆamicos de um sistema e Z para especificar a parte de dados. No entanto, diferentemente de Circus, em CSP-Z existe a separa¸c˜ao clara da parte de dados e da parte de controle. O processo de nome main define a ordem de execu¸c˜ao das opera¸co˜es, usando 9.

(32) 10. CIRCUS. CSP, e a parte Z consiste de esquemas que definem o espa¸co de estado local, o estado inicial, e as opera¸co˜es para os canais. Para cada evento E, utilizado na parte CSP, existe um esquema de nome com E que define as atualiza¸co˜es nas vari´aveis de estado do sistema quando o evento ocorre. A id´eia semˆantica desta linguagem ´e que o processo main e a parte Z s˜ao executadas em paralelo. Toda comunica¸c˜ao do sistema afeta ambas as partes. J´a em [49], ´e dada uma tradu¸c˜ao informal de especifica¸co˜es Z para CSP. A id´eia apresentada ´e a separa¸c˜ao de cada opera¸ca˜o de Z em duas partes, sendo uma que trata dos parˆametros de entrada e a outra que trata dos parˆametros de sa´ıda, e a associa¸c˜ao de uma a¸c˜ao para cada parte. Depois da separa¸ca˜o, as a¸co˜es criadas podem ser colocadas em um processo do framework de CSP. A combina¸ca˜o de CSP e Object-Z, uma extens˜ao orientada a objetos de Z, ´e apresentada em [17, 42]. Este trabalho segue a mesma linha de CSP-Z [16]. A id´eia da integra¸c˜ao ´e definir a semˆantica dinˆamica de uma classe de Object-Z utilizando o modelo semˆantico de CSP. A linguagem resultante, CSP-OZ, estende Object-Z com a no¸c˜ao de canais de comunica¸ca˜o e a sintaxe de CSP. Em [17], ´e apresentada a sintaxe e semˆantica da linguagem CSP-OZ. J´a em [42], ´e investigada a no¸c˜ao de heran¸ca da linguagem. O Real-Time Object-Z [55] ´e uma integra¸ca˜o da linguagem de especifica¸ca˜o formal Object-Z com a nota¸c˜ao de tempo para modelagem de vari´aveis cont´ınuas e de restri¸c˜oes de tempo real. O trabalho apresentado em [56] descreve o acr´escimo da habilidade do Real-Time Object-Z para especificar sistemas concorrentes de tempo real pela integra¸c˜ao semˆantica desta linguagem com a ´algebra de processos CSP. Esta integra¸ca˜o se baseia em trabalhos j´a existentes que integram o Object-Z padr˜ao com CSP [17, 42]. TCOZ [34, 33, 35] ´e uma linguagem que se prop˜oe a modelar os aspectos de estado e de processo de sistemas complexos incluindo as primitivas de tempo e suportando a modelagem de concorrˆencia m´ ultipla. A linguagem ´e resultante da combina¸ca˜o de ObjectZ, que serve para modelagem de algoritmos e dados complexos, e Timed CSP, que ´e uma extens˜ao da ´algebra de processos CSP adicionando-se as primitivas para modelagem de tempo real, tais como delay e timeout. Os trabalhos em [34, 33] apresentam a sintaxe concreta de TCOZ e suas produ¸c˜oes, al´em de definir as extens˜oes das opera¸co˜es e classes de Object-Z para suportar a integra¸ca˜o. J´a em [35], ´e apresentada a sintaxe abstrata e a semˆantica de TCOZ, mas n˜ao s˜ao discutidos os aspectos semˆanticos de referˆencias a objetos e nem o refinamento de dados. Em [27], ´e apresentada uma combina¸ca˜o das t´ecnicas formais para especifica¸c˜ao de processos (CSP), dados (Object-Z) e tempo (Duration Calculus [71]), resultando no CSPOZ-DC. Este trabalho estende CSP-OZ com aspectos de tempo real cont´ınuo. Tamb´em s˜ao apresentados os construtores de CSP-OZ-DC, a semˆantica da combina¸ca˜o, e ´e ilustrado um exemplo de aplica¸c˜ao. A integra¸c˜ao de Z com uma ´algebra de processos diferente de CSP ´e apresentada em [59]. A ´algebra de processos escolhida ´e o value-passing CCS, que permite a passagem de valores entre processos para especificar sistemas concorrentes. Adicionalmente, em [20], ´e apresentado o estilo e a sintaxe da linguagem resultante, ZCCS, ´e descrito um pequeno exemplo de especifica¸ca˜o, e ´e apresentada a semˆantica operacional da linguagem. Em [4, 3], ´e mostrado como o m´etodo B pode ser usado para projetar sistemas distribu´ıdos inserindo sistemas de a¸co˜es dentro deste m´etodo. No entanto, em [4], ´e dada.

(33) ˜ INFORMAL DA SINTAXE 2.2 DESCRIC ¸ AO. 11. uma vis˜ao baseada em eventos do sistema de a¸co˜es. Neste trabalho, ´e utilizada a t´ecnica de CSP para os sistemas de a¸c˜oes para permitir que as intera¸co˜es entre os subsistemas sejam realizadas pela passagem de mensagens sincronizadas e sem compartilhamento de dados. J´a em [3], ´e considerada uma vis˜ao baseada no estado do sistema de a¸c˜oes. Este trabalho mostra como sistemas de a¸co˜es podem ser transformados em m´aquinas abstratas dentro do m´etodo B e s˜ao comparadas as no¸co˜es de refinamento de sistemas de a¸co˜es e de B. Em [5], ´e apresentada uma ferramenta que gera especifica¸co˜es em B a partir da descri¸c˜ao de um sistema em CSP, o csp2B. No entanto, csp2B n˜ao suporta o operador de escolha interna de CSP e possui restri¸c˜oes no suporte aos operadores de composi¸ca˜o paralela e interleaving. O trabalho em [5] apresenta tamb´em uma justificativa baseada em semˆantica operacional para a forma em que ´e feita a tradu¸c˜ao de CSP para B. Uma combina¸ca˜o de CSP com B ´e apresentada em [62, 51]. Em [62], ´e proposta a defini¸c˜ao de um processo de CSP para agir como um controlador e seus eventos servirem como guias para as opera¸co˜es das m´aquinas de B. Tamb´em ´e apresentada a consistˆencia entre CSP e B em termos dos seus modelos semˆanticos existentes. J´a em [51], ´e descrita uma forma de usar a ´algebra de processos CSP para permitir a intera¸ca˜o controlada entre m´aquinas B concorrentes. Diferentemente do trabalho apresentado em [62], que se concentra em um u ´nico processo controlador encapsulando um u ´nico fluxo de controle para uma m´aquina B, o trabalho em [51] considera como uma cole¸ca˜o de combina¸c˜oes de m´aquinas B com seus controladores podem interagir. Por fim, o trabalho apresentado em [63] foca em um estudo de caso que aplica as t´ecnicas descritas em [62, 51]. Os resultados definem um framework te´orico para especifica¸c˜ao combinada usando CSP e B. Um ponto forte de Circus, que a torna diferente de muitas outras propostas de linguagens que integram Z (ou uma de suas extens˜oes) com uma ´algebra de processos, ´e que ela inclui um c´alculo de refinamentos, o que permite que a partir de uma especifica¸c˜ao abstrata da linguagem se chegue a c´odigo. Em Circus n˜ao existe a separa¸ca˜o expl´ıcita da parte de dados e a parte comportamental. Os construtores de Z e CSP podem ser usados livremente dentro de uma especifica¸ca˜o e sem uma ordena¸ca˜o pr´e-estabelecida. Isto a torna mais pr´oxima de uma linguagem de programa¸c˜ao. Desde sua cria¸ca˜o, Circus vem passando por evolu¸c˜oes: desde a defini¸c˜ao de sua sintaxe e semˆantica [68, 46], at´e a defini¸ca˜o de suas estrat´egias de refinamento [10, 11] e defini¸co˜es de regras que traduzem programas escritos em Circus para Java [18, 44]. Atualmente, o grupo de pesquisa de Circus vem trabalhando na extens˜ao da linguagem e na elabora¸ca˜o de ferramentas que automatizem seu uso. O que se espera, no futuro, ´e integrar todas as ferramentas e us´a-las para o desenvolvimento de programas a partir de especifica¸co˜es abstratas de Circus.. 2.2. Descri¸c˜ ao Informal da Sintaxe. Nesta se¸ca˜o, n´os apresentamos uma descri¸ca˜o informal de Circus e sua sintaxe. Uma descri¸c˜ao completa da sintaxe abstrata se encontra no Apˆendice A; a semˆantica formal da linguagem foi descrita inicialmente em [68], e mais recentemente em [46]. Um programa de Circus ´e formado por uma lista de par´agrafos, onde cada par´agrafo pode ser um par´agrafo Z, uma defini¸ca˜o de canal, uma defini¸ca˜o de conjunto de canais,.

(34) 12. CIRCUS. ou uma defini¸c˜ao de processo. Program. ::= CircusParagraph∗. CircusParagraph ::= Paragraph | channel CDeclaration | chanset N == CSExpression | ProcessDeclaration A lista de par´agrafos pode ser vazia. 2.2.1. Par´ agrafos de Circus. Um par´agrafo de Circus, definido como um par´agrafo Z, permite a defini¸ca˜o de constantes e tipos globais. Para exemplificar alguns construtores de Circus, vamos especificar uma m´aquina de biscoitos. Esta m´aquina vai acumulando o valor at´e chegar no total do pre¸co do biscoito (podendo ultrapassar o valor). Quando chegar no valor do biscoito, ´e enviada uma mensagem de sucesso e o pre¸co do biscoito ´e decrementado do valor depositado. No caso de sobrar dinheiro, a m´aquina retorna o troco. Os primeiros par´agrafos desta especifica¸ca˜o s˜ao apresentados abaixo. cookieValue, cookieQuantity : N COOKIE ::= ok | notok O primeiro par´agrafo Z define as constantes globais cookieValue, que representa o pre¸co do biscoito; e cookieQuantity, que representa a quantidade de biscoitos contida na m´aquina. J´a o segundo par´agrafo Z define um tipo livre COOKIE que cont´em os valores ok e notok . Tais nomes, uma vez definidos, podem ser usados na especifica¸ca˜o como constantes e tipos globais, respectivamente. CDeclaration. ::= SimpleCDeclaration | SimpleCDeclaration; CDeclaration. SimpleCDeclaration ::= N+ | N+ : Expression | [N+ ] N+ : Expression Os canais s˜ao as interfaces entre o sistema e o ambiente externo. Um canal pode comunicar valores ou n˜ao. Quando um canal n˜ao comunica valores, dizemos que ele ´e de sincroniza¸c˜ao. Para defini¸c˜ao de um canal, utilizamos a palavra-chave channel, seguida pelo nome do canal e pelo tipo dos valores que ele comunica. No caso de um canal de sincroniza¸c˜ao, este tipo ´e omitido. No exemplo a seguir, definimos os canais in e change que podem transportar n´ umeros naturais; e um canal out que transporta valores do tipo.

(35) ˜ INFORMAL DA SINTAXE 2.2 DESCRIC ¸ AO. 13. COOKIE , isto ´e, os valores ok e notok .. channel in, change : N channel out : COOKIE. Adicionalmente, Circus permite a defini¸c˜ao de canais gen´ericos. Um canal gen´erico pode comunicar valores de diversos tipos, dependendo de sua instancia¸ca˜o. Para exemplificar, vamos considerar a seguinte declara¸ca˜o de canal gen´erico: channel [X ]chan : X . Se a instancia¸c˜ao do canal for chan[N], os valores que este canal comunica devem ser do tipo natural. Desta forma, um canal gen´erico s´o pode comunicar valores se ele for previamente instanciado. Um detalhe importante ´e que um canal em Circus s´o ´e classificado como gen´erico se o tipo dele for composto por pelo menos um de seus parˆametros gen´ericos. No caso da declara¸ca˜o de um canal ser channel [X ]chan : N, apesar do formato da declara¸c˜ao permitir a introdu¸ca˜o de canais gen´ericos, chan n˜ao ´e gen´erico, pois seu tipo n˜ao envolve o parˆametro X . N´os podemos introduzir tamb´em conjuntos de nomes de canais, desde que estes j´a tenham sido declarados. A defini¸c˜ao de um conjunto de canais ´e feita atrav´es da palavrachave chanset, seguida pelo nome do conjunto e pela express˜ao que determina os canais que constituem o conjunto. A express˜ao de conjunto de canais pode ser um conjunto vazio, representado por {| |}; um conjunto enumerado, como por exemplo {| in, out |}; uma referˆencia a outro conjunto de canais; ou uma combina¸ca˜o de express˜oes de conjuntos de canais, utilizando os operadores de intersec¸c˜ao, uni˜ao e diferen¸ca de conjuntos. Finalmente, um par´agrafo de Circus pode definir um processo.. ProcessDeclaration::=process N = b ProcessDefinition | process N[N+ ] = b ProcessDefinition. Uma declara¸ca˜o de processo ´e composta pela palavra-chave process, seguida pelo nome e pela defini¸c˜ao do processo. No caso de um processo gen´erico, ap´os o nome do processo, listamos os parˆametros gen´ericos dele. 2.2.2. Processos. Um processo pode ser parametrizado ou indexado. Nos dois casos, ´e necess´aria a defini¸ca˜o dos parˆametros ou ´ındices do processo, e isto ´e feito atrav´es de uma declara¸ca˜o como em Z. No caso de um processo parametrizado, ap´os a declara¸ca˜o dos parˆametros, utilizamos o s´ımbolo • seguido pelo corpo do processo; e no caso do processo indexado, usamos o s´ımbolo ¯. Um processo n˜ao parametrizado e n˜ao indexado n˜ao requer uma declara¸ca˜o antes da defini¸ca˜o do processo em si..

Referências

Documentos relacionados

Conforme a Máquina do Esporte havia calculado, ao mandar o jogo para o Pacaembu, o Bragantino pre- cisaria colocar pelo menos 20 mil torcedores para faturar mais do que no duelo

de lavagem da cana Interna Contato com água Concreto Ambiente C Caixa de vinho Externa Exposição atmosfrica Aço carbono 80ºC A Caixa de vinho Interna Contato com

Passatempo de selfies (photoboot) + 20% e desconto a todos os clientes em artigos da nova coleção..

Diversidade sexual na escola: currículo e prática pedagógica / Alexandre Bortolini ; orientadora: Vera Maria Candau.. Candau,

debêntures realizadas no período, bem como aquisições e vendas de debêntures efetuadas pela Emissora: (Artigo 12, alínea e, inciso XVII da Instrução CVM 28/83). •

Atente-se aos exercícios explicativos de cada conteúdo desenvolvido nas aulas on-line, bem como as atividades semanais e/ou quinzenais do caderno!!..

 Iguatemi São Paulo: As Receitas de Aluguéis cresceram 8,5% principalmente por um Aluguel Mínimo maior, devido a.. reajuste

• O aluno que não for aprovado na prova final, deverá fazer a recuperação final com conteúdo relacionado à matéria do 2º semestre, onde todas as