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
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.
- Page 2 and 3: 1. Caracterização do problema 1.1
- Page 4 and 5: A linguagem de programação Java p
- Page 6: E em [Robby 2000], é apresentada u
<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.