Simple Science

La science de pointe expliquée simplement

# Informatique# Génie logiciel

Progrès dans les outils de comparaison de code

Un nouvel outil basé sur l'AST améliore la précision de la comparaison de code et la collaboration entre développeurs.

― 9 min lire


Révolutionner lesRévolutionner lescomparaisons de codedans les revues de code.Un nouvel outil améliore la précision
Table des matières

Le logiciel est toujours en train de changer. Les développeurs modifient le code pour ajouter de nouvelles fonctionnalités, corriger des bugs, améliorer la vitesse et garder le code facile à maintenir. À cause de ces changements, les développeurs doivent comprendre le code sur lequel travaillent leurs coéquipiers. Ils passent beaucoup de temps à examiner les modifications apportées au code.

Qu'est-ce que la comparaison de code ?

Une façon courante de comparer les changements dans un logiciel est d'utiliser un outil connu sous le nom de "diff tool". Ces outils montrent les différences entre deux versions d'un fichier, aidant les développeurs à voir ce qui a été ajouté, supprimé ou modifié. Traditionnellement, de nombreux outils comparent les changements en se basant sur les lignes de texte. Cependant, cette méthode a ses problèmes, surtout avec des changements plus compliqués.

Par exemple, comparer simplement des lignes de texte peut ne pas donner l'image complète lorsqu'un développeur refactorise du code, ce qui signifie qu'il change la structure du code sans altérer son comportement. Pour une comparaison plus claire, il est souvent préférable d'analyser le code à un niveau plus profond, en utilisant des structures comme les arbres de syntaxe abstraite (AST). Les AST représentent la structure logique du code, rendant plus facile l'identification des changements de logique et pas seulement de texte.

Les limites des outils basés sur les lignes

La plupart des outils utilisés en codage aujourd'hui comparent le texte ligne par ligne. Cette méthode peut manquer des changements importants, surtout lorsque les développeurs réorganisent le code, renomme des variables ou déplacent du code à d'autres endroits. Ces changements peuvent ne pas sembler significatifs lorsqu'ils sont vus comme du texte brut, mais ils peuvent grandement impacter la fonctionnalité du logiciel.

Les outils basés sur les lignes échouent souvent à montrer l'intention derrière les changements, entraînant de la confusion parmi les développeurs essayant de comprendre la raison d'un changement. Ils pourraient penser qu'une variable a été renommée alors qu'elle a en fait été refactorisée dans une nouvelle méthode. De tels outils ne gèrent pas adéquatement les scénarios complexes qui surviennent dans le développement logiciel moderne.

Une meilleure solution : outils de comparaison basés sur les AST

Pour améliorer cela, certains outils ont été développés utilisant des AST pour la comparaison de code. Ces outils analysent la structure du code source au lieu de regarder du texte brut. De cette façon, ils peuvent mieux comprendre les changements réels effectués et fournir une image plus claire aux développeurs.

Les outils basés sur les AST peuvent capturer divers types de changements plus précisément, comme lorsqu'une méthode est déplacée ou qu'une variable est refactorisée. Ils peuvent aussi montrer plus de détails sur les changements qui pourraient passer inaperçus avec les méthodes traditionnelles. Cependant, même ces outils ont leurs limites.

Problèmes courants avec les outils AST

Malgré les avantages des outils AST par rapport aux outils basés sur les lignes, ils ne sont pas parfaits. Quelques difficultés incluent :

  1. Multi-Mappings : Parfois, un morceau de code peut avoir plusieurs parties correspondantes dans la nouvelle version. Par exemple, quand les développeurs éliminent du code dupliqué, ils peuvent transformer plusieurs déclarations en une seule. De nombreux outils AST ont du mal à représenter ces situations.

  2. Incompatibilité sémantique : En codage, différents éléments peuvent parfois partager la même structure mais avoir des significations différentes. Certains outils pourraient associer incorrectement ces éléments, entraînant une mauvaise compréhension de ce qui a changé.

  3. Connaissance des langages : La plupart des outils ne mettent pas à profit les caractéristiques spécifiques des langages de programmation lors des comparaisons. Cela signifie qu'ils pourraient manquer un contexte important qui pourrait clarifier l'intention d'un changement.

  4. Connaissance du Refactoring : Lorsque les développeurs modifient la structure du code sans changer son comportement, tous les outils ne reconnaissent pas ces changements. Les outils qui ne tiennent pas compte du refactoring pourraient mal interpréter les changements de code.

  5. Analyse au niveau des commits : Tous les outils n'analysent pas les changements au niveau des commits, ce qui signifie qu'ils pourraient manquer des mouvements ou des modifications qui se produisent à travers les fichiers.

