LiquidJava : extending Java with refinements
| Autor(a) principal: | |
|---|---|
| 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 |