LiquidJava : extending Java with refinements

Detalhes bibliográficos
Autor(a) principal: Gamboa, Catarina Ventura
Data de Publicação: 2021
Tipo de documento: Dissertação
Idioma: eng
Título da fonte: Repositórios Científicos de Acesso Aberto de Portugal (RCAAP)
Texto Completo: http://hdl.handle.net/10451/64988
Resumo: Tese de Mestrado, Engenharia Informática (Engenharia de Software), 2022, Universidade de Lisboa, Faculdade de Ciências
id RCAP_159723e7ee1e749a500f0b478eddf926
oai_identifier_str oai:repositorio.ulisboa.pt:10451/64988
network_acronym_str RCAP
network_name_str Repositórios Científicos de Acesso Aberto de Portugal (RCAAP)
repository_id_str https://opendoar.ac.uk/repository/7160
spelling LiquidJava : extending Java with refinementsTipos RefinadosVerificação de SoftwareLinguagens de ProgramaçãoJavaTeses de mestrado - 2022Domínio/Área Científica::Engenharia e Tecnologia::Engenharia Eletrotécnica, Eletrónica e InformáticaTese de Mestrado, Engenharia Informática (Engenharia de Software), 2022, Universidade de Lisboa, Faculdade de CiênciasA área de desenvolvimento de software tem apresentado um grande crescimento nos últimos anos, havendo mais produtos a serem criados a cada dia. Com este crescimento, uma das maiores preocupações das organizações de desenvolvimento software é a garantia de qualidade do software produzido [46, 30]. As organizações estão sobre constante pressão para entregar produtos de excelente qualidade em prazos reduzidos e a baixos custos. Se o software for entregue ao cliente com erros e não realizar o que é suposto, a reputação da empresa pode ser posta em causa e a confiança dos clientes nos produtos produzidos diminuirá, levando-os a procurar outras empresas concorrentes. Assim, dados os elevados custos de encontrar erros e vulnerabilidades mais tarde no processo de desenvolvimento, os programadores e as organizações tentam detetar e corrigir os problemas o mais cedo possível quando são mais baratos e fáceis de tratar [66]. Para que estes erros sejam detetados cedo, é necessário aplicar métodos de verificação de software que permitam localizar erros e que deem aos utilizadores uma maior confiança na qualidade do software criado. Um dos métodos de verificação mais usados na atualidade advém dos sistemas de tipos implementados em várias linguagens de programação modernas. Com os sistemas de tipos integrados na linguagem, apenas valores que pertencem ao tipo esperado são aceites no programa, sendo que esta verificação é feita em tempo de compilação do programa. Uma vez que os sistemas de tipos estão integrados na linguagem, até podem passar despercebidos como forma de verificação, uma vez que, para um programador, são parte natural da implementação. Contudo, estes sistemas de tipos por vezes não são suficientes para garantir o correto comportamento do programa. Com esta motivação, os tipos refinados foram propostos como um passo incremental nos sistemas de tipos tradicionais, permitindo que os tipos básicos de uma linguagem sejam mais específicos com o uso de predicados lógicos. Assim, os tipos refinados permitem restringir os valores aceites nos diferentes tipos básicos mantendo a verificação integrada na linguagem de programação. Um tipo refinado pode ser representado por {x : B|p}, onde x é uma variável com o tipo básico B refinado pelo predicado p. Um exemplo de um tipo refinado que identifica os números inteiros positivos pode ser representado por {x : int|x > 0}. O mecanismo de tipos refinados, apesar de parecer útil, ainda não se tornou popular na comunidade de desenvolvimento de software. Podem existem várias razões para tal, sendo que uma das possibilidades é a baixa popularidade, na industria, das primeiras linguagens que tiveram implementações de tipos refinados (ex.: ML [24], Haskell [61]). Outra possível explicação vem do significativo aumento do esforço para o programador para perceber e escrever as especificações nos refinamentos. Este trabalho propõe a utilização de tipos refinados integrados em Java, uma das linguagens de programação mais populares no mundo, com foco na usabilidade e com o objetivo de promover o uso global de tipos refinados como técnica de verificação de software. Para integrar os refinamentos em Java, propomos o uso de anotações (como @Refinement ,→ ) onde se insere a linguagem dos refinamentos como uma string. A linguagem de refinamentos inclui recursos para modelar a especificação de variáveis, métodos, atributos de classe e estados de classes. Para que os utilizadores não precisem de aprender uma nova linguagem para os refinamentos, esta deve ser o mais parecida possível de Java. Assim, criámos um inquérito para averiguar a sintaxe preferida de programadores de Java para a sintaxe dos refinamentos. Este inquérito continha duas ou três opções de sintaxes para adição de refinamentos em variáveis, métodos e atributos de classe, opções estas que os participantes avaliaram em termos de preferência. No total o inquérito obteve 50 respostas de programadores familiares com Java, e os resultados foram utilizados na construção da gramática para a linguagem dos refinamentos. Os refinamentos para modelar classes são introduzidos com uma nova especificação que permite modelar o estado dos objetos da classe. Para modelar classes, é possível criar múltiplos conjuntos de estados e propriedades que podem ser usados na especificação dos métodos da classe dentro do refinamento @StateRefinement(from="predicate", to=" ,→ predicate"). Usando esta anotação, os métodos da classe especificam qual o estado em que os objetos devem estar para invocar o método (expressado no argumento from ,→ ) e qual o estado dos objetos quando o método terminar (expressado no argumento to). Desta forma, a especificação é capaz de impor protocolos em classes e modelar com sucesso máquinas de estado em classes Java como, por exemplo, na java.net.Socket. A verificação dos refinamentos em Java é feita através de regras de verificação de tipos, que criámos para esta extensão, e da tradução das relações de subtipos para condições de verificação (VCs). Estas condições são enviadas para um SMT Solver que as verifica automaticamente e indica se todos os refinamentos são respeitados ou se algum deles não é possível de provar. Neste último caso, uma mensagem de erro relacionada com o tipo refinado é mostrada ao utilizador. As regras de verificação foram implementadas num protótipo designado por LiquidJava, que representa a extensão de Java para tipos líquidos (o subconjunto decidível dos tipos refinados). Este protótipo foi também integrado numa extensão para o editor de código Visual Studio Code, de modo a melhorar a usabilidade do sistema LiquidJava. Coa utilização desta extensão, os utilizadores obtêm os erros e relatórios dos mesmos em tempo real enquanto desenvolvem os programas, com as linhas erradas são sublinhadas a vermelho e acompanhadas de mensagens de erro. Para avaliar a extensão LiquidJava, desenvolvemos um estudo com utilizadores focado na usabilidade da extensão como uma ferramenta de verificação de software. Assim, conduzimos um estudo com 30 participantes familiares com Java e pedimos-lhes que realizassem tarefas relacionadas com a interpretação de refinamentos, o uso de LiquidJava para detetar e tratar erros, e a adição de refinamentos em código Java. O estudo mostrou que os refinamentos em variáveis e métodos são muito intuitivos dado que 86% dos participantes conseguiu utilizar os refinamentos corretamente sem nunca ter uma introdução ao tópico. Embora os refinamentos em classes se tenham mostrado mais difíceis de entender sem uma introdução inicial (apenas 46% dos participantes os usou corretamente), após um vídeo de 4 minutos e acesso a um website com exemplos, 100% dos participantes conseguiu anotar o protocolo com refinamentos na classe corretamente. Quanto à deteção e correção de erros usando Java e LiquidJava, o exercício com melhores resultados usando LiquidJava aumentou a localização do erro por 93% e a correção por 47% (dado que os restantes 53% se aproximaram da resolução, mas não obtiveram uma versão completamente correta) quando comparado com as repostas em Java. Este exercício usava o protocolo da classe java.net.Socket, o que mostra que o LiquidJava pode ser mais útil quando aplicado a classes e protocolos menos conhecidos, reduzindo o tempo passado na localização dos erros. Finalmente, o estudo mostrou que os participantes acharam fácil a adição de refinamentos em programas Java e todos declararam estar abertos a usar LiquidJava nos seus projetos. No futuro, é esperado que o LiquidJava evolua para ter uma verificação completa da linguagem Java, com uma melhor usabilidade dentro de editores de código e mensagens de erro mais explícitas. Assim, prevê-se que o LiquidJava possa ser utilizado em produtos de software crítico e em projetos de âmbito geral de modo a melhorar a qualidade do código produzido.Software development is an area with continued growth over the years, with more ap plications being produced every day. As software demand grows, so does the demand for software reliability. Bugs and vulnerabilities that are found earlier during the develop ment lifecycle are easier and cheaper to fix, whereas bugs found in production are difficult and expensive to address and may have dire consequences. Thus, it is important to use software verification techniques to improve software quality. Type systems are one of the most popular verification techniques since they help pre vent bugs early in the development lifecycle. Refinement types are more powerful than traditional type systems since they extend a type system with predicates over the existing types, detecting more classes of bugs. However, despite the perceived utility of refinement types, they have not yet been adopted by mainstream developers. This work aims to promote wide usage of refinement types by adding them to Java, one of the most popular programming languages in the world, with a focus on usability. Thus, we defined usability requirements and followed them in the design of the additional type system with refinements. To promote accessibility, we conducted a series of devel oper surveys to design the syntax of refinements for variables, methods and classes. We propose an approach of using refinements in classes to model type state using state sets and ghost properties. Finally, we created an implementation of LiquidJava and integrated it into an IDE so developers can use the verification information while they are develop ing the code. To evaluate the prototype’s usability, we conducted a research study with 30 Java developers, concluding that users intend to use LiquidJava and that it helped find more bugs and debug faster.Fonseca, Alcides Miguel Cachulo AguiarTimperley, Christopher StevenRepositório da Universidade de LisboaGamboa, Catarina Ventura2024-06-05T15:05:13Z202220212022-01-01T00:00:00Zinfo:eu-repo/semantics/publishedVersioninfo:eu-repo/semantics/masterThesisapplication/pdfhttp://hdl.handle.net/10451/64988TID:202994899enginfo:eu-repo/semantics/openAccessreponame:Repositórios Científicos de Acesso Aberto de Portugal (RCAAP)instname:FCCN, serviços digitais da FCT – Fundação para a Ciência e a Tecnologiainstacron:RCAAP2025-03-17T15:16:14Zoai:repositorio.ulisboa.pt:10451/64988Portal AgregadorONGhttps://www.rcaap.pt/oai/openaireinfo@rcaap.ptopendoar:https://opendoar.ac.uk/repository/71602025-05-29T03:38:45.463862Repositórios Científicos de Acesso Aberto de Portugal (RCAAP) - FCCN, serviços digitais da FCT – Fundação para a Ciência e a Tecnologiafalse
dc.title.none.fl_str_mv LiquidJava : extending Java with refinements
title LiquidJava : extending Java with refinements
spellingShingle LiquidJava : extending Java with refinements
Gamboa, Catarina Ventura
Tipos Refinados
Verificação de Software
Linguagens de Programação
Java
Teses de mestrado - 2022
Domínio/Área Científica::Engenharia e Tecnologia::Engenharia Eletrotécnica, Eletrónica e Informática
title_short LiquidJava : extending Java with refinements
title_full LiquidJava : extending Java with refinements
title_fullStr LiquidJava : extending Java with refinements
title_full_unstemmed LiquidJava : extending Java with refinements
title_sort LiquidJava : extending Java with refinements
author Gamboa, Catarina Ventura
author_facet Gamboa, Catarina Ventura
author_role author
dc.contributor.none.fl_str_mv Fonseca, Alcides Miguel Cachulo Aguiar
Timperley, Christopher Steven
Repositório da Universidade de Lisboa
dc.contributor.author.fl_str_mv Gamboa, Catarina Ventura
dc.subject.por.fl_str_mv Tipos Refinados
Verificação de Software
Linguagens de Programação
Java
Teses de mestrado - 2022
Domínio/Área Científica::Engenharia e Tecnologia::Engenharia Eletrotécnica, Eletrónica e Informática
topic Tipos Refinados
Verificação de Software
Linguagens de Programação
Java
Teses de mestrado - 2022
Domínio/Área Científica::Engenharia e Tecnologia::Engenharia Eletrotécnica, Eletrónica e Informática
description Tese de Mestrado, Engenharia Informática (Engenharia de Software), 2022, Universidade de Lisboa, Faculdade de Ciências
publishDate 2021
dc.date.none.fl_str_mv 2021
2022
2022-01-01T00:00:00Z
2024-06-05T15:05:13Z
dc.type.status.fl_str_mv info:eu-repo/semantics/publishedVersion
dc.type.driver.fl_str_mv info:eu-repo/semantics/masterThesis
format masterThesis
status_str publishedVersion
dc.identifier.uri.fl_str_mv http://hdl.handle.net/10451/64988
TID:202994899
url http://hdl.handle.net/10451/64988
identifier_str_mv TID:202994899
dc.language.iso.fl_str_mv eng
language eng
dc.rights.driver.fl_str_mv info:eu-repo/semantics/openAccess
eu_rights_str_mv openAccess
dc.format.none.fl_str_mv application/pdf
dc.source.none.fl_str_mv reponame:Repositórios Científicos de Acesso Aberto de Portugal (RCAAP)
instname:FCCN, serviços digitais da FCT – Fundação para a Ciência e a Tecnologia
instacron:RCAAP
instname_str FCCN, serviços digitais da FCT – Fundação para a Ciência e a Tecnologia
instacron_str RCAAP
institution RCAAP
reponame_str Repositórios Científicos de Acesso Aberto de Portugal (RCAAP)
collection Repositórios Científicos de Acesso Aberto de Portugal (RCAAP)
repository.name.fl_str_mv Repositórios Científicos de Acesso Aberto de Portugal (RCAAP) - FCCN, serviços digitais da FCT – Fundação para a Ciência e a Tecnologia
repository.mail.fl_str_mv info@rcaap.pt
_version_ 1833601775235497984