Automatic Detection and Classification of Identifier Renamings

RESUME Le lexique du code source joue un role primordial dans la maintenabilite des logiciels. Un lexique pauvre peut induire a une mauvaise comprehension du programme et a l'augmentation des erreurs du logiciel. Il est donc important que les developpeurs maintiennent le lexique de leur code source en renommant les identifiants afin qu'ils refletent les concepts qu'ils expriment. Dans cette these, nous etudions le lexique et proposons une approche pour detecter et classifier les renommages des identifiants dans le code source. La detection des renommages est basee sur la combinaison de deux techniques: la differenciation des codes sources et l'analyse de flux de donnees. Tandis que le classificateur de renommage utilise une base de donnees ontologique et un analyseur syntaxique du langage naturel pour classer les renommages selon la taxonomie que nous avons defini. Afin d'evaluer l'exactitude et l'exhaustivite du detecteur de renommage, nous avons realise une etude empirique sur l’historique de cinq programmes Java open-source. Les resultats de cette etude rapportent une precision de 88% et un rappel 92%. Nous avons egalement mene une etude exploratoire qui analyse et discute comment les identifiants sont renommes, selon la taxonomie proposee, dans les cinq programmes Java de l’etude precedente. Les resultats de cette etude exploratoire montrent qu’il existe des renommages dans chaque dimension de notre taxonomie. Afin d’appliquer l’approche proposee aux programmes PHP, nous avons adapte notre detecteur de renommages pour prendre en compte les caracteristiques inherentes a ces programmes. Une etude preliminaire effectuee sur trois programmes PHP montre que notre approche est applicable aux programmes PHP. Cependant, ces programmes ont des tendances de renommages differentes de celles observees dans les programmes Java. Cette these propose deux resultats. Tout d'abord, la detection et la classification des renommages et un outil, qui peut etre utilise pour documenter les renommages. Les developpeurs seront en mesure de, par exemple, rechercher des methodes qui font partie de l’interface de programmation car celles-ci impactent les applications clientes. Ils pourront egalement identifier les incoherences entre le nom et la fonctionnalite d'une entite en cas de renommage dit risque comme lors d’un renommage vers un antonyme. Deuxiemement, les resultats de nos etudes nous fournissent des lecons qui constituent une base de connaissance et de conseils pouvant aider les developpeurs a eviter des renommages inappropries ou inutiles et ainsi maintenir la coherence du lexique de leur code source. ----------ABSTRACT Source code lexicon plays a paramount role in software maintainability: a poor lexicon can lead to poor comprehensibility and increase software fault-proneness. For this reason, developers should maintain their source code lexicon by renaming identifiers when they do not reflect the concepts that they should express. In this thesis, we study lexicon and propose an approach to detect and classify identifier renamings in source code. The renaming detection is based on a combination of source code differencing and data flow analysis, while the renaming classifier uses an ontological database and a natural language parser to classify renamings according to a taxonomy we define. We report a study—conducted on the evolution history of five open-source Java programs—aimed at evaluating the accuracy and completeness of the renaming detector. The study reports a precision of 88% and a recall of 92%. In addition, we report an exploratory study investigating and discussing how identifiers are renamed in the five Java programs, according to our taxonomy. Moreover, we report the challenges and applicability of the proposed approach to PHP programs and report our preliminary results of renaming detection and classification for three programs. This thesis provides two outcomes. First, the renaming detection and classification approach and tool, which can be used for documenting renamings. Developers will be able to, for example, look up methods that are part of the public API (as they impact client applications), or look for inconsistencies between the name and the implementation of an entity that underwent a high risk renaming (e.g., towards the opposite meaning). Second, pieces of actionable knowledge, based on our qualitative study of renamings, that provide advice on how to avoid some unnecessary renamings.