Escolar Documentos
Profissional Documentos
Cultura Documentos
Teste de Software
Assinatura:
iii
Abstract
iv
Sumário
1 Introdução 1
1.1 Motivação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Organização . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3 Mapeamento Sistemático 21
3.1 Processo para Condução de Mapeamentos Sistemáticos . . . . . . . . . . 22
3.2 Definição das Questões de Pesquisa . . . . . . . . . . . . . . . . . . . . . 22
3.3 Busca por Estudos Primários . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.4 Screening . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.5 Keywording . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.6 Categorização Resultante . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.6.1 Otimização . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.6.2 Gerenciamento de Memória Automatizado . . . . . . . . . . . . . . 29
3.6.3 Depuração . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
v
3.6.4 Tolerância a Vazamentos de Memória . . . . . . . . . . . . . . . . . 31
3.6.5 Novas Construções de Linguagens de Programação . . . . . . . . . 31
3.6.6 Profiling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.6.7 Programação Orientada a Aspectos . . . . . . . . . . . . . . . . . . 32
3.6.8 Sistemas Embarcados . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.6.9 Segurança . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.6.10Tempo Real . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.6.11Computação Distribuída . . . . . . . . . . . . . . . . . . . . . . . . 35
3.6.12Tolerância a Falhas . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.6.13Compartilhamento de Recursos entre Máquinas Virtuais . . . . . 36
3.6.14Teste de Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.7 Mapeamento dos Estudos Primários e Análise . . . . . . . . . . . . . . . . 37
3.7.1 Mapa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.8 Categorização e Classificação por meio da Ferramenta PEx . . . . . . . . 43
3.9 Ameaças à Validade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.10 Considerações Finais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4 Proposta 47
4.1 Proposta de Projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.2 Ambiente para Teste de Mutação . . . . . . . . . . . . . . . . . . . . . . . 49
4.3 Suporte para Teste de Programas Concorrentes . . . . . . . . . . . . . . . 50
4.4 Implementações Examinadas . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.5 Atividades Realizadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.6 Atividades Planejadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
4.7 Considerações Finais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
vi
Lista de Figuras
2.1 Virtualização. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2 Níveis de abstração e interfaces de um típico sistema computacional. . . 7
2.3 Visão acerca do que consiste uma máquina conforme as perspectivas de
sistema e de processo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4 Monitor de máquina virtual (a) e type 2 hypervisor (b). . . . . . . . . . . . 9
2.5 Modelo de distribuição de programas “convencional” e baseado em má-
quina virtual. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.6 Threads e seus respectivos frames associados à invocação de métodos. . 17
2.7 Formatos de instruções. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.8 Disposição da pilha de operandos após a execução das instruções da
Listagem 2.1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
vii
Lista de Tabelas
viii
Listagens
ix
CAPÍTULO
1
Introdução
1
CAPÍTULO 1. INTRODUÇÃO 2
1.1 Motivação
A principal motivação para realização do projeto em questão é que as máquinas vir-
tuais contemporâneas apresentam carência de funcionalidade que apoie a condução
de atividades de Teste de Software. Considera-se que o ambiente de execução provido
por tais máquinas virtuais é propício para ser adaptado com o propósito de se inserir
tal funcionalidade. Ademais, acredita-se que a aplicação de determinadas técnicas
de Teste de Software seria facilitada e a quantidade de ferramentas envolvidas seria
reduzida caso as máquinas virtuais provessem esse tipo de suporte.
Outro fator que motiva essa pesquisa é que pouco vem sendo explorado nesse
sentido. A maioria dos trabalhos realizados abrange o desenvolvimento de melhorias
não-funcionais a fim de aprimorar o desempenho desses ambientes de execução ou os
algoritmos do mecanismo de gerenciamento de memória automatizado, por exemplo.
Desse modo, pretende-se estudar quais funcionalidades auxiliariam a condução de
atividades de Teste de Software quando introduzidas às máquinas virtuais existentes.
Visto que máquinas virtuais Java são amplamente difundidas, pretende-se introduzir
as funcionalidades resultantes deste projeto em uma implementação dessa máquina
virtual.
1.2 Objetivos
Este projeto fundamenta-se no fato de máquinas virtuais exercem influência sobre
vários tópicos relacionados à execução dos programas. Entretanto, tal propriedade
não vêm sendo explorada no sentido de prover funcionalidades para facilitar a con-
dução de técnicas de Teste de Software. Desse modo, pretende-se pesquisar quais
funcionalidades poderiam ser introduzidas com esse intuito, determinando assim as
características e elementos estruturais desses ambientes de execução que necessitam
ser extendidos ou adicionados.
Objetiva-se também que as funcionalidades propostas sejam implementadas em
uma máquina virtual Java. Com isso, as contribuições podem ser mais apropriada-
mente avaliadas. A fim de se determinar qual implementação será utilizada, inicial-
CAPÍTULO 1. INTRODUÇÃO 3
1.3 Organização
Este trabalho, além deste capítulo, está organizado como a seguir. No Capítulo 2,
dada a variedade de máquinas virtuais, a apresentação foi organizada de acordo com
a taxonomia de Smith e Nair (2005a,b), baseada nos dois níveis de abstração em que
as máquinas virtuais atuam: sistema e processo. Assim, em tal capítulo são descri-
tos conceitos e definições tanto de máquinas virtuais em nível de sistema quanto de
processo. No entanto, são enfocadas as máquinas virtuais em nível de processo vol-
tadas para suportar linguagens de programação, visto que elas são a tecnologia alvo
da pesquisa subjacente. No Capítulo 3, é descrito o mapeamento sistemático reali-
zado com o objetivo de se obter informações sobre os tipos de aperfeiçoados que vêm
sendo pesquisados, desenvolvidos e introduzidos em máquinas virtuais de linguagem
de programação. Além disso, apresenta-se o mapa resultante, que fornece uma visão
geral das funcionalidades mais pesquisadas e das implementações empregadas. Por
fim, no Capítulo 4, descreve-se a proposta de pesquisa, resultados esperados, e o cro-
nograma destacando as atividades já realizadas e as planejadas para concretização
do projeto.
CAPÍTULO
2
Máquinas Virtuais de Linguagem de
Programação
4
CAPÍTULO 2. MÁQUINAS VIRTUAIS DE LINGUAGEM DE PROGRAMAÇÃO 5
2.1 Virtualização
Sistemas computacionais são complexos e, normalmente, consistem de vários dispo-
sitivos de hardware e sistemas de software. Adicionalmente, tais sistemas de software
são compostos de vários subsistemas que envolvem diversos tipos de elementos e es-
truturas que colaboram a fim de implementar a funcionalidade proposta. Essa com-
plexidade é abordada, considerando tanto dispositivos de hardware quanto sistemas
de software, utilizando níveis de abstração cujas colaborações são estabelecidas por
meio de interfaces bem definidas (Rosenblum, 2004; Smith e Nair, 2005b).
Por meio da separação em níveis de abstração, detalhes relacionados aos níveis
inferiores podem ser ignorados ou vistos de maneira simplificada pelos superiores,
facilitando assim o desenvolvimento desses níveis (Colburn e Shute, 2007). Usu-
almente, os níveis inferiores são implementados em hardware e os superiores em
software. A comunicação entre esses níveis é realizada por meio de interfaces pre-
viamente definidas, possibilitando que diferentes equipes, desenvolvendo para níveis
distintos, trabalhem de maneira concomitante. Alguns exemplos de interfaces pre-
sentes em sistemas computacionais são: o conjunto de instruções utilizado por uma
plataforma (instruction set architecture, ISA) e a interface de programação de aplicati-
vos (application programming interface, API) de determinado sistema operacional (SO).
Porém, a principal desvantagem de se empregar determinada interface é: componen-
tes e subsistemas desenvolvidos de acordo com a especificação de certa interface não
são compatíveis com outros orientados para interfaces distintas.
Existem processadores voltados para diferentes conjuntos de instruções, bem como
vários SOs como, por exemplo, Windows, Linux e Mac OS X. Todavia, normalmente,
essa heterogeneidade resulta em redução na interoperabilidade, devido às diferenças
entre as interfaces utilizadas. Por exemplo, aplicações, quando distribuídas como
arquivos binários, são compatíveis somente com uma plataforma que possui: (i) o
conjunto de instruções e (ii) o SO empregado durante o desenvolvimento dessas apli-
cações. Outro exemplo são os SOs, que dependem de elementos pertencentes à arqui-
tetura de hardware para qual eles foram desenvolvidos como, por exemplo, existência
de somente um processador (uniprocessor architecture) ou de memória compartilhada
e vários processadores (shared-memory multiprocessor architecture).
Virtualização (virtualization) é uma abordagem que pode ser utilizada para miti-
gar as restrições resultantes da utilização de interfaces heterogêneas. A virtualização
de um sistema computacional ou de software, subsistema, processador, dispositivo
de entrada e saída, etc., faz com que a interface desse elemento e todos os recur-
sos acessíveis a partir de tal interface sejam mapeados para a interface e recursos
do sistema real, ou seja, o sistema que realmente implementa o comportamento em
questão. Desse modo, o sistema real é transformado de forma que ele aparenta ser
CAPÍTULO 2. MÁQUINAS VIRTUAIS DE LINGUAGEM DE PROGRAMAÇÃO 6
somente por meio de invocações ao SO; usualmente, realizadas por bibliotecas que
executam como parte do processo. Desse modo, a máquina, considerando essa pers-
pectiva de processo, é o formada por uma combinação do SO e do hardware em
questão. Nesse contexto, a interface dessa máquina com o restante do sistema com-
putacional é a ABI, Figura 2.3(b).
Devido a essa ampla abrangência, máquinas virtuais são desenvolvidas por diver-
sos grupos com interesses distintos: desenvolvedores de SOs, linguagens de progra-
mação, compiladores e dispositivos de hardware. Dessa forma, a fim de organizar
a apresentação dos conceitos e detalhes de implementação relacionados aos diver-
sos tipos de máquinas virtuais, as seções seguintes são organizadas de acordo com
uma taxonomia, proposta por Smith e Nair (2005a), fundamentada em dois tipos de
máquinas virtuais: de sistema e de processo.
(a) (b)
Figura 2.3: Visão acerca do que consiste uma máquina conforme as perspectivas de
sistema (a) e de processo (b); adaptada de Smith e Nair (2005a).
(a) (b)
2.3.1 Vantagens
A utilização de máquinas virtuais de sistema apresenta várias vantagens. Algumas
dessas vantagens são descritas a seguir:
Ambientes isolados: cada máquina virtual tem um ambiente isolado das outras má-
quinas virtuais ou reais. Dessa forma, problemas causados por falhas não afe-
tam o restante do sistema computacional. Adicionalmente, essa autonomia en-
tre máquinas virtuais possibilita isolamento de desempenho, pois, o monitor de
máquina virtual assegura que os recursos requisitados por uma máquina virtual
não afetem adversamente as outras (Rosenblum e Garfinkel, 2005).
(a) (b)
Uma das primeiras máquinas virtuais que apresentou o esquema da Figura 2.5(b)
foi implementada para fornecer suporte para a linguagem Pascal, a saber: P-machine
(também conhecida como P-code machine), cujo conjunto de instruções virtuais é
denominado P-code (Nelson, 1979) e o compilador P-compiler; todos esses elemen-
tos eram coletivamente referidos como P-system (Wirth, 1993). A P-machine possui
tanto arquitetura quanto conjunto de instruções baseados em pilha. Posteriormente,
uma máquina virtual também baseada em pilha foi proposta para linguagem de pro-
gramação Smalltalk. Deutsch e Schiffman (1984) descrevem a máquina virtual para
Smalltalk, denominada ParcPlace, como a primeira máquina virtual moderna dado
CAPÍTULO 2. MÁQUINAS VIRTUAIS DE LINGUAGEM DE PROGRAMAÇÃO 15
que ela introduziu implementações para várias técnicas amplamente utilizadas atu-
almente: compilador just-in-time (JIT) e cache de código nativo (native code cache),
ambos empregados a fim de aprimorar o desempenho.
Apesar da ampla adoção dessas máquinas virtuais como ambientes de execução
para linguagens de programação, o responsável pela popularização de tal tecnolo-
gia foi o advento da plataforma Java, durante a segunda metade dos anos 90. As
principais diferenças entre a máquina virtual Java (Java virtual machine, JVM) e as
máquinas mencionadas anteriormente são o suporte para redes de computadores he-
terogêneos e a introdução de mecanismos para garantir a integridade da máquina vir-
tual nesse ambiente distribuído. Atualmente, várias linguagens de programação têm
seus ambientes de execução baseados em máquinas virtuais com arquiteturas base-
adas em pilha como, por exemplo, Python (Lutz, 2009), Ruby (Flanagan e Matsumoto,
2008), Groovy (Koenig et al., 2007), Prolog (Clocksin e Mellish, 2003) e Scheme (Dyb-
vig, 2009), ou baseadas em registradores (register-transfer model) como Perl 6 (Randal
et al., 2004) e Lua (Ierusalimschy, 2006).
2.4.2 Vantagens
A utilização de máquinas virtuais como ambiente de execução para linguagens de
programação proporciona diversas vantagens:
(a)
(b) (c)
(d) (e)
Listagem 2.1: Trecho de código que adiciona dois inteiros.
...
bipush 4
bipush 2
iadd
...
3
A mesma disposição da pilha de operandos exibida na Figura 2.8(b) pode ser obtida por meio da
execução dos bytecodes iconst_4 e iconst_2 que consistem em colocar os valores inteiros 4 e 2 na
pilha.
CAPÍTULO 2. MÁQUINAS VIRTUAIS DE LINGUAGEM DE PROGRAMAÇÃO 20
3
Mapeamento Sistemático
21
CAPÍTULO 3. MAPEAMENTO SISTEMÁTICO 22
ados para categorização dos elementos de uma área de pesquisa, pois a extração de
dados que ocorre durante a condução desses estudos é, geralmente, mais abrangente
(coarse-grained) do que a que acontece em revisões sistemáticas (Bailey et al., 2007).
Adicionalmente, mapeamentos sistemáticos são recomendados para identificação de
grupos de evidência (evidence clusters), para os quais futuras revisões sistemáticas
podem ser conduzidas, e carência de evidências (evidence gaps) em uma determinada
área de pesquisa (Pretorius e Budgen, 2008).
Na seção seguinte (3.1) descreve-se o processo empregado para condução de ma-
peamentos sistemáticos e na Seção 3.2 são apresentadas as questões de pesquisa que
motivaram a realização do mapeamento em questão. A busca e seleção dos estudos
primários é detalhada na Seção 3.3; os passos screening e keywording são apresen-
tados nas Seções 3.4 e 3.5, respectivamente; a descrição da categorização resultante
é apresentada na Seção 3.6. Uma visão geral dos resultados é provida na Seção 3.7
por meio do mapa resultante. Uma ferramenta de mineração de textos foi usada com
o intuito de reexaminar tanto a categorização quanto as categorias propostas, con-
forme ilustrado na Seção 3.8. Por fim, ameaças à validade e as considerações finais
são discutidas nas Seções 3.9 e 3.10
• Compendex (www.engineeringvillage.com);
• IEEEXplore (ieeexplore.ieee.org);
• ScienceDirect (www.sciencedirect.com);
A string usada nas buscas é formada por uma combinação das seguintes palavras-
chave e acrônimos: virtual machine, VM, high level language virtual machine e HLL
VM. Diversas combinações de palavras-chave foram testadas e a avaliação preliminar
dos resultados apoiou a determinação desse conjunto de palavras. Os mecanismos
de busca das bases de dados consideradas possibilitaram a busca por ocorrências
dessas palavras, combinadas por meio de operadores booleanos como AND e OR, tanto
no título quanto no resumo.
As palavras-chave selecionadas são bem gerais com o propósito de refletir o amplo
escopo desse tipo de estudo secundário. A utilização de palavras-chave mais restriti-
vas poderia prejudicar a abrangência do mapeamento sistemático aqui descrito.
3.4 Screening
Com o intuito de verificar quais estudos devem fazer parte do conjunto incluído no
mapeamento sistemático, a realização desse passo consiste em efetuar uma avalia-
ção dos estudos retornados por meio de critérios de inclusão e exclusão previamente
definidos (Petersen et al., 2008).
Durante a seleção dos estudos primários, as seguintes seções foram consideradas:
(i) título, (ii) resumo, (iii) introdução/contextualização e (iv) conclusões/considerações
CAPÍTULO 3. MAPEAMENTO SISTEMÁTICO 25
finais. Assim, a seleção envolveu duas iterações para cada estudo primário selecio-
nado. A primeira iteração consistindo somente da leitura do título e do resumo. Para
estudos selecionados na primeira iteração, a segunda iteração abordou a leitura das
seções introdução/contextualização e conclusões/considerações finais, avaliando-as
de acordo com os critérios de inclusão e exclusão. Porém, para extrair informações
sobre qual a implementação de máquina virtual usada no estudo primário, freqüen-
temente, outras seções também tiveram que ser examinadas.
Os critérios de inclusão e exclusão apóiam a seleção de estudos relevantes e que
apropriadamente auxiliam no esclarecimento das perguntas propostas. No contexto
desse mapeamento sistemático, os estudos foram examinados de acordo com os se-
guintes critérios:
• Critérios de inclusão:
• Critérios de exclusão:
Não foram estabelecidos limites para as datas de publicação dos artigos. Na Ta-
bela 3.1 é apresentada uma visão geral do total de estudos retornados por cada uma
das bases de dados, a quantidade inicialmente selecionada e o conjunto final, formado
por 128 estudos primários.
Tabela 3.1: Visão geral dos artigos retornados por cada base de dados eletrônica, total
de artigos pré-selecionados e de artigos selecionados.
IEEE 309
Springer 640
ACM 1554
Compendex 1395
ScienceDirect 1123
T OTAL 5021
Pré-selecionados 142
Seleção final 128
3.5 Keywording
Esse passo enfoca a classificação e categorização dos estudos selecionados anteri-
ormente. Para tal, a princípio, os resumos são lidos e palavras-chave que refle-
tem a contribuição apresentada pelo estudo primário são destacadas. Dessa forma,
identifica-se o contexto no qual a contribuição em questão se insere. Posteriormente,
os conjuntos de palavras-chave extraídos dos estudos são combinados e analisados,
possibilitando uma abrangente compreensão da área de pesquisa como um todo. A
partir dessa combinação e análise, é possível estabelecer um conjunto de categorias
que representam a população em questão (Petersen et al., 2008). Uma visão geral da
abordagem usada para construção das categorias é apresentada na Figura 3.2.
Durante a condução desse passo, deficiências apresentadas pelos resumos dificul-
taram a aplicação da abordagem da Figura 3.2. De acordo com Brereton et al. (2007),
normalmente, resumos de estudos pertencentes ao domínio de Engenharia de Soft-
ware são incompletos. Isso dificulta a condução de estudos secundários, dado que a
omissão de informações torna complexa a determinação e apuração da relevância dos
estudos primários. Uma abordagem para melhorar a apresentação e organização das
informações contidas nos resumos é a utilização de resumos estruturados (structured
CAPÍTULO 3. MAPEAMENTO SISTEMÁTICO 27
Figura 3.2: Abordagem usada para criação das categorias; adaptada de Petersen et al.
(2008).
3.6.1 Otimização
Apesar dos benefícios proporcionados por máquinas virtuais, a utilização desse tipo
de tecnologia implica na introdução de uma camada adicional, resultando em ques-
tões de desempenho. Determinadas construções das linguagens de programação, as-
sim como certos mecanismos implementados nas máquinas virtuais (gerenciamento
de memória, por exemplo), também afetam negativamente o tempo de execução.
Dessa forma, um tópico amplamente investigado no contexto de máquinas virtuais
são técnicas para aprimorar o desempenho. Tais técnicas no decorrer deste capítulo
serão referidas como técnicas de otimização.
Conforme descrito no Capítulo 2, máquinas virtuais utilizam, basicamente, duas
abordagens para execução: interpretação e compilação. Em vista disso, existem téc-
nicas de otimização para essas duas abordagens. As técnicas de otimização mais
difundidas para interpretadores são: threaded code (Bell, 1973), super-instruções
(Ertl e Gregg, 2004) e utilização de arquiteturas baseadas em registradores (Shi et al.,
2008). Considerando compilação, a técnica mais utilizada é a compilação just-in-time
(JIT) (Aycock, 2003). Estudos primários nessa categoria enfocam o desenvolvimento
de técnicas para mitigar o custo computacional dessas abordagens de execução e de
determinadas construções da linguagem subjacente (strings e manipulação de exce-
ções, por exemplo), melhorando assim o desempenho observável por parte das má-
quinas virtuais. A seguir, alguns desses estudos são descritos.
A máquina virtual Java utiliza pilhas (stacks) para armazenar variáveis locais
e resultados parciais. Objetos, no entanto, são alocados e armazenados na heap
(Lindholm e Yellin, 1999). A fim de reduzir o custo computacional relacionado à alo-
cação e liberação de memória Molnar et al. (2009) propõem que alguns objetos sejam
alocadas na pilha. Para determinar quais objetos podem ser alocados na pilha um
algoritmo de escape analysis foi implementado. A implementação de máquina virtual
Java utilizada nesse estudo é a CACAO (CACAOVM, 2010). De acordo com os autores,
a implementação dessa estratégia resultou em melhorias de desempenho de até 69%.
Há compiladores JIT que recompilam todo o código dos métodos relacionados a
uma classe. Contudo, são mais comuns implementações que empregam estratégias
para determinar quais trechos de código devem ser recompilados (hot sets) e o quanto
deve ser despendido na compilação. Assim, quanto mais invocado um trecho de
código, mais otimizado torna-se. Isso também evita a sobrecarga de ter que compilar
todo o código da aplicação. Gu e Verbrugge (2008) descrevem a implementação de
uma estratégia de recompilação adaptativa baseada em fases. A estratégia consiste
na coleta de informações offline ou online (durante a execução) que são utilizadas para
classificar os trechos de código em fases e, a partir dessa classificação, determinar
quais trechos devem ser recompilados e em que nível de otimização. Segundo os
CAPÍTULO 3. MAPEAMENTO SISTEMÁTICO 29
3.6.3 Depuração
Depuração (debugging) consiste na localização e correção de defeitos (Araki et al.,
1991; Myers et al., 2004). Determinados estudos enfocam a extensão da funcio-
nalidade provida por máquinas virtuais com o objetivo de automatizar e facilitar a
condução de atividades de depuração. Estudos que apresentam extensões desse tipo,
conforme o descrito a seguir, foram selecionados durante a condução do mapeamento
sistemático.
Algumas máquinas virtuais são implementadas na linguagem que elas suportam,
sendo denominadas máquinas virtuais meta-circulares. Alguns exemplos são a Jikes
2
Diz que um objeto está morto quando ele torna-se inalcançável e pode ser eliminado da memória.
CAPÍTULO 3. MAPEAMENTO SISTEMÁTICO 31
RVM e a Maxine (Mathiske, 2008), ambas implementadas em Java. Esse tipo de má-
quina virtual dificulta a criação de depuradores, visto que vários níveis de abstração
devem ser considerados. Por exemplo, depurar uma máquina virtual Java implemen-
tada em Java requer acesso ao código fonte, bytecodes e código de máquina. Em
um dos estudos primários selecionados, Würthinger et al. (2010) descrevem a imple-
mentação do Maxine Inspector, um depurador de múltiplos níveis (multi-level) que é
voltado especificamente para suportar a depuração da Maxine.
3.6.6 Profiling
Profiling é a coleta automatizada de informações relacionadas ao desempenho e com-
portamento de uma determinada aplicação. Estudos primários relacionados a intro-
dução dessa funcionalidade no contexto das máquinas virtuais existentes pertencem
a essa categoria.
Algumas máquinas virtuais utilizam online profiling e otimização dinâmica com o
intuito de melhorar a performance das aplicações. Entretanto, as informações cole-
tadas durante o profiling não são reutilizadas a fim de otimizar o desempenho de exe-
cuções subseqüentes, sendo descartadas ao final de cada execução. Com o propósito
de utilizar essas informações para otimização de subseqüentes execuções (cross-run),
Arnold et al. (2005) introduziram alterações na arquitetura da J9 e um repositório
para persistência de informações sobre as execuções anteriores. Dessa forma, as in-
formações do repositório podem ser posteriormente utilizadas para apoiar a realização
de otimizações seletivas (selective optimizations).
interesses transversais (Kiczales e Mezini, 2005). Embora essa tecnologia tenha sido
bastante difundida desde então (Safonov, 2008; Laddad, 2009), o tópico mais pes-
quisado envolve a introdução de melhorias em nível de linguagem (Harbulot e Gurd,
2006; Ongkingco et al., 2006; Akai et al., 2009). Como resultado, as implementa-
ções atuais são baseadas em tecnologias existentes que não estão aptas a suportá-las
convenientemente.
AspectJ (Laddad, 2009), que consiste de uma extensão para possibilitar POA na
plataforma Java, é um exemplo de implementação dessa tecnologia. Dado que sua
implementação é baseada na reescrita de bytecodes (weaving) (Hilsdale e Hugunin,
2004), que não foram especificamente projetados para apoiar as construções da POA,
limitações de desempenho são apresentadas. Os estudos nessa categoria abordam
a introdução de suporte para construções da POA nas máquinas virtuais a fim de,
principalmente, melhorar o desempenho das aplicações que utilizam esse tipo de tec-
nologia.
Considerando a extensão AspectJ, join points são implementados por meio da ins-
trumentação de regiões do código fonte que correspondem aos pointcuts. Nas regiões
que podem ser determinadas somente em tempo de execução, pontos de verificação
são inseridos. Por questões de desempenho, é desejável que tais verificações se-
jam removidas. Em um dos estudos selecionados, Bockisch et al. (2004) descrevem
uma máquina virtual, denominada Steamloom, com determinadas extensões que a
tornam aspect-aware. Essas extensões podem ser sumarizadas como a seguir: in-
trodução de uma interface de programação de aplicativos (API), uma biblioteca para
manipulação de bytecodes e suporte para weaving.
cflow é outra construção da AspectJ que apresenta problemas de desempenho,
pois a forma como ela é implementada não reflete suas características dinâmicas.
Bockisch et al. (2006) descrevem uma abordagem para aprimorar o desempenho
dessa construção. A implementação da abordagem proposta explora e acessa es-
truturas internas da Steamloom como, por exemplo, a pilha de chamadas (call stack),
para melhorar o desempenho dessa construção em tempo de execução. Desse modo,
os autores propõem que o suporte para programação orientada a aspectos seja inte-
grado ao ambiente de execução, ou seja, à máquina virtual. Mais especificamente, na
abordagem proposta a otimização é realizada pelo compilador JIT integrado à Steam-
loom.
3.6.9 Segurança
Conforme descrito por Gong (2009), desde a introdução da linguagem Java, várias
pesquisas têm sido conduzidas com o propósito de aperfeiçoar a segurança provida
por máquinas virtuais. A categoria descrita nesta subseção agrupa estudos primários
que abordam a adição de funcionalidade aos mecanismos de segurança das máquinas
virtuais contemporâneas. Por exemplo, o estudo primário de Inoue e Forrest (2002)
que descreve uma estratégia para detecção de intrusões/anomalias denominada dy-
namic sandboxing.
A estratégia de Inoue e Forrest (2002), implementada na máquina virtual Open
Runtime Platform (ORP) (Cierniak et al., 2002), é voltada para plataformas que uti-
lizam profiling e compilação dinâmica. Nessa estratégia são utilizadas informações
obtidas por meio da máquina virtual subjacente a fim detectar anomalias em nível
de aplicação. A estratégia proposta consiste de duas atividades, a saber: geração
e execução do sandbox. Durante a primeira, um sandbox profile é construído por
meio da execução da aplicação utilizando uma máquina virtual instrumentada. As-
sim, cada sandbox é configurado de acordo com o comportamento apresentado pelo
contexto (aplicação) sendo considerado. Posteriormente, durante a segunda atividade
CAPÍTULO 3. MAPEAMENTO SISTEMÁTICO 35
Categoria Acrônimo
Gerenciamento de Memória Automatizado GMA
Tolerância a Vazamentos de Memória TVM
Novas Construções de Linguagens de Programação NCLP
Programação Orientado a Aspectos POA
Sistemas Embarcados SE
Computação Distribuída CD
Tolerância a Falhas TF
Compartilhamento de Recursos entre Máquinas Virtuais CRMV
Otimização 34
GMA 33
SE 24
Tempo Real 13
Profiling 9
POA 8
Depuração 8
CD 7
TF 4
NCLP 4
Segurança 3
TVM 2
CRMV 2
Teste de Software 2
0 5 10 15 20 25 30 35
A base de dados eletrônica com mais estudos selecionados é a ACM, 62. As outras
bases, EngineeringVillage, Springer e IEEE, têm 38, 16, e 12 estudos pertencentes
ao conjunto final, respectivamente. Como descrito na Tabela 3.1, a base de dados
ScienceDirect também foi consultada, no entanto, como ela foi a última base de dados
a ser averiguada, os estudos retornados adequados aos critérios de inclusão já haviam
sido pré-selecionados durante a busca anterior na EngineeringVillage, que retorna
resultados de várias outras bases de dados. Uma visão geral da distribuição dos
estudos conforme suas respectivas bases de dados é exibida na Figura 3.4(a) e (c).
Os estudos primários são descritos em vários tipos de publicações. Encontram-
se publicações em conferências, workshops, journals, simpósios e capítulos de livros
entre os estudos selecionados. O tipo mais comum no contexto deste mapeamento
sistemático é publicação em conferência (34%) e a menor quantidade de publicações
aparece em workshops (6%). A quantidade de estudos pertencente a cada tipo é
apresentado nas Figuras 3.4(b) e (d).
CAPÍTULO 3. MAPEAMENTO SISTEMÁTICO 40
7
Otimização
GMA
6 SE
Tempo Real
5 Profiling
4
Freqüência
0
8 9 0 1 2 3 4 5 6 7 8 9 0
199 199 200 200 200 200 200 200 200 200 200 200 201
Ano
Figura 3.3: Projeção das publicações nas 5 categorias com maior número de estudos
primários.
(a) (b)
ACM 62 Conferência 46
EngineeringVillage 38 Journal 33
Springer 16 Simpósio 25
IEEE 12 Capítulo de livro 16
ScienceDirect 0 Workshop 8
(c) (d)
Figura 3.4: Distribuição dos estudos de acordo com a base de dados e o tipo de
publicação: em (a) ilustra-se a porcentagem de estudos pertencentes a cada base de
dados considerada e em (c) as respectivas quantidades; em (b) é exibida a divisão dos
estudos de acordo com o tipo de publicação e em (d) o número de estudos de cada
tipo.
CAPÍTULO 3. MAPEAMENTO SISTEMÁTICO 41
3.7.1 Mapa
O termo faceta é empregado para agrupar um conjunto de categorias. Facetas au-
xiliam na organização de um diagrama, denominado mapa (Afzal et al., 2009), que
sintetiza informações sobre as categorias e estudos primários pertencentes a um de-
terminado mapeamento sistemático. As facetas presentes no mapa desse mapea-
mento sistemático são: (i) tipo de aprimoramento introduzido, (ii) implementação de
máquina virtual usada no contexto do estudo primário e (iii) ano de publicação. O
mapa resultante da combinação dessas facetas, Figura 3.5, mostra como as catego-
rias e seus respectivos estudos estão distribuídos. Essa disposição apóia a análise
dos resultados enfocando a freqüência de publicações, auxiliando no determinação
da cobertura em cada campo de pesquisa e das implementações de máquina virtual
mais amplamente difundidas no meio acadêmico.
Como pode ser observado na Figura 3.5, a maioria dos estudos tem como pla-
taforma alvo implementações da máquina virtual Java; mais precisamente, 24 das
31 implementações. Dentre as implementações mais utilizadas encontram-se: Jikes
RVM, HotSpot, Kaffe, J9 e K Virtual Machine (KVM, 2010). Jikes RVM foi utilizada
em pelo menos um estudo pertencente a cada categoria; com exceção das catego-
rias segurança, tempo real e compartilhamento de recursos. Adicionalmente, ela foi
usada na maior parte dos estudos das categorias otimização, gerenciamento de me-
mória e POA. As outras máquinas virtuais, Objective Caml Virtual Machine (OCVM),
GForth, Tool Command Language Virtual Machine (TclVM), e SICStus, suportam as
linguagens Objective Caml (OCaml) (OCaml, 2010), Forth (Rather et al., 1996), Tool
Command Language (Tcl) (Tcl, 2010), e Prolog (SICStus, 2010), respectivamente. Má-
quinas virtuais voltadas para suportar mais de uma linguagem, como CLR e MONO,
também foram utilizadas em alguns estudos.
CAPÍTULO 3. MAPEAMENTO SISTEMÁTICO 42
Figura 3.5: Mapa contendo a distribuição dos estudos de acordo com as facetas.
CAPÍTULO 3. MAPEAMENTO SISTEMÁTICO 43
(a) (b)
(c) (d)
Figura 3.6: Categorização e classificações geradas pela ferramenta PEx: (a) ilustra-
se a disposição em que os estudos foram organizados nas categorias de acordo com
a similaridade entre eles e grupos que contêm os estudos relacionados a GMA (b),
depuração (c) e POA (d).
4
Proposta
Este capítulo tem o objetivo de delinear o projeto de pesquisa proposto. Para tal, na
Seção 4.1 apresenta-se uma visão geral da pesquisa proposta, na Seção 4.2 é descrita
a funcionalidade que será implementada a fim de automatizar e facilitar a condução
de atividades de Teste de Mutação e na Seção 4.3 descreve-se o suporte proposto para
apoiar o teste de programas concorrentes. Na seção 4.4 são apresentadas as imple-
mentações de máquina virtual que foram examinadas, bem como as características
que influenciaram a seleção dessas implementações, as atividades conduzidas são
descritas na Seção 4.5 e as previstas e o cronograma do projeto na 4.6. Por fim, as
considerações finais são apresentadas na Seção 4.7.
47
CAPÍTULO 4. PROPOSTA 48
descrita a seguir:
Maxine também é implementada na linguagem Java e, assim como a Jikes RVM, todo
o código é compilado antes de ser executado. A última versão dessa máquina vir-
tual é datada de abril de 2009. Uma das características mais importantes dessa
máquina virtual é a sua integração com um depurador, denominado Maxine Ins-
pector, desenvolvido de acordo com a arquitetura interna dessa implementação.
Porém, principal desvantagem dessa implementação é que ela é compatível so-
mente com plataformas 64 bits.
Condução de uma revisão bibliográfica: essa atividade foi realizada como um ma-
peamento sistemático (descrito na Seção 3), possibilitando que os passos reali-
zados possam ser replicados por outros pesquisados.
1
2
3
4
CAPÍTULO 4. PROPOSTA 55
A FZAL , W.; T ORKAR , R.; F ELDT, R. A Systematic Review of Search-based Testing for
Non-functional System Properties. Information and Software Technology, vol. 51,
n. 6, páginas 957–976, 2009.
A KAI , S.; C HIBA , S.; N ISHIZAWA , M. Region Pointcut for AspectJ. In: Proceedings of
the 8th workshop on Aspects, components, and patterns for infrastructure software
(ACP4IS), ACM, páginas 43–48, 2009.
A LPERN , B.; A UGAR T, S.; B LACKBURN , S. M.; B UTRICO , M.; C OCCHI , A.; C HENG ,
P.; D OLBY, J.; F INK , S.; G ROVE , D.; H IND , M.; M C K INLEY, K. S.; M ERGEN , M.;
M OSS , J. E. B.; N GO , T.; S ARKAR , V. The Jikes Research Virtual Machine Project:
Building an Open-source Research Community. IBM Systems Journal, vol. 44,
n. 2, páginas 399–417, 2005.
A RAKI , K.; F URUKAWA , Z.; C HENG , J. A General Framework for Debugging. IEEE
Software, vol. 8, páginas 14–20, 1991.
A RNOLD , M.; W ELC , A.; R AJAN , V. T. Improving virtual machine performance using
a cross-run profile repository. ACM SIGPLAN Notices, vol. 40, n. 10, páginas 297–
311, 2005.
A UERBACH , J.; B ACON , D. F.; B LAINEY, B.; C HENG , P.; D AWSON , M.; F ULTON , M.;
G ROVE , D.; H AR T, D.; S TOODLEY, M. Design and Implementation of a Com-
prehensive Real Time Java Virtual Machine. In: Proceedings of the 7th ACM &
IEEE international conference on Embedded software (EMSOFT), ACM, páginas 249–
258, 2007.
56
REFERÊNCIAS BIBLIOGRÁFICAS 57
B AILEY, J.; B UDGEN , D.; T URNER , M.; K ITCHENHAM , B.; B RERETON , P.; L INKMAN ,
S. Evidence Relating to Object-Oriented software design: A Survey. International
Symposium on Empirical Software Engineering and Measurement, páginas 482–484,
2007.
B AKER , J.; C UNEI , A.; P IZLO , F.; V ITEK , J. Lecture Notes in Computer Science:
Compiler Construction, Capítulo: Accurate Garbage Collection in Uncooperative
Environments with Lazy Pointer Stacks, Springer Berlin/Heidelberg, páginas 64–
79, 2007.
B AKER , J.; C UNEI , A.; P IZLO , F.; V ITEK , J. Accurate Garbage Collection in Un-
cooperative Environments Revisited. Concurrency and Computation: Practice and
Experience, vol. 21, páginas 1572–1606, 2009.
B ARBOSA , E. F.; C HAIM , M. L.; V ICENZI , A. M. R.; D ELAMARO , M. E.; J INO , M.;
M ALDONADO , J. C. Introdução Teste de Software, Capítulo: Teste Estrutural,
Campus, páginas 47–76, 2007.
B ELL , J. R. Threaded code. Communications of the ACM, vol. 16, n. 6, páginas 370–
372, 1973.
B OCKISCH , C.; H AUPT, M.; M EZINI , M.; O STERMANN , K. Virtual Machine Support
for Dynamic Join Points. In: Proceedings of the 3rd international conference on
Aspect-oriented software development (AOSD), ACM, páginas 83–92, 2004.
B OCKISCH , C.; K ANTHAK , S.; H AUPT, M.; A RNOLD , M.; M EZINI , M. Efficient Control
Flow Quantification. In: Proceedings of the 21st annual ACM SIGPLAN conference
REFERÊNCIAS BIBLIOGRÁFICAS 58
B OND , M. D.; M C K INLEY, K. S. Tolerating memory leaks. In: Proceedings of the 23rd
ACM SIGPLAN conference on Object-oriented Programming, Systems, Languages, and
Applications (OOPSLA), ACM, páginas 109–126, 2008.
B RERETON , P.; K ITCHENHAM , B. A.; B UDGEN , D.; T URNER , M.; K HALIL , M. Lessons
from Applying the Systematic Literature Review Process within the Software Engi-
neering Domain. Journal of Systems and Software, vol. 80, n. 4, páginas 571–583,
2007.
B UDGEN , D.; K ITCHENHAM , B. A.; C HAR TERS , S. M.; T URNER , M.; B RERETON , P.;
L INKMAN , S. G. Presenting Software Engineering Results using Structured Abs-
tracts: A Randomised Experiment. Empirical Software Engineering, vol. 13, pági-
nas 435–468, 2008.
C ESARINI , F.; T HOMPSON , S. Erlang Programming. O’Reilly Media, Inc., 496 páginas,
2009.
C ZAJKOWSKI , G.; D AYNÈS , L.; N YSTROM , N. Lecture Notes in Computer Science: Eu-
ropean Conference on Object-Oriented Programming (ECOOP) – Object-Oriented Pro-
gramming, Capítulo: Code Sharing among Virtual Machines, Springer Berlin/Hei-
delberg, páginas 269–270, 2002.
D AVIS , B.; WALDRON , J. A survey of optimisations for the java virtual machine.
In: Proceedings of the 2nd international Conference on Principles and Practice of
Programming in Java (PPPJ), ACM, páginas 181–183, 2003.
D ELAMARO , M. E.; M ALDONADO , J. C.; J INO , M.; C HAIM , M. L. Proteum: Uma Fer-
ramenta de Testes Baseada na Análise de Mutantes. In: Caderno de Ferramentas
do VII Simpósio Brasileiro de Engenharia de Software (SBES), páginas 31–33, 1993.
D YBVIG , R. K. The Scheme Programming Language. 4 edição. The MIT Press, 512
páginas, 2009.
E DELSON , J.; L IU , H. JRuby Cookbook. O’Reilly Media, Inc., 224 páginas, 2008.
F AVRE , J.-M. Languages evolve too! Changing the Software Time Scale. Internatio-
nal Workshop on Principles of Software Evolution, páginas 33–44, 2005.
G ALLARD , J.; L ÈBRE , A.; VALLÉE , G.; M ORIN , C.; G ALLARD , P.; S COTT, S. L. Lecture
Notes in Computer Science: Algorithms and Architectures for Parallel Processing, Ca-
pítulo: Refinement Proposal of the Goldberg’s Theory Springer Berlin/Heidelberg,
páginas 853–865, 2009.
G OETZ , B.; P EIERLS , T.; B LOCH , J.; B OWBEER , J.; H OLMES , D.; L EA , D. Java
Concurrency in Practice. Addison-Wesley Professional, 384 páginas, 2006.
G ONG , X.; WANG , Y.; Z HOU , Y.; L I , B. On Testing Multi-threaded Java Programs.
In: Proceedings of the Eighth ACIS International Conference on Software Engineering,
Artificial Intelligence, Networking, and Parallel/Distributed Computing (SNPD), IEEE
Computer Society, páginas 702–706, 2007.
G OSLING , J.; J OY, B.; S TEELE , G.; B RACHA , G. The Java Language Specification,
Capítulo: Exceptions. 3 edição Addison Wesley, páginas 297–307, 2005.
REFERÊNCIAS BIBLIOGRÁFICAS 61
H ARBULOT, B.; G URD , J. R. A Join Point for Loops in AspectJ. In: Proceedings
of the 5th international conference on Aspect-oriented software development (AOSD),
ACM, páginas 63–74, 2006.
H ÄUBL , C.; W IMMER , C.; M ÖSSENBÖCK , H. Optimized Strings for the Java
HotSpotTM Virtual Machine. In: Proceedings of the 6th international symposium
on Principles and practice of programming in Java (PPPJ), ACM, páginas 105–114,
2008.
H OLMES , N. The Turning of the Wheel. Computer, vol. 38, páginas 98–99, 2005.
J ONES , R.; L INS , R. D. Garbage Collection: Algorithms for Automatic Dynamic Memory
Management. Wiley, 404 páginas, 1996.
K OENIG , D.; G LOVER , A.; K ING , P.; L AFORGE , G.; S KEET, J. Groovy in Action.
Manning Publications, 696 páginas, 2007.
L ARSON , D.; M ILLER , K. Silver Bullets for Little Monsters: Making Software More
Trustworthy. IT Professional, vol. 7, páginas 9–13, 2005.
L IN , C.-Y.; H OU , T.-W. Lecture Notes in Computer Science: Advances in Grid and Per-
vasive Computing, Capítulo: A Lightweight Cyclic Reference Counting Algorithm,
Springer Berlin/Heidelberg, páginas 364–359, 2009.
L INDHOLM , T.; Y ELLIN , F. The Java Virtual Machine Specification. 2 edição. Prentice
Hall, 496 páginas, 1999.
M ATHISKE , B. The maxine virtual machine and inspector. In: Companion to the
23rd ACM SIGPLAN Conference on Object-oriented programming, Systems, Langua-
ges, and Applications (OOPSLA), ACM, páginas 739–740, 2008.
M OLNAR , P.; K RALL , A.; B RANDNER , F. Stack Allocation of Objects in the CACAO
Virtual Machine. In: Proceedings of the 7th International Conference on Principles
and Practice of Programming in Java (PPPJ), ACM, páginas 153–161, 2009.
M YERS , G.; S ANDLER , C.; B ADGETT, T.; T HOMAS , T. M. The Art of Software Testing.
Wiley, 256 páginas, 2004.
N AIK , S.; T RIPATHY, P. Software Testing and Quality Assurance: Theory and Practice.
Wiley, 468 páginas, 2008.
N IEMEYER , P.; K NUDSEN , J. Learning Java. O’Reilly Media, Inc., 984 páginas, 2005.
O NGKINGCO , N.; AVGUSTINOV, P.; T IBBLE , J.; H ENDREN , L.; DE M OOR , O.; S ITTAMPA -
LAM , G. Adding Open Modules to AspectJ. In: Proceedings of the 5th international
conference on Aspect-oriented software development (AOSD), ACM, páginas 39–50,
2006.
P EDRONI , S.; R APPIN , N. Jython Essentials. O’Reilly Media, Inc., 304 páginas, 2002.
REFERÊNCIAS BIBLIOGRÁFICAS 64
P ETERSEN , K.; F ELDT, R.; M UJTABA , S.; M ATTSSON , M. Systematic Mapping Studies
in Software Engineering. 12th International Conference on Evaluation and Assess-
ment in Software Engineering (EASE), páginas 71–80, 2008.
P UGH , W.; AYEWAH , N. Unit Testing Concurrent Software. In: Proceedings of the
twenty-second IEEE/ACM international conference on Automated software enginee-
ring (ASE), ACM, páginas 513–516, 2007.
R ANDAL , A.; S UGALSKI , D.; T OETSCH , L. Perl 6 and Parrot Essentials. O’Reilly
Media, Inc., 304 páginas, 2004.
R ATHER , E. D.; C OLBURN , D. R.; M OORE , C. H. The Evolution of Forth. In: History
of programming languages — II, ACM, páginas 625–670, 1996.
S MITH , J.; N AIR , R. Virtual Machines: Versatile Platforms for Systems and Processes.
Morgan Kaufmann, 656 páginas, 2005a.
S MITH , J. E.; N AIR , R. The Architecture of Virtual Machines. Computer, vol. 38,
n. 5, páginas 32–38, 2005b.
S TOCKINGER , H. Defining the Grid: A Snapshot on the Current View. In: The
Journal of Supercomputing, Springer Netherlands, páginas 3–17, 2007.
V OAS , J. Fault Tolerance. Software, IEEE, vol. 18, n. 4, páginas 54–57, 2001.
X IMIAN MONO: Cross Plataform, Open Source .NET Development Framework. Dis-
ponível em: http://www.mono-project.com/Main_Page, acessado 18 de abril, 2010.
Z HANG , L.; K RINTZ , C. Adaptive Code Unloading for Resource-constrained JVMs. In:
Proceedings of the 2004 ACM SIGPLAN/SIGBED conference on Languages, compilers,
and tools for embedded systems (LCTES), ACM, páginas 155–164, 2004.
Z HANG , L.; K RINTZ , C.; N AGPURKAR , P. Language and virtual machine support for
efficient fine-grained futures in java. In: Proceedings of the 16th International Con-
ference on Parallel Architecture and Compilation Techniques (PACT), IEEE Computer
Society, páginas 130–139, 2007a.
Z HANG , L.; K RINTZ , C.; N AGPURKAR , P. Supporting Exception Handling for Futu-
res in Java. In: Proceedings of the 5th international symposium on Principles and
practice of programming in Java (PPPJ), ACM, páginas 175–184, 2007b.