Notre outil proposé

Pour relever les défis mentionnés, notre nouvel outil basé sur les AST offre plusieurs améliorations. Voici les caractéristiques clés :

  1. Support des multi-mappings : Notre outil reconnaît efficacement les scénarios où un morceau de code correspond à plusieurs déclarations, permettant une représentation plus précise de l'intention originale.

  2. Éviter les problèmes sémantiques : En comprenant les rôles des différents éléments dans le code (comme les variables ou les appels de méthodes), notre outil s'assure de ne pas faire de correspondances incorrectes basées uniquement sur la structure.

  3. Connaissance du refactoring : L'outil est conçu pour reconnaître divers types de refactoring, fournissant une image plus claire de ce qui a changé dans le code.

  4. Fonctionnalités spécifiques aux langages : En utilisant des indices et des structures spécifiques aux langages de programmation, notre outil améliore effectivement la précision des correspondances entre les éléments.

  5. Analyse au niveau des commits : L'outil prend en compte toutes les modifications au sein d'un commit, reflétant avec précision les mouvements et les changements à travers plusieurs fichiers.

Tester l'outil

Pour valider l'efficacité de notre outil, nous l'avons comparé à d'autres outils à la pointe de la technologie dans plusieurs domaines clés. Nous avons mis l'accent sur les aspects suivants :

  1. Précision des multi-mappings : Nous avons vérifié comment notre outil reconnaissait les changements où plusieurs éléments correspondent les uns aux autres.

  2. Précision sémantique : Nous avons analysé combien de correspondances étaient sémantiquement correctes et si notre outil évitait les incohérences.

  3. Correspondance des éléments de programme : Nous avons examiné à quel point notre outil correspondait avec précision à différents types de déclarations, telles que les méthodes et les champs.

  4. Précision de la correspondance du refactoring : Nous avons enquêté sur la manière dont notre outil a performé pour identifier les changements liés au refactoring.

  5. Performance de la correspondance inter-fichiers : Nous avons testé la capacité de notre outil à détecter les changements qui déplace du code à travers différents fichiers.

  6. Performance globale de l'outil : Enfin, nous avons évalué la performance de l'outil en générant des correspondances précises pour tous les types de changements de code.

Résultats

Nos expériences ont montré que notre outil basé sur les AST surpasse significativement d'autres outils actuels sur tous les critères mentionnés.

Précision des multi-mappings

Notre outil était le seul à gérer avec succès des scénarios impliquant des multi-mappings. D'autres outils ont eu du mal dans ce domaine, entraînant un grand nombre de discordances ou des échecs à reconnaître ces changements complexes. C'était une caractéristique essentielle pour comprendre les pratiques de refactoring courantes parmi les développeurs.

Précision sémantique

Nous avons constaté que notre outil maintenait un taux de précision de 100 % dans la reconnaissance des correspondances sémantiquement compatibles, alors que la plupart des autres outils échouaient significativement à cet égard. Cela a fourni une compréhension plus claire des changements effectués, réduisant la confusion pour les développeurs examinant les changements.

Correspondance des éléments de programme

Lorsque nous avons comparé l'efficacité de la correspondance des éléments de programme, notre outil a obtenu des résultats parfaits, tandis que beaucoup d'autres ont montré une précision et un rappel inférieurs. Cela était particulièrement évident avec les déclarations de méthodes et de champs, où notre outil a utilisé une approche plus structurée.

