L'IA peut documenter le code source des programmes

En matière de développement informatique et en particulier ici, nous traitons du domaine de la CAO, il est d’usage de partir d’une idée de base, de la développer sous la forme d’algorithme, qui n’est pas n’est pas un langage informatique, mais une description logique des fonctionnalités d’un futur programme, puis ensuite de passer à la codification informatique de cet algorithme pour écrire ce programme.

Mais voici que grâce à l’intelligence artificielle dont nous parlons beaucoup depuis un an ou deux, une nouvelle possibilité s’offre à nous, celle de déduire une algorithmique, ou du moins un fonctionnement d’un programme informatique dont nous n’avons que le code source. C’est très généralement le cas des routines AutoLISP pour AutoCAD® qui sont souvent, il faut le dire, pas du tout documentées ou très peu documentées.

Et dans ce but la société Anthropic nous fournit quelques exemples de prompt d’intelligence artificielle et en particulier celui ci qui sert à clarifier du code.

Je prendrai l’exemple d’un petit programme AutoLISP très ancien que j’avais écrit il y a bien longtemps, qui ne fait rien de bien extraordinaire mais qui n’est guère documenté. Voici le code source de ce programme qui est cité dans cet article:

;|
Programme :	SAME.LSP
Fonction :	Lance la commande qui a permis de créer l'objet sélectionné (Run the command which created the chosen object)
Auteur :	Patrick EMIN
Version : 	1.01 par Richard TRIBES
Date :		13/03/2000
Version 1.00 :	14/06/1999
|;

(defun c:SAME (/ entite data commande couleur type_ent calque typeligne textestyle cotstyle blocname type_cote largeur_poly country bylayer_property)
   (setvar "cmdecho" 0)
   (setq country (if (wcmatch (strcase (getvar "LOCALE")) "*FR*") 0 1));	0=francais 1=anglais
   (setq entite (car (entsel (if (= country 0) "\nSélectionner un objet :" "\nSelect an object:")))
      data (entget entite)
      type_ent (cdr (assoc 0 data))
      calque (cdr (assoc 8 data))
      couleur (cdr (assoc 62 data))
      typeligne (cdr (assoc 6 data))
      v_celtscale (cdr (assoc 48 data))
      textestyle (cdr (assoc 7 data))
      v_cotstyle (cdr (assoc 3 data))
      blocname (cdr (assoc 2 data))
      hauteur (cdr (assoc 40 data))
      largeur_poly (cdr (assoc 43 data))
      type_cote  (cdr (assoc 70 data))
      bylayer_property (if (= country 0) "BYLAYER" "BYLAYER")
   );end setq
      
   (setvar "CLAYER" calque)
   (if v_celtscale (setvar "CELTSCALE" v_celtscale) (setvar "CELTSCALE" 1))
   (if couleur (setvar "CECOLOR" (itoa couleur)) (setvar "CECOLOR" bylayer_property))
   (if v_celtscale (alert (if (= country 0) "Attention, la variable CELTSCALE a été modifié,\nremettez la à 1 après la fin de la commande" "Warning: CELTSCALE has been changed!")))
   (if typeligne (setvar "CELTYPE" typeligne) (setvar "CELTYPE" bylayer_property))
   
   (cond
      ((= type_ent "TEXT")
         (progn
            (setq commande "DTEXT")
            (setvar "TEXTSIZE" hauteur)
            (setvar "TEXTSTYLE" textestyle)
         );end progn
      );end cond=TEXT
      ((= type_ent "CIRCLE")
          (progn       
            (setvar "CIRCLERAD" hauteur)
            (setq commande "CIRCLE")
          );end progn
      );end cond=CIRCLE
      ((= type_ent "LWPOLYLINE")
            (progn
               (setq commande "PLINE")
               (setvar "PLINEWID" largeur_poly)
            );end progn
      );end cond=LWPOLYLINE
      ((= type_ent "DIMENSION")
         (progn
            (cond
               ((= (logand type_cote 5) 5) (setq commande "DIMANGULAR"))
               ((= (logand type_cote 4) 4) (setq commande "DIMRADIUS"))
               ((= (logand type_cote 3) 3) (setq commande "DIMDIAMETER"))
               ((= (logand type_cote 2) 2) (setq commande "DIMANGULAR"))
               ((= (logand type_cote 1) 1) (setq commande "DIMALIGNED"))
               ((= (logand type_cote 0) 0)  (setq commande "DIMLINEAR"))
            );end cond
         );end progn
      );end cond=DIMENSION
      ((= type_ent "HATCH")
         (progn
            (setvar "HPNAME" (cdr (assoc 2 data)))
            (if (cdr (assoc 52 data)) (setvar "HPANG" (cdr (assoc 52 data))))
            (if (cdr (assoc 77 data)) (setvar "HPDOUBLE" (cdr (assoc 77 data))))
            (if (cdr (assoc 41 data)) (setvar "HPSCALE" (cdr (assoc 41 data))))
            (if (cdr (assoc 41 data)) (setvar "HPSPACE" (cdr (assoc 41 data))))
            (setq commande "BHATCH")
         );end progn
      );end cond=HATCH
      (T (setq commande type_ent))
   );end cond
   (cond
      ((or (= type_ent "INSERT") (= type_ent "MINSERT")) (command "_INSERT" blocname))
      (T (command (getcname (strcat "_" commande))))
   );end cond
   
   (princ)
); end defun same
(princ)

Et voici donc le résultat du traitement par une intelligence artificielle, en l’occurrence ChatGPT 4 qui nous décortique ce programme et qui nous donne des indications sur son fonctionnement.

Ce code est un script AutoLISP pour le logiciel de conception assistée par ordinateur (CAO) AutoCAD®, développé par Autodesk®. AutoLISP est un langage de programmation spécifique à AutoCAD® qui permet aux utilisateurs de créer des commandes personnalisées pour automatiser des tâches spécifiques.

Le script est nommé « SAME » et son but principal est de lancer la commande qui a été utilisée pour créer un objet spécifique dans un dessin AutoCAD®. Par exemple, si un utilisateur a créé un cercle dans son dessin, ce script peut être utilisé pour lancer automatiquement la commande « Cercle » lorsqu’il sélectionne ce cercle.

Voici une explication détaillée de certaines parties clés du script :

1. Les variables : Le script utilise plusieurs variables pour stocker diverses informations sur l’objet sélectionné, comme son type (cercle, ligne, texte, etc.), la couche sur laquelle il se trouve, sa couleur, son style de ligne, etc.

2. La sélection de l’objet : L’utilisateur est invité à sélectionner un objet dans le dessin. Le script récupère ensuite les informations sur cet objet (comme son type, sa couleur, etc.) et les stocke dans les variables appropriées.

3. Le lancement de la commande : En fonction du type d’objet sélectionné, le script lance la commande appropriée. Par exemple, si l’objet est un texte, la commande « DTEXT » est lancée ; si l’objet est un cercle, la commande « CIRCLE » est lancée, etc.

4. Les conditions : Le script utilise une structure conditionnelle (la fonction « cond ») pour déterminer quelle commande lancer en fonction du type d’objet. Chaque type d’objet a sa propre section dans cette structure conditionnelle.

5. Les ajustements de propriétés : Pour certains types d’objets, le script ajuste certaines propriétés avant de lancer la commande. Par exemple, pour un cercle, le script ajuste la variable « CIRCLERAD » pour qu’elle corresponde à la hauteur de l’objet sélectionné.

Globalement, ce script est un outil pratique qui peut aider les utilisateurs d’AutoCAD® à gagner du temps en lançant automatiquement les commandes appropriées lorsqu’ils sélectionnent un objet dans leur dessin.