Ce chapitre présente les concepts de Analyse de code tels qu'intégrés dans EcoStruxure Machine Expert.
Le schéma suivant propose une vue d'ensemble des principaux composants logiciels de Analyse de code :
Ces composants peuvent être classés dans trois catégories :
Les composants de l'interface utilisateur qui affichent des données :
Éditeurs permettant d'écrire du code source
Éditeurs permettant de visualiser les résultats concernant les métriques ou les conventions, ou la structure du code source sous forme graphique
Les modèles de données utilisés comme entrée ou sortie pour d'autres composants :
Modèle de langage
Modèle de dépendance
Modèle RDF (Resource Description Framework)
Résultats de requête
Les composants qui transforment des données :
Le compilateur de code source (avec modèle de langage en sortie) vérifie la syntaxe du code source et crée le modèle de langage qui permet de générer le code exécuté sur des contrôleurs.
L'analyseur de code source (avec modèle de dépendance en sortie) analyse le modèle de langage, le transforme en modèle de dépendance et met à jour le modèle de dépendance.
Le générateur de modèles RDF (avec modèle RDF en sortie) transforme le modèle de dépendance en modèle RDF pour faire le lien avec les technologies de Web sémantique.
Le moteur d'exécution de requêtes (avec résultats de requête en sortie) exécute des requêtes SPARQL sur le modèle RDF afin d'obtenir les résultats correspondants.
L'application est analysée et un modèle de dépendance est généré.
Le modèle de dépendance est constitué de nœuds connectés via des fronts.
Exemples de types de nœuds :
Type de nœud |
Description |
---|---|
Bloc fonction |
Bloc fonction (FB) dans le modèle de dépendance. Créé pour chaque bloc fonction ajouté au projet EcoStruxure Machine Expert. |
Programme |
Programme (PRG) dans le modèle de dépendance. Créé pour chaque programme ajouté au projet EcoStruxure Machine Expert. |
Fonction |
Fonction (FC) dans le modèle de dépendance. Créé pour chaque fonction ajoutée au projet EcoStruxure Machine Expert. |
... |
... |
Exemples de types de fronts :
Type de front |
Description |
---|---|
Lecture |
Opération de lecture depuis le code (source) vers un nœud de variable (cible). |
Écriture |
Opération d'écriture depuis le code (source) vers un nœud de variable (cible). |
Appel |
Appel d'un élément (bloc fonction, méthode, action, programme, etc.) depuis le code (source) vers un nœud cible. |
Extension |
Extension d'un type de base. Exemple : extension d'un bloc fonction par un autre bloc. |
... |
... |
L'analyseur de code source est un composant important de l'analyse de code source qui transforme le modèle de langage en modèle de dépendance (les données d'analyse).
Cet analyseur s'appuie sur le concept des phases d'analyse, qui permet de simplifier le processus et d'optimiser les performances (du point de vue de la mémoire et du processeur).
Exemple :
L'analyse de code permettant d'obtenir les dépendances d'extension et d'implémentation est plus rapide comparé à celle renvoyant les dépendances d'appel, de lecture ou d'écriture.
Pour obtenir la liste des blocs fonction et des dépendances d'extension et d'implémentation, vous pouvez arrêter l'analyse à un niveau de profondeur spécifique.
Si vous avez besoin de plus de détails, augmentez la profondeur de l'analyse pour les éléments souhaités (pour visualiser des blocs fonction spécifiques dans la vue de dépendance, par exemple) ou pour les objets du projet (pour obtenir les résultats sur les métriques, par exemple).
Phases d'analyse pertinentes pour l'utilisateur :
Les trois approches suivantes sont pertinentes :
Profondeur minimale d'analyse (étape 1+2) : Contenu visible dans le projet et dans les navigateurs EcoStruxure Machine Expert.
Blocs fonction, programmes, fonctions, DUT, etc.
Propriétés et méthodes Get/Set associées
Méthodes
Actions
Informations structurelles (dossier, etc.)
Références de bibliothèques
Avec cette profondeur, l'analyse prend le moins de temps.
Profondeur d'analyse intermédiaire (étape 3+4) : Niveau suivant d'informations du code source.
Exemple :
Variables
Lecture des dépendances de variable
Écriture des dépendances de variable
Appel des méthodes, fonctions, blocs fonction, programmes, etc.
Cette profondeur d'analyse demande plus de temps.
Profondeur maximale d'analyse (étape 5) : Informations de mesure basées sur l'implémentation (code source).
Exemple :
Halstead Complexity
Lines Of Code (LOC)
...
Avec cette profondeur, l'analyse prend le plus de temps. Réservé aux métriques ou aux conventions.
Ouverte et flexible, la fonction d'analyse de code s'appuie sur plusieurs technologies de Web sémantique, notamment :
Structure Resource Description Framework (RDF) - Modèle RDF
Consultez la page https://en.wikipedia.org/wiki/Resource_Description_Framework.
Base de données RDF (base de données de Web sémantique) - espace Triple Storage RDF
Consultez la page https://en.wikipedia.org/wiki/Triplestore.
Protocole SPARQL et langage de requête RDF - SPARQL
Consultez le document https://en.wikipedia.org/wiki/SPARQL.
Le modèle de dépendance est généré suite à une opération d'analyse de code.
Il est synchronisé avec un modèle RDF pour faire le lien avec une fonction d'analyse de code ouverte et flexible qui prend en charge le langage de requête.
Pour permettre l'analyse de projets volumineux, le modèle RDF appartient à un processus séparé appelé
.Le
est utilisé par défaut. Au besoin, il est possible de configurer son comportement à l'aide du .La structure Resource Description Framework (RDF) désigne un modèle de données décrivant des ressources ainsi que les relations qui les lient.
Exemple :
:(Sujet) |
:(Prédicat) |
:(Objet) |
---|---|---|
|
|
|
|
|
|
|
|
|
SPARQL est l'acronyme de « Sparql Protocol and RDF Query Language ». La spécification SPARQL (https://www.w3.org/TR/sparql11-overview/) définit les langages et protocoles qui permettent d'interroger et de manipuler des graphes RDF (à l'instar des requêtes SQL).
Exemple de requête SPARQL simple permettant d'obtenir l'ID de nœud et le nom des blocs fonction d'un modèle RDF :
SELECT ?NodeId ?Name
WHERE {
# Select all FunctionBlocks and their names
?NodeId a :FunctionBlock ;
:Name ?Name .
}