Extração de Modelos Comportamentais de Programas ... - PUC-Rio

Extração de Modelos Comportamentais de Programas ... - PUC-Rio Extração de Modelos Comportamentais de Programas ... - PUC-Rio

di.inf.puc.rio.br
from di.inf.puc.rio.br More from this publisher
17.04.2013 Views

Extração de Modelos Comportamentais de Programas Java Concorrentes Anotados Aluno: Elthon Allex da Silva Oliveira 1 Orientadores: Jorge César Abrantes de Figueiredo 1 e Dalton Dario Serey Guerrero 1 1 Grupo de Métodos Formais – GMF Coordenação de Pós-Graduação em Informática – COPIN Departamento de Sistemas e Computação – Universidade Federal de Campina Grande Av. Aprígio Veloso, 882, Caixa Postal: 10.106, CEP: 58.109-970, Campina Grande-PB {elthon,abrantes,dalton}@dsc.ufcg.edu.br Nível: Mestrado Ano de Ingresso: 2004 Previsão de Conclusão: Março de 2006 Aprovação da proposta:17/12/2004 Resumo. Um dos problemas encontrados na aplicação de técnicas de modelchecking, para a verificação de programas Java multi-thread, é a dificuldade em produzir e manter os modelos comportamentais. Uma possível solução é desenvolver técnicas para gerar automaticamente esses modelos a partir do código. Tais técnicas, contudo, tendem a produzir modelos não suficientemente abstratos, levando assim ao problema da explosão do espaço de estados, o que torna estas técnicas impraticáveis devido à quantidade de memória exigida. Como solução para este problema, neste trabalho é apresentada uma técnica que faz uso de anotações de código escritas junto ao código Java. Através destas anotações, são inseridas informações que expressam o comportamento esperado do código. Tais informações são usadas para gerar modelos formais mais abstratos de acordo com a necessidade do usuário da técnica. Palavras-chave: Verificação de software, modelagem formal, linguagem de anotação de código, Java multi-thread.

<strong>Extração</strong> <strong>de</strong> Mo<strong>de</strong>los <strong>Comportamentais</strong> <strong>de</strong> <strong>Programas</strong> Java<br />

Concorrentes Anotados<br />

Aluno: Elthon Allex da Silva Oliveira 1<br />

Orientadores: Jorge César Abrantes <strong>de</strong> Figueiredo 1<br />

e Dalton Dario Serey Guerrero 1<br />

1 Grupo <strong>de</strong> Métodos Formais – GMF<br />

Coor<strong>de</strong>nação <strong>de</strong> Pós-Graduação em Informática – COPIN<br />

Departamento <strong>de</strong> Sistemas e Computação – Universida<strong>de</strong> Fe<strong>de</strong>ral <strong>de</strong> Campina Gran<strong>de</strong><br />

Av. Aprígio Veloso, 882, Caixa Postal: 10.106, CEP: 58.109-970, Campina Gran<strong>de</strong>-PB<br />

{elthon,abrantes,dalton}@dsc.ufcg.edu.br<br />

Nível: Mestrado<br />

Ano <strong>de</strong> Ingresso: 2004<br />

Previsão <strong>de</strong> Conclusão: Março <strong>de</strong> 2006<br />

Aprovação da proposta:17/12/2004<br />

Resumo. Um dos problemas encontrados na aplicação <strong>de</strong> técnicas <strong>de</strong> mo<strong>de</strong>lchecking,<br />

para a verificação <strong>de</strong> programas Java multi-thread, é a dificulda<strong>de</strong><br />

em produzir e manter os mo<strong>de</strong>los comportamentais. Uma possível solução é<br />

<strong>de</strong>senvolver técnicas para gerar automaticamente esses mo<strong>de</strong>los a partir do<br />

código. Tais técnicas, contudo, ten<strong>de</strong>m a produzir mo<strong>de</strong>los não suficientemente<br />