Précision de la correspondance du refactoring

Notre outil a excellé dans la reconnaissance des changements liés au refactoring, montrant une amélioration significative par rapport à d'autres outils dans ce domaine. Cela a indiqué une compréhension plus profonde de l'intention et de la structure du code.

Performance de la correspondance inter-fichiers

Seul notre outil a réussi à suivre avec précision les mouvements à travers différents fichiers, ce qui est critique pour le développement logiciel moderne. D'autres outils ont soit échoué complètement, soit généré de fausses correspondances, créant une confusion supplémentaire.

Performance globale de l'outil

Dans l'évaluation globale, notre outil s'est imposé comme un leader en précision dans toutes les catégories testées, avec des améliorations substantielles notées dans la complexité et l'étendue des changements de code analysés.

Conclusion

Le développement logiciel moderne est complexe, et à mesure que les outils que les développeurs utilisent évoluent, il est crucial que ces outils s'adaptent à ce paysage changeant. Notre nouvel outil basé sur les AST offre une solution innovante à de nombreux défis rencontrés avec les outils de diff traditionnels, notamment en ce qui concerne la compréhension de l'intention et de la structure des changements.

En nous concentrant sur le support des multi-mappings, la précision sémantique, les fonctionnalités conscientes du langage et une approche d'analyse au niveau des commits, nous fournissons aux développeurs un outil qui améliore considérablement leur capacité à examiner et à comprendre les changements de code. Cela pourrait mener à une productivité accrue et à une meilleure collaboration entre les équipes alors qu'elles naviguent dans les défis du développement logiciel moderne.

Nos conclusions et mises en œuvre représentent un pas en avant dans le domaine des outils de comparaison de code. À l'avenir, nous visons à étendre encore les capacités de notre outil et encourageons d'autres chercheurs et praticiens à explorer de nouvelles directions pour améliorer l'analyse de code.

Source originale

Titre: A Novel Refactoring and Semantic Aware Abstract Syntax Tree Differencing Tool and a Benchmark for Evaluating the Accuracy of Diff Tools

Résumé: Software undergoes constant changes to support new requirements, address bugs, enhance performance, and ensure maintainability. Thus, developers spend a great portion of their workday trying to understand and review the code changes of their teammates. Abstract Syntax Tree (AST) diff tools were developed to overcome the limitations of line-based diff tools, which are used by the majority of developers. Despite the notable improvements brought by AST diff tools in understanding complex changes, they still suffer from serious limitations, such as (1) lacking multi-mapping support, (2) matching semantically incompatible AST nodes, (3) ignoring language clues to guide the matching process, (4) lacking refactoring awareness, and (5) lacking commit-level diff support. We propose a novel AST diff tool based on RefactoringMiner that resolves all aforementioned limitations. First, we improved RefactoringMiner to increase its statement mapping accuracy, and then we developed an algorithm that generates AST diff for a given commit or pull request based on the refactoring instances and pairs of matched program element declarations provided by RefactoringMiner. To evaluate the accuracy of our tool and compare it with the state-of-the-art tools, we created the first benchmark of AST node mappings, including 800 bug-fixing commits and 188 refactoring commits. Our evaluation showed that our tool achieved a considerably higher precision and recall, especially for refactoring commits, with an execution time that is comparable with that of the faster tools.

Auteurs: Pouria Alikhanifard, Nikolaos Tsantalis

Dernière mise à jour: 2024-08-23 00:00:00

Langue: English

Source URL: https://arxiv.org/abs/2403.05939

Source PDF: https://arxiv.org/pdf/2403.05939

Licence: https://creativecommons.org/licenses/by/4.0/

Changements: Ce résumé a été créé avec l'aide de l'IA et peut contenir des inexactitudes. Pour obtenir des informations précises, veuillez vous référer aux documents sources originaux dont les liens figurent ici.

Merci à arxiv pour l'utilisation de son interopérabilité en libre accès.

Plus d'auteurs

Articles similaires