Rétro ingénierie des modèles d’objets dynamiques pour JavaScript
Thesis or Dissertation
Abstract(s)
La compréhension des objets dans les programmes orientés objet est une tâche impor-
tante à la compréhension du code. JavaScript (JS) est un langage orienté-objet dyna-
mique, et son dynamisme rend la compréhension du code source très difficile. Dans ce
mémoire, nous nous intéressons à l’analyse des objets pour les programmes JS. Notre
approche construit de façon automatique un graphe d’objets inspiré du diagramme de
classes d’UML à partir d’une exécution concrète d’un programme JS. Le graphe résul-
tant montre la structure des objets ainsi que les interactions entre eux.
Notre approche utilise une transformation du code source afin de produire cette in-
formation au cours de l’exécution. Cette transformation permet de recueillir de l’infor-
mation complète au sujet des objets crées ainsi que d’intercepter toutes les modifications
de ces objets. À partir de cette information, nous appliquons plusieurs abstractions qui
visent à produire une représentation des objets plus compacte et intuitive. Cette approche
est implémentée dans l’outil JSTI.
Afin d’évaluer l’utilité de l’approche, nous avons mesuré sa performance ainsi que le
degré de réduction dû aux abstractions. Nous avons utilisé les dix programmes de réfé-
rence de V8 pour cette comparaison. Les résultats montrent que JSTI est assez efficace
pour être utilisé en pratique, avec un ralentissement moyen de 14x. De plus, pour 9 des 10
programmes, les graphes sont suffisamment compacts pour être visualisés. Nous avons
aussi validé l’approche de façon qualitative en inspectant manuellement les graphes gé-
nérés. Ces graphes correspondent généralement très bien au résultat attendu.
Mots clés: Analyse de programmes, analyse dynamique, JavaScript, profilage. Understanding of objects in object-oriented programs is an important task for understanding the code. JavaScript (JS) is a dynamic object-oriented language, Its dynamic nature makes understanding its source code very difficult. In this thesis, we focus on object analysis in JS programs to automatically produce a graph of objects inspired by UML class diagrams from an execution trace. The resulting graph shows the structure of the objects as well as their interconnections. Our approach uses a source-to-source transformation of the original code in order to collect information at runtime. This transformation makes it possible to collect complete information with respect to object creations and property updates. From this information, we perform multiple abstractions that aim to generate a more compact and intuitive representation of objects. This approach has been implemented in the JSTI prototype.
To evaluate our approach, we measured its performance and the graph compression achieved by our abstractions. We used the ten V8 benchmarks for this purpose. Results show that JSTI is efficient enough to be used in practice, with an average slowdown of around 14x. Moreover, for 9 out of the 10 studied programs, the generated object graphs are sufficiently small to be visualized directly by developers. We have also performed a qualitative validation of the approach by manually inspecting the generated graphs. We have found that the graphs generated by JSTI generally correspond very closely to the expected results.
Keywords: Program analysis, dynamic analysis, JavaScript, profiling.
This document disseminated on Papyrus is the exclusive property of the copyright holders and is protected by the Copyright Act (R.S.C. 1985, c. C-42). It may be used for fair dealing and non-commercial purposes, for private study or research, criticism and review as provided by law. For any other use, written authorization from the copyright holders is required.