lundi 24 février 2025

Algorithmes, architectures, technologies pour les logiciels

 Des choix sont à faire par les concepteurs des logiciels sur leurs architectures, leurs technologies. Ils visent à répondre au mieux aux caractéristiques attendues.

Les logiciels sont proposés sur le marché ou utilisés en interne. Les choix portent sur l’ensemble des logiciels de l’entreprise ou sur une partie de cet ensemble.

On trouvera ci-après une présentation, une analyse de choix possibles.

Des algorithmes sont à choisir ou à définir pour la réalisation des logiciels. Ils sont parfois très complexes. Ils sont standard ou définis sur mesure.

L'objectif est que les logiciels réalisés sur leur base fournissent des réponses pertinentes dans les délais prévus, que leurs temps de traitement soient optimisés, compte tenu des caractéristiques de leur environnement technique d'exécution. On cherche à réduire le nombre des opérations élémentaires à réaliser, ainsi que la taille mémoire nécessaire, sans dégrader la pertinence des résultats.

Le choix des algorithmes est fondamental dans certains domaines, comme ceux qui relèvent de l'IA, de la sécurité. Les applications d’intelligence artificielle sont en général fondées sur une association d’algorithmes : apprentissage automatique, raisonnement automatisé, exploration d’arborescences (GOFAI – good old-fashioned artificial intelligence)... 

La conception des algorithmes nécessite souvent des expertises dans les domaines concernés (recherche scientifique, diagnostic technique, médical...). Leur logique fonctionnelle est à définir par des experts du domaine.

Chiffrement/déchiffrement

Les algorithmes de chiffrement/déchiffrement se caractérisent par la difficulté à les casser, leur consommation de puissance machine, leur rapidité.

Optimisation, exploration d'arborescences

Des problèmes comme celui du plus court chemin correspondent à l'optimisation d'un ensemble de choix, pouvant être représenté par une arborescence. Des algorithmes comme minimax, l'élagage alpha-bêta, permettent d'optimiser leur exploration. Ils se caractérisent par exemple par la complétude de l’exploration, la pertinence de la réponse trouvée au regard du délai d’exploration.

Pour certains domaines, la complexité est trop grande pour qu'il soit possible d'explorer toutes les possibilités de choix dans un délai acceptable. Des algorithmes comme ceux de Las Vegas, de Monte Carlo, d'Atlantic City, permettent dans une partie des cas de trouver des solutions acceptables dans le délai attendu.

Reconnaissance de l'image, des sons

Des algorithmes sont utilisables pour la reconnaissance des objets, le contrôle de présence d'un objet, la reconnaissance de formes écrites, des sons, l'analyse des vidéos, l'identification des personnes... Les critères de choix sont en général relatifs au pourcentage d’erreurs (faux positifs, faux négatifs…).

Traitement du langage naturel

Des algorithmes existent pour le traitement du langage naturel : reconnaissance vocale, de l'écrit (incluant celle des sons, de l'image), analyse orthographique, syntaxique, sémantique, traduction dans un autre langage naturel, dialogue automatique, génération automatique de textes, correction orthographique, syntaxique, recherche d'informations dans les textes, classification des textes, analyse des émotions (opinion mining)...

Ils portent sur un texte quelconque, par exemple sur des demandes faites à un SI (commande à exécuter, informations de référence). 

Ils peuvent nécessiter l’utilisation de dictionnaires, de grammaires. Ils se heurtent aux ambiguïtés, à la polysémie, aux dépendances par rapport au contexte, à l’inexistence d’une grammaire exhaustive, d’une syntaxe parfaitement définie, d’un lexique fermé.

Ils se caractérisent par la pertinence des réponses : nombre d’erreurs, qualité de la traduction…

Raisonnement automati

1) Des algorithmes de raisonnement automatisé sont utilisables pour les assistants de preuve, la démonstration automatique de théorèmes, la vérification de preuve.

2) Les systèmes experts proposent des solutions à des problèmes à partir d’un raisonnement automatisé s’appuyant sur une base de règles, une base defaits, qui contient les faits relatifs au problème à résoudre, et un moteur d’inférence.

Les « règles » sont des règles logiques, des dictionnaires, des grammaires, des formules mathématiques, des règles de gestion… Les règles utilisées,dites règles de production, s’expriment sous la forme « Si condition(s), alors conclusion(s )». Ces règles sont aussi des informations, utilisées pour construire les systèmes ou enregistrées pour être exploitées si nécessaire.

