Julia dispose désormais de deux moteurs de débogage,
Debugger.jl et Rebugger.jl, disponibles depuis l'EDI Juno

Malgré la sortie de la version 1.0 du langage de programmation Julia, on ne disposait toujours pas d'un débogueur, dont le développement était en cours depuis des années (Gallium.jl). C'est maintenant chose faite : on dispose d'un débogueur interactif (tant avec une interface graphique qu'en ligne de commande) pour Julia. Celui-ci dispose de points d'arrêt (quelque chose qui a longtemps manqué aux prototypes précédents), notamment lorsqu'une erreur survient ; on peut interagir, exécuter la ligne suivante, etc. Aussi, en pleine session de débogage, on peut modifier le code, tester un correctif et s'assurer qu'il fonctionne bien, sans devoir recommencer toute la session de zéro. Ces fonctionnalités sont disponibles dans l'environnement de développement Juno.


L'interface la plus puissante est néanmoins celle proposée en ligne de commande. On distingue deux approches assez opposées : d'un côté, Debugger.jl (image ci-dessous) propose une interface à base de commandes comme "aller à la ligne suivante" ou "continuer. Ce paquet est assez avancé dans ses possibilités, on peut avoir un contrôle très fin de l'avancée de l'exécution ou entrer dans les détails du générateur pour les fonctions générées (indiquées par le mot clé @generated : les fonctions générées voient leur code obtenu par l'exécution d'une fonction, ce qui donne des possibilités de métaprogrammation extrêmement avancées). On commence une session de débogage en annotant la fonction à lancer avec @enter.


De l'autre, Rebugger.jl propose un nouveau mode dans l'interpréteur (accessible par Alt+I). Contrairement à Debugger.jl, qui fonctionne au niveau d'une fonction, Rebugger.jl travaille avec des expressions. Il peut aussi éditer le code en live (Alt+E).


Ces deux moteurs de débogage sont implémentés comme des paquets Julia, au même titre qu'une bibliothèque de graphiques ou de calcul symbolique. Il n'y a donc pas vraiment d'intégration poussée avec le moteur d'exécution de Julia — tout simplement parce qu'il n'y en a pas besoin, grâce aux possibilités de métaprogrammation offertes par le langage.

Les deux sont construits par-dessus JuliaInterpreter.jl, un interpréteur pour le langage Julia, lui-même écrit en Julia. En effet, malgré son interface agréable en ligne de commande, Julia est implémenté comme un langage compilé à la volée (JIT), pour garantir une excellente performance — au détriment de la facilité de débogage, par exemple.

Ensuite, LowerCodeUtils.jl permet de travailler avec les représentations internes au compilateur du code en cours d'exécution (plus précisément, avec l'arbre syntaxique abstrait, AST). Revise.jl se focalise sur la mise à jour du code : par le fonctionnement compilé de Julia, dès qu'on a importé un paquet, même si les sources changent (parce qu'on a changé de branche pour passer à une version de développement, par exemple), il n'est pas recompilé. CodeTracking.jl fournit une interface par-dessus Revise.jl, notamment pour suivre l'évolution des numéros de ligne où sont définies les fonctions.

Source : A Julia interpreter and debugger.

Et vous ?

Qu'en pensez-vous ?