abstratos, levando assim ao problema da explosão do espaço <strong>de</strong> estados, o que<br />

torna estas técnicas impraticáveis <strong>de</strong>vido à quantida<strong>de</strong> <strong>de</strong> memória exigida.<br />

Como solução para este problema, neste trabalho é apresentada uma técnica<br />

que faz uso <strong>de</strong> anotações <strong>de</strong> código escritas junto ao código Java. Através<br />

<strong>de</strong>stas anotações, são inseridas informações que expressam o comportamento<br />

esperado do código. Tais informações são usadas para gerar mo<strong>de</strong>los formais<br />

mais abstratos <strong>de</strong> acordo com a necessida<strong>de</strong> do usuário da técnica.<br />

Palavras-chave: Verificação <strong>de</strong> software, mo<strong>de</strong>lagem formal, linguagem <strong>de</strong><br />

anotação <strong>de</strong> código, Java multi-thread.


1. Caracterização do problema<br />

1.1. Introdução<br />

Com o objetivo <strong>de</strong> <strong>de</strong>tectar a presença <strong>de</strong> erros em sistemas <strong>de</strong> manufatura, protocolos <strong>de</strong><br />

comunicação e também sistemas <strong>de</strong> software, concorrentes ou não, diversas linguagens<br />

<strong>de</strong> mo<strong>de</strong>lagem formal foram criadas. Dentre elas, po<strong>de</strong>mos citar CSP [Hoare 1985], re<strong>de</strong>s<br />

<strong>de</strong> Petri [Jensen 1997] e Promela [Holzmann 1997]. Entretanto, existem alguns problemas<br />

que dificultam bastante o uso <strong>de</strong>stas linguagens <strong>de</strong> mo<strong>de</strong>lagem <strong>de</strong> forma vasta no<br />

<strong>de</strong>senvolvimento <strong>de</strong> software:<br />

1. Necessida<strong>de</strong> <strong>de</strong> um profissional conhecedor da linguagem, o que implica em custos<br />

maiores e torna o uso da técnica inviável em diversos projetos <strong>de</strong> <strong>de</strong>senvolvimento.<br />

Haveria também a possibilida<strong>de</strong> <strong>de</strong> os próprios programadores se especializarem<br />

em uma das linguagens, mas o tempo gasto por eles na fase <strong>de</strong> mo<strong>de</strong>lagem<br />

seria bastante <strong>de</strong>smotivador.<br />

2. Hoje em dia, a adoção <strong>de</strong> processos ágeis, como por exemplo<br />

XP [Jeffries et al. 2000], no <strong>de</strong>senvolvimento <strong>de</strong> software tem proporcionado<br />

uma gran<strong>de</strong> velocida<strong>de</strong> na entrega dos resultados, o que provoca muitas iterações<br />

no ciclo <strong>de</strong> criação do software. Isto acarreta um processo constante <strong>de</strong> evolução<br />

do software. Este processo <strong>de</strong> evolução faz com que haja uma gran<strong>de</strong> dificulda<strong>de</strong><br />

<strong>de</strong> se manter o mo<strong>de</strong>lo formal atualizado em relação ao programa mo<strong>de</strong>lado.<br />

3. Existência <strong>de</strong> uma gran<strong>de</strong> lacuna entre o mo<strong>de</strong>lo formal do programa e este último,<br />

pois há sempre a dúvida <strong>de</strong> como garantir que o mo<strong>de</strong>lo formal expressa correta e<br />

inteiramente o comportamento esperado pelo programa, e vice-versa.<br />

4. Por último, programas com múltiplas linhas <strong>de</strong> execução são bastante difíceis <strong>de</strong><br />

se acompanhar a execução. Nestes tipos <strong>de</strong> programas, a <strong>de</strong>tecção <strong>de</strong> erros exige<br />

muito tempo e muita atenção, pois a intercalação entre as linhas <strong>de</strong> execução existentes<br />

gera inúmeras seqüências possíveis. Isto gera a necessida<strong>de</strong> <strong>de</strong> um suporte<br />

ferramental que <strong>de</strong> alguma forma, automatize o processo <strong>de</strong> verificação <strong>de</strong>ste tipo<br />

<strong>de</strong> programa, pelo menos no que se refere a parte <strong>de</strong> intercalação.<br />

Com base nos problemas apresentados, po<strong>de</strong>-se ver que a automação <strong>de</strong> algumas<br />

etapas do processo <strong>de</strong> verificação formal, po<strong>de</strong>ria contribuir para a inserção <strong>de</strong>sta última<br />

no processo <strong>de</strong> <strong>de</strong>senvolvimento das metodologias ágeis.<br />

1.2. Objetivo<br />

Visto que há uma dificulda<strong>de</strong> em se usar métodos formais nos processos <strong>de</strong> <strong>de</strong>senvolvimento<br />

<strong>de</strong> software, faz-se necessária a construção <strong>de</strong> técnicas e ferramentas que possam<br />

“escon<strong>de</strong>r”, do <strong>de</strong>senvolvedor, o método formal empregado na verificação formal <strong>de</strong> software.<br />

O objetivo <strong>de</strong>ste trabalho é construir uma ferramenta que seja capaz <strong>de</strong> fazer<br />

verificação formal em programas Java concorrentes ou não. Além disso, ela possibilitará<br />

ao usuário <strong>de</strong>finir o nível <strong>de</strong> abstração a ser empregado na verificação <strong>de</strong> seu programa.<br />

Tal ferramenta não exigirá conhecimento algum sobre métodos formais. Ela exigirá apenas<br />

capacida<strong>de</strong>, por parte do usuário, <strong>de</strong> <strong>de</strong>screver o comportamento <strong>de</strong> seu próprio código<br />

usando a linguagem <strong>de</strong> anotação <strong>de</strong>finida neste trabalho. Como um dos propósitos do<br />

trabalho é facilitar o uso <strong>de</strong> mo<strong>de</strong>l checking no <strong>de</strong>senvolvimento <strong>de</strong> software, a ferramenta<br />

será implementada na forma <strong>de</strong> um plugin (<strong>de</strong>talhes sobre o plugin serão omitidos


Figura 1. Espaços <strong>de</strong> estados gerados a partir <strong>de</strong> códigos Java e Java anotados.<br />

neste artigo <strong>de</strong>vido a restrições <strong>de</strong> espaço) do Eclipse [Eclipse Foundation 2005]. O plugin<br />

gerará mo<strong>de</strong>los (abstrações do comportamento do programa) diretamente a partir do<br />

código Java e das anotações feitas neste código.<br />

Com o intuito <strong>de</strong> prover ao usuário po<strong>de</strong>res <strong>de</strong> <strong>de</strong>cisão sobre o nível <strong>de</strong> abstração<br />

do mo<strong>de</strong>lo, é <strong>de</strong>finida uma linguagem <strong>de</strong> anotação <strong>de</strong> código, capaz <strong>de</strong> mo<strong>de</strong>lar aspectos<br />

relevantes <strong>de</strong> Java concorrente. Esta linguagem <strong>de</strong> anotação servirá como uma linguagem,<br />

semelhante a Java, <strong>de</strong> <strong>de</strong>scrição comportamental do programa a verificar. Assim,<br />

o usuário po<strong>de</strong>rá <strong>de</strong>terminar o nível <strong>de</strong> abstração na qual <strong>de</strong>seje que a verificação<br />

atue. Na Figura 1, po<strong>de</strong>-se ter uma idéia do efeito causado pela presença das anotações.<br />

O código anotado é <strong>de</strong>sprezado e somente as anotações são consi<strong>de</strong>radas. A verificação<br />

será feita por alguma ferramenta (verificador <strong>de</strong> mo<strong>de</strong>los) que suporte a linguagem formal<br />

escolhida como linguagem alvo.<br />

2. Fundamentação teórica<br />

Cada vez mais a programação concorrente vêm sendo usada com o propósito <strong>de</strong> aumentar<br />

o <strong>de</strong>sempenho <strong>de</strong> alguns programas <strong>de</strong>senvolvidos. Este tipo <strong>de</strong> programação faz<br />

uso <strong>de</strong> múltiplas linhas <strong>de</strong> execução (multi-thread), ao invés <strong>de</strong> apenas uma como na<br />

programação seqüencial, num único processo. O uso <strong>de</strong> múltiplas linhas <strong>de</strong> execução traz<br />

alguns benefícios:<br />

• Capacida<strong>de</strong> <strong>de</strong> resposta: parte da aplicação po<strong>de</strong> continuar executando enquanto<br />

outra seção está bloqueada ou executando uma operação <strong>de</strong>morada.<br />

• Compartilhamento <strong>de</strong> recursos: As linhas <strong>de</strong> execução <strong>de</strong> um mesmo processo<br />

tem acesso à memória e aos recursos do processo.<br />

• Economia: É mais <strong>de</strong>morado e mais dispendioso criar um novo processo do que<br />

uma nova linha <strong>de</strong> execução.<br />

• Utilização <strong>de</strong> arquiteturas com múltiplos processadores: em sistemas com um<br />

único processador, apenas um processo (ou mesmo uma linha <strong>de</strong> execução) po<strong>de</strong><br />

ser executado por vez, embora a rápida alternância entre os processos passe a<br />

ilusão <strong>de</strong> paralelismo. Em um sistema multiprocessado, as linhas <strong>de</strong> execução,<br />

inclusive <strong>de</strong> um mesmo processo, po<strong>de</strong>m ser executados simultaneamente em diversos<br />

processadores.<br />

Para uma explicação mais <strong>de</strong>talhada sobre múltiplas linhas <strong>de</strong> execução, consultar<br />

[Tanenbaum 2001].


A linguagem <strong>de</strong> programação Java possui um bom suporte para programação concorrente.<br />

Há duas formas <strong>de</strong> se usar várias linhas <strong>de</strong> execução num mesmo processo: por<br />

meio <strong>de</strong> herança, esten<strong>de</strong>ndo a classe Thread; ou implementando a interface Runnable,<br />

on<strong>de</strong> faz-se necessário implementar o método run(). Para uma explicação mais <strong>de</strong>talhada,<br />

ver o capítulo referente a programação concorrente com múltiplas linhas <strong>de</strong> execução do<br />

livro [Eckel 2003].<br />

Verificação <strong>de</strong> mo<strong>de</strong>los Esta é uma técnica automática para analisar o espaço <strong>de</strong> estados<br />

finito <strong>de</strong> sistemas concorrentes [Clarke et al. 1996]. Tradicionalmente, a aplicação da<br />

verificação <strong>de</strong> mo<strong>de</strong>los ocorre através <strong>de</strong> três etapas: mo<strong>de</strong>lagem (construção <strong>de</strong> um mo<strong>de</strong>lo<br />

formal do sistema que contenha o comportamento do sistema), especificação dos comportamentos<br />

<strong>de</strong>sejáveis(<strong>de</strong>scrito formalmente através <strong>de</strong> lógicas temporais ou máquinas<br />

<strong>de</strong> estado), e verificação (mo<strong>de</strong>lo e especificações são submetidas ao verificador <strong>de</strong> mo<strong>de</strong>los).<br />

Na última etapa é obtida uma resposta do verificador: verda<strong>de</strong>iro (as especificações<br />

são satisfeitas pelo mo<strong>de</strong>lo) ou falso mais contra-exemplo (um trace com os passos que<br />

levam a um estado on<strong>de</strong> as especificações não são verda<strong>de</strong>iras).<br />

Como mencionado na Seção 1, o mo<strong>de</strong>lo é <strong>de</strong>scrito através <strong>de</strong> uma linguagem formal<br />

e, a partir daí, é gerado automaticamente o espaço <strong>de</strong> estados com todos os estados<br />

possíveis. O principal <strong>de</strong>safio à aplicação <strong>de</strong> verificação <strong>de</strong> mo<strong>de</strong>los em programas é o<br />

problema conhecido como explosão do espaço <strong>de</strong> estados. Em [McMillan 1993] é apresentada<br />

uma técnica para redução do espaço <strong>de</strong> estados. As proprieda<strong>de</strong>s a serem verificadas<br />

são escritas <strong>de</strong> forma manual utilizando, geralmente, alguma lógica temporal: LTL<br />

(Linear Temporal Logic) [Pnueli 1977] e CTL (Computation Tree Logic) [Sifakis 1989].<br />

Anotação <strong>de</strong> código Como forma <strong>de</strong> inserir informações extra no código dos programas,<br />

alguns trabalhos fazem uso <strong>de</strong> anotações junto ao código. Geralmente estas<br />

anotações se encontram na forma <strong>de</strong> comentários com algum caracter (e.g. @) que as<br />

preceda, indicando que são anotações. Um exemplo <strong>de</strong> anotação sem abstração alguma,<br />

no contexto <strong>de</strong>ste trabalho, para o código if(condição) x++; seria @choice{ condição: {<br />

x = x+1; } .<br />

As anotações po<strong>de</strong>m ter funcionalida<strong>de</strong>s variadas: servir apenas como<br />

documentação (e.g. Javadoc), <strong>de</strong>finir restrições (e.g. [Holmgren 2005]), proprieda<strong>de</strong>s<br />

a serem verificadas (e.g. [Robby 2000]) e também po<strong>de</strong>m servir como mo<strong>de</strong>lo do programa,<br />

como é o caso da linguagem <strong>de</strong>finida neste trabalho.<br />

3. Caracterização da contribuição<br />

Este trabalho irá aproximar ainda mais o uso da verificação formal, no <strong>de</strong>senvolvimento <strong>de</strong><br />

projetos, e os <strong>de</strong>senvolvedores, pois a extração <strong>de</strong> mo<strong>de</strong>los aqui apresentada será feita <strong>de</strong><br />

forma automática pela ferramenta a ser implementada na forma <strong>de</strong> plugin para o Eclipse.<br />

Acredita-se que sendo integrada a um ambiente <strong>de</strong> <strong>de</strong>senvolvimento já consolidado e<br />

difundido, a ferramenta terá mais chances <strong>de</strong> ser bem recebida pelo público alvo.<br />

Além disso, como a mo<strong>de</strong>lagem estará na forma <strong>de</strong> anotações semelhantes a<br />

código Java, acredita-se também que a tradicional lacuna existente entre o mo<strong>de</strong>lo formal<br />

e o programa mo<strong>de</strong>lado seja amenizada, diminuindo assim o risco <strong>de</strong> inserção <strong>de</strong><br />

características inexistentes ou omissão <strong>de</strong> características relevantes.


4. Estado atual do trabalho<br />

Algumas etapas <strong>de</strong>finidas no início do trabalho já foram concluídas. O trabalho foi inicialmente<br />

dividido em quatro etapas. A primeira, já concluída, constituiu-se <strong>de</strong> uma revisão<br />

bibliográfica para obtenção do embasamento teórico necessário: linguagens <strong>de</strong> anotação<br />

e verificadores existentes.<br />

A segunda etapa tratou da construção <strong>de</strong> um protótipo do plugin do Eclipse, capaz<br />

<strong>de</strong> mo<strong>de</strong>lar as seqüências <strong>de</strong> troca mensagens entre objetos <strong>de</strong> uma única linha <strong>de</strong><br />

execução, este protótipo não lida com programas concorrentes. A ferramenta traduz apenas<br />

as anotações para a linguagem Promela e usa o Spin [Holzmann 1997] como verificador<br />

<strong>de</strong> mo<strong>de</strong>los.<br />

Na terceira etapa foi feito um estudo sobre as características e proprieda<strong>de</strong>s da<br />

programação Java concorrente escrevendo alguns programas simples. Desta forma, a linguagem<br />

<strong>de</strong> anotação, <strong>de</strong>finida também nesta etapa, pô<strong>de</strong> contemplar a maioria das características.<br />

Um estudo comparativo entre linguagens <strong>de</strong> mo<strong>de</strong>lagem formais foi concluído.<br />

O propósito <strong>de</strong>ste estudo foi <strong>de</strong>tectar qual linguagem estaria mais apta a mo<strong>de</strong>lar programas<br />

Java concorrentes e qual possuia suporte ferramental mais apropriado, <strong>de</strong>ntro do<br />

escopo <strong>de</strong>ste trabalho.<br />

Ainda na terceira etapa, serão <strong>de</strong>finidas estratégias e/ou algoritmos para geração<br />

automática <strong>de</strong> mo<strong>de</strong>los a partir do código e anotações. Um exemplo prático foi omitido<br />

neste artigo <strong>de</strong>vido a restrições <strong>de</strong> espaço. O código do protótipo do plugin será refatorado<br />

para que suporte a nova linguagem <strong>de</strong> anotação <strong>de</strong>finida, o algoritmo <strong>de</strong> extração e a nova<br />

linguagem alvo.<br />

E por fim, na quarta e última etapa, será realizada a validação da ferramenta e<br />

técnica propostas através <strong>de</strong> um estudo <strong>de</strong> caso e <strong>de</strong> uma comparação entre os espaços<br />

<strong>de</strong> estados gerados a partir dos mo<strong>de</strong>los feitos neste trabalho e feitos em outros trabalhos<br />

existentes. Além disso, o novo plugin será implementado.<br />

5. Trabalhos relacionados (visão comparativa)<br />

Alguns trabalhos correlatos foram encontrados, uma boa parte <strong>de</strong>les ainda está em andamento.<br />

Um dos primeiros trabalhos a ser feito foi [Luckham and Henke 1984], uma<br />

extensão da linguagem ADA chamada ANNA (ANNotated Ada). Neste trabalho, as extensões<br />

apenas mo<strong>de</strong>lavam as proprieda<strong>de</strong>s e o mo<strong>de</strong>lo era extraído diretamente do código<br />

fonte.<br />

Em [Jungclaus et al. 1991] é apresentada a linguagem TROLL. Ela é utilizada<br />

na mo<strong>de</strong>lagem formal <strong>de</strong> sistemas <strong>de</strong> informação (reativos) OO. Duas <strong>de</strong>svantagens <strong>de</strong>ste<br />

trabalho são: a ausência <strong>de</strong> mo<strong>de</strong>lagem <strong>de</strong> comunicação assíncrona; e a sua aplicação <strong>de</strong>ve<br />

ser feita na fase inicial do projeto, o que inviabiliza sua utilização <strong>de</strong>ntro das metodologias<br />

ágeis, pois nelas há uma constante evolução por parte do sistema.<br />

No trabalho <strong>de</strong>scrito em [Limited 2004], há uma linguagem chamada Perfect Language<br />

que é usada na ferramenta Perfect Developer. Perfect Language é semelhante a uma<br />

linguagem <strong>de</strong> programação. Ela <strong>de</strong>screve o mo<strong>de</strong>lo e os requisitos do usuário. Uma vantagem<br />

é que boa parte do código do programa po<strong>de</strong> ser gerado a partir das especificações,<br />

contudo não suporta programas com várias linhas <strong>de</strong> execução.


E em [Robby 2000], é apresentada uma linguagem <strong>de</strong> especificação <strong>de</strong> constraints<br />

que serve para especificar proprieda<strong>de</strong>s em programas Java, como asserções e predicados.<br />

Esta linguagem faz parte do projeto Ban<strong>de</strong>ra que gera mo<strong>de</strong>los comportamentais a partir<br />

do próprio código Java. Há um plugin para o Eclipse implementado. Contudo, o usuário<br />

não consegue <strong>de</strong>finir o nível <strong>de</strong> abstração na geração do mo<strong>de</strong>lo comportamental, o que é<br />

feito no trabalho aqui apresentado.<br />

6. Validação dos resultados<br />

Espera-se validar este trabalho com uma comparação entre os mo<strong>de</strong>los obtidos a partir<br />

<strong>de</strong> nossa tradução e os mo<strong>de</strong>los obtidos a partir das traduções existentes; e um estudo <strong>de</strong><br />

caso que contemple características <strong>de</strong> concorrência relevantes, como <strong>de</strong>adlocks, livelocks,<br />

race conditions, etc. Além disso, um plugin, que implemente a técnica aqui apresentada,<br />

também será <strong>de</strong>senvolvido.<br />

Referências<br />

Clarke et al., E. M. (1996). Formal methods: State of the art and future directions. ACM<br />

Computing Surveys, 28(4):626–643.<br />

Eckel, B. (2003). Thinking in Java. Prentice Hall International, Inc., Upper Saddle River,<br />

New Jersey, USA, 3rd edition.<br />

Eclipse Foundation (2005). Eclipse.org Main Page. http://www.eclipse.org.<br />

Hoare, C. (1985). Communicating Sequential Processes. Prentice-Hall International Series<br />

in Computer Science.<br />

Holmgren, A. (2005). Using Annotations to add Validity Constraints to JavaBeans Properties.<br />

http://java.sun.com/<strong>de</strong>veloper/technicalArticles/J2SE/constraints/annotations.html.<br />

Holzmann, G. (1997). The Mo<strong>de</strong>l Checker SPIN. IEEE Transactions on Software Engineering,<br />

23(5).<br />

Jeffries, R., An<strong>de</strong>rson, A., and Hendrickson, C. (2000). Extreme Programming Installed.<br />

Addison Wesley, Boston, MA, USA.<br />

Jensen, K. (1997). Coloured Petri Nets: Basic Concepts, Analysis Methods and Practical<br />

Use, volume 2. Springer-Verlag.<br />

Jungclaus, R., Saake, G., Hartmann, T., and Sernadas, C. (1991). Object-Oriented Specification<br />

of Information Systems: The TROLL Language. Technical Report 91-04.<br />

Limited, E. T. (2004). Perfect language. http://www.eschertech.com/product documentation/.<br />

Luckham, D. and Henke, F. W. (1984). An overview of ANNA - a specification language<br />

for ADA. Technical report, Stanford University.<br />

McMillan, K. L. (1993). Symbolic Mo<strong>de</strong>l Checking: An Approach to the State Explosion<br />

Problem. Kluwer Aca<strong>de</strong>mic Publishers.<br />

Pnueli, A. (1977). The temporal logic of programs. In 18th IEEE Symposium on Foundations<br />

of Computer Science, pages 46–57.<br />

Robby (2000). Ban<strong>de</strong>ra specification language: A specification language for software<br />

mo<strong>de</strong>l checking. Master’s thesis, Kansas State University.<br />

Sifakis, J., editor (1989). Proceedings of the 1989 International Workshop on Automatic<br />

Verification Methods for Finite State Systems (CAV ’89), number 407 in lncs, Grenoble,<br />

France. Springer.<br />

Tanenbaum, A. S. (2001). Mo<strong>de</strong>rn Operating Systems. Prentice-Hall, New Jersey, London,<br />

Sydney, 2 edition. http://www.prentice-hall.com.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!