Les systèmes experts aident à la résolution de problèmes dans un domaine. Le moteur d'inférence s'appuie sur les faits et les règles pour produire de nouveaux faits, et arriver au final à la résolution du problème posé.

Les connaissances (faits et règles) doivent pouvoir être formalisées, enrichies en permanence, notamment à partir de l’expérience du traitement lui-même. Elles ne sont pas obligatoirement complètes et cohérentes.

Ces algorithmes sont utilisables notamment pour l'aide au diagnostic.

Ils se caractérisent par la pertinence des réponses, le nombre d’erreurs de raisonnement…

Modélisation numérique des données

Les algorithmes de modélisation numérique des données les plus répandus sont fondés sur des méthodes statistiques (par exemple l'analyse en composantes principales, l'analyse factorielle des correspondances, l'analyse canonique), l'utilisation d'arbres de décision. Ils sont utilisés par de nombreux autres algorithmes (apprentissage automatique, reconnaissance d’images…)

Les fonctions numériques constituant le modèle sont susceptibles d'être exprimées sous la forme de réseaux de neurones artificiels. Des choix sont à faire sur l’architecture des réseaux : nombre de neurones, de couches, réseaux convolutifs...

Les algorithmes se caractérisent par leur puissance, leur aptitude à trouver un modèle pertinent, leur explicabilité.

Apprentissage automatique (machine learning)

Des algorithmes sont utilisables pour l'apprentissage automatique des machines. Ils permettent à un logiciel de calculer automatiquement un modèle, c’est-à-dire les paramètres à appliquer pour une fonction (entraînement) à partir d'un ensemble de données (observations, résultats attendus…). L’apprentissage est supervisé, par renforcement ou non supervisé.

L'apprentissage automatique est appliqué à des réseaux de neurones artificiels. Si le réseau est multicouches, l'apprentissage est dit profond (deep learning).

Les algorithmes se caractérisent par la pertinence de l’apprentissage, évaluée à partir de tests de la fonction.

Une fois entraînée, la machine détermine des résultats opérationnels sur la base du modèle calculé.

IA générative

Les algorithmes d’IA générative appliquent un apprentissage automatique non supervisé ou auto-supervisé à un ensemble de données. Ils sont utilisés en réponse à des « invites », exprimées en langage naturel, dans les domaines du texte, du code, des images, des molécules, de la musique, de la vidéo (génération de textes, de code source, d’images, d’acides aminés, d’échantillons musicaux, de clips vidéo).

Les ensembles de données nécessaires sont gigantesques.

Classification des objets (ou des individus, des connaissances)

Des choix sont à faire sur la nature des algorithmes à utiliser pour affecter une classe (ou catégorie) à un objet (ou à un individu) non classé, et définir des classes (ou catégories) pour un ensemble d'objets non classés. Il peut s'agir d'algorithmes de modélisation numérique des données, d'apprentissage automatique.

Simulation numérique

Les algorithmes de simulation de vol, par exemple, fonctionnent sur la base d'un modèle de vol fondé sur les équations de l'aérodynamique.

Jeux numériques

Des algorithmes d'exploration d'arborescences sont utilisables pour les jeux.

Le programme AlphaGo utilise des algorithmes de deep learning.

Pilotage des robots, des moyens de transport

Le pilotage des véhicules autonomes a besoin d'algorithmes de traitement de l'image (pour analyser son environnement), de décision relative aux itinéraires, au pilotage (arbres de décision...).

Trading haute fréquence

Des algorithmes sont utilisables pour analyser le carnet d'ordres, servir les petits ordres, et organiser le carnet d'ordres dans le sens voulu.

Un logiciel de grande taille est en général difficile à développer, à maintenir, à faire évoluer. Un des objectifs des choix d’architecture est de structurer les logiciels en composants, internes ou externes, de façon qu’ils soient maîtrisables, qu’une mise au point progressive soit possible, que les composants présentent une bonne cohésion fonctionnelle et soient faiblement couplés, que des composants standard soient utilisables.

Chaque composant à développer est susceptible d'être affecté à une équipe, ou une personne.

Architectures monolithiques

Ce type d'architecture est utilisable pour les logiciels de petite taille. Un seul programme traite toutes les fonctions attendues, gère les données.

Architectures en appels et retours

Architectures logicielles fondées sur le découpage d'une fonctionnalité en sous-fonctionnalités, puis en sous-sous-fonctionnalités... L'architecture distribuée est dérivée de cette architecture : les logiciels relatifs aux sous-fonctionnalités sont implantés sur des SI, des équipements différents.

Architectures en flot de données, orientées événements

Architectures (dataflow) de composants logiciels reliés par des flux de données. Chaque composant réalise des traitements plus ou moins élaborés.

Les architectures orientées événements relèvent de cette catégorie. Les services s'abonnent aux événements qu'ils souhaitent traiter. Ils les traitent, et publient les opérations qu'ils ont réalisées.

Architectures orientées objet

Dans les architectures orientées objet, les composants logiciels sont des objets, c’est-à-dire des « briques » logicielles rassemblant la descriptiontechnique des données relatives à un sujet et les traitements (méthodes) réalisés à partir de ces données. Ce sont des entités identifiables, encapsulées, fournissant des services. Des patrons de conception (design patterns), des frameworks sont utilisables pour construire le logiciel. Ce type d’architecture réduit les délais et les coûts de développement, les coûts de maintenance.

Par rapport aux autres types d'architectures des logiciels, les architectures orientées objet facilitent la réutilisation, permettent un cycle de vie itératif, la structuration du logiciel, un haut niveau d'abstraction, offrent des facilités d'extension. Ces architectures sont modulaires.

Architectures en couches

Les fonctions des logiciels sont souvent réparties en couches. Les couches supérieures appellent des fonctions des couches inférieures. Ce type d’architecture facilite les modifications du logiciel.

Pour un logiciel applicatif, les couches sont par exemple :

– présentation, interaction physique et logique ;

– contrôle du dialogue ;

– interaction avec les opérations arithmétiques et logiques ;

– opérations arithmétiques et logiques ;

– stockage et accès aux informations.

Pour un OS, les couches sont par exemple :

– interface utilisateur, interpréteur de commandes permettent à l’utilisateur d’accéder aux fonctions qui lui sont offertes;

– allocation des ressources (planification du travail) ;

– gestion des fichiers ;

– organisation des entrées/sorties ;

– gestion de la mémoire ;

– noyau : gestion des processus, gestion des interruptions, allocation du CPU.

Architectures orientées agents

Dans ces architectures les composants logiciels sont des agents. Elles sont adaptées aux architectures SOA, aux systèmes nécessitant une prise de décision distribuée (souvent sous incertitude), à la planification et l’ordonnancement en temps réel, aux robots autonomes coopératifs, aux jeux vidéo massivement multijoueurs. 

Microservices

Les logiciels applicatifs complexes sont découpés en processus de petite taille et faiblement couplés.

Les programmes sources sont écrits directement, ou (moins souvent) générés automatiquement à partir d’un langage synthétique. Des langages de programmation sont à choisir. Un bon langage doit être clair, concis, sûr (fiable, robuste, peu sujet à erreurs), modulaire, portable, efficace, facile à maintenir et à tester, productif, performant. L’existence d’une bibliothèque de composants logiciels est un atout. La nature du langage a un impact sur le nombre d’erreurs de programmation, sur la difficulté de compréhension d’un programme existant.

Il existe actuellement plus de 600 langages de programmation. Le choix du langage dépend notamment des caractéristiques des programmes à écrire (nature des fonctions, taille des programmes, environnement d'exécution cible), de la culture technique de l’organisation, des autres choix d’architecture et de conception.

Le langage choisi doit permettre d’écrire simplement et naturellement les instructions correspondant aux spécifications des programmes ou aux algorithmes définis, d’en assurer facilement la mise au point et la maintenance ultérieure. Il doit offrir des possibilités de paramétrisation, de modularisation, de regroupement « naturel » des traitements et des données, cohérent, avec le moins de couplages possibles. En général le code doit être réutilisable.

Cobol a été très utilisé dans le passé pour les logiciels de gestion. Les langages Python, C, C++, Java étaient les plus populaires en 2024 (Index TIOBE).

Des solutions low code et no code sont utilisées.

Aucun commentaire:

Enregistrer un commentaire