Identifying classes in legacy javaScript code
Carregando...
Data
Autor(es)
Título da Revista
ISSN da Revista
Título de Volume
Editor
Universidade Federal de Minas Gerais
Descrição
Tipo
Tese de doutorado
Título alternativo
Primeiro orientador
Membros da banca
Alexandre Bergel
Eduardo Magno Lages Figueiredo
Mariza Andrade da Silva Bigonha
Marcelo de Almeida Maia
Paulo Henrique Monteiro Borba
Eduardo Magno Lages Figueiredo
Mariza Andrade da Silva Bigonha
Marcelo de Almeida Maia
Paulo Henrique Monteiro Borba
Resumo
JavaScript é a linguagem de programação mais popular para a Web. Embora a linguagem seja baseada em protótipos, desenvolvedores JavaScript muitas vezes emulam classes para diminuir a crescente complexidade de suas aplicações. Identicar estruturas semelhantes a classes pode auxiliar estes desenvolvedores nas seguintes atividades: (i) compreensão de programas; (ii) migração de código para a nova sintaxe de classes introduzida na versão 6 de ECMAScript (ES6); e (iii) implementação de ferramentas de apoio, incluindo IDEs com visões baseadas em classes e ferramentas de engenharia reversa. Nesta tese, nós denimos, implementamos e avaliamos um conjunto de heurísticas para identicar estruturas que emulam classes, e suas dependências, em sistemas JavaScript legados, isto é, implementados em versões anteriores a ES6. Desenvolvemos um amplo estudo, utilizando um dataset de 918 aplicações JavaScript, disponíveis no GitHub, para entender como a emulação de classes é empregada. Encontramos evidências de que estruturas emulando classes estão presentes em quase 70% dos sistemas estudados. Realizamos um estudo com 60 desenvolvedores para avaliar nossa estratégia e ferramenta. Os resultados indicam que nossa ferramenta é capaz de identicar classes emuladas em sistemas legados JavaScript. Avaliamos também como o uso de um vericador estático pode inferir tipos que correspondem a referências para classes. Realizamos um estudo com duas aplicações legadas para avaliar a precisão na identicação de dependências entre classes. Conseguimos atingir precisão de 100% em ambos os sistemas, e o recall varia de 80% a 86% para dependências em geral e de 85% a 96% para associações. Além disso, apresentamos um conjunto de regras para migrar estruturas que emulam classes para usar a nova sintaxe introduzida em ES6. Em nosso estudo, detalhamos casos que permitem migração automática (as partes boas), casos que exigem intervenção manual e ad-hoc (as partes ruins) e casos que não podem ser migrados devido alimitações de ES6(aspartesfeias). Finalmente, apresentamosrazões que podem levar desenvolvedores a adiar ou rejeitar a adoção de classes ES6, com base no feedback recebido após a submissão de pull-requests sugerindo a migração
Abstract
JavaScript is the most popular programming language for the Web. Although the language is prototype-based, developers often emulate class-based abstractions in JavaScript to master the increasing complexity of their applications. Identifying structures similar to classes in JavaScript code can support these developers in the following activities: (i) program comprehension; (ii) migration to the new JavaScript syntax that supports classes, introduced by ECMAScript 6 (ES6); and (iii) implementation of supporting tools, including IDEs with class-based views and reverse engineering tools. In this thesis, we dene, implement, and evaluate a set of heuristics to identify class-like structures, and their dependencies, in legacy JavaScript code, i.e., code implemented in versions prior to ES6. We report on a large and in-depth study to understand how class emulation is employed, using a dataset of 918 JavaScript applications available on GitHub. We found evidence that structures emulating classes are present in almost 70% of the studied systems. We perform a eld study with 60 developers to evaluate the accuracy of our strategy and tool. The results indicate that our tool is able to identify class-like structures in legacy JavaScript systems. We also demonstrate how to use a static type-checker to infer types that correspond to class references. We perform a study with two open-source applications aiming to measure the accuracy of the proposed approach to identify class-to-class dependencies. We achieve precision of 100% in both systems, and the values of recall ranges from 80% to 86% for dependencies in general and from 85% to 96% for associations. Moreover, we present a set of rules to migrate class-like structures to use the new ES6 class syntax. In our study, we detail cases that are straightforward to migrate (the good parts), cases that require manual and ad-hoc migration (the bad parts), and cases that cannot be migrated due to limitations and restrictions of ES6 (the ugly parts). Finally, we present a set of reasons that can lead developers to postpone or reject the adoption of ES6 classes, based on the feedback received after submitting pull requests suggesting the migration
Assunto
Reengenharia, Computação, Engenharia reversa, Compreensão de programas, JavaScript (Linguagem de programação de computador)
Palavras-chave
Compreensão de programas, Engenharia reversa, Javascript