# Adaptive Communication Environment

L'ACE (Adaptive Communication Environment, ou environnement de communication adaptatif) est un environnement de programmation orientée objet, il est open source et est écrit en C++. ACE contient plusieurs composants qui simplifient le développement de logiciel de communication augmentant ainsi la flexibilité, l’efficacité, l'interopérabilité, la fiabilité et la portabilité. Les composants de l’ACE fournissent différents services comme la communication inter-processus (IPC), la gestion de mémoire, la synchronisation, la gestion des tâches, la gestion d’événements, la configuration de services répartis, …

## Quelques avantages d’ACE

* Augmentation de la portabilité : les composants ACE rendent simple l’écriture d’applications réseaux concurrentes ou autres sur un OS et de le porter vers un autre OS.
* Augmentation de la qualité du logiciel : les composants ACE sont conçus à partir de modèles clés (Design Patterns) qui augmente la qualité, la portabilité, l'interopérabilité ainsi que la reutilisabilité et la modularité des logiciels de communications.
* Augmentation de l’efficacité et de la prévisibilité : ACE est conçu pour supporter une large gamme d’applications qui requièrent une qualité de service (QoS), comme de faibles temps de latence, de haute performance, et la prévisibilité pour des applications temps-réel.
* Ce middleware (logiciel intermédiaire) nous évite de coder en dur des applications comme les applications client-serveur avec des dépendances de langage, de système d’exploitation, de matériel, …

## Architecture d’ACE

L’ACE est conçu en trois couches de base :
* La couche d’adaptation au système d’exploitation
* La couche wrapper C++
* La couche framework et pattern
La couche d’adaptation au système d’exploitation (OSAL : Operating system adaptation layer)
OSAL est une fine couche de code C++ qui se trouve entre la bibliothèque C (API) du système d’exploitation et le reste de l’ACE. Cette couche nous évite d’être dépendant de la plate-forme de développement (OS), ce qui implique que le code écrit avec ACE est relativement indépendant, donc portable. C’est ce qui explique pourquoi le framework ACE fonctionne sur de nombreux systèmes d’exploitation comme VxWorks, Chorus, LynxOS, RTEMS, Win32, Solaris, Debian, RedHat, …
L’OSAL encapsule donc les fonctions de l’API de l’OS c’est-à-dire que cette couche fournit une base commune de fonctions systèmes à travers toutes les plateformes où ACE est porté.
La couche wrapper C++
Cette couche contient des classes C++ qui encapsulent des fonctions et des données dans des interfaces orientées objets. Cette couche est la plus grande partie de l’ACE, elle contient 50 % du code total.
Les « wrapper » C++ fournissent les mêmes services que l’OSAL, sauf que les fonctions sont organisées en classes et en objets, ce qui facilite l’utilisation de l’ACE, de plus, l’utilisation du C++ rend l’application robuste car les wrappers C++ sont fortement typés, donc le compilateur peut détecter une violation de type à la compilation plutôt qu’a l’exécution (contrairement aux API C de l’OS comme les sockets où une violation de type n’est détectée qu’à l’exécution). Les applications utilisent les classes wrappers via l’héritage, l’agrégation, et/ou l’instanciation.
La couche framework et pattern
La couche framework est la couche de plus haut niveau de l’ACE. Cette couche s’appuie sur plusieurs design patterns spécifiques au domaine du logiciel de communication.
Les Patterns fournissent des solutions à des problèmes logiciels communs surgissant dans certains contextes, ce sont des façons de programmer éprouvées et réputées pour apporter des propriétés comme la cohérence, la robustesse, la reutilisabilité, etc.
Les frameworks sont des applications « semi-complete » qui peuvent être vus comme étant des implémentations concrètes de design pattern et qui ont pour but de fournir une structure et des fonctionnalités spécifiques à un domaine, c'est-à-dire qu'un framework est une collection de classes qui collabore pour produire une architecture réutilisable pour une famille d'applications.

## Les différents Framework ACE

Reactor : Interface de traitement d’événement synchrone provenant de différentes sources (Timers, I/O, signaux). Il implémente donc, la détection d’événements de manière synchrone, le démultiplexage et la diffusion d’événements
Acceptor – Connector : Établit une connexion entre un client (connector) et un serveur (Acceptor) en permettant aux applications de configurer les propriétés clefs de leur topologie de connexion (Socket UNIX, UDP, TCP…), indépendamment des services qu'ils fournissent.
Task : Forme un modèle concurrent qui donne une stratégie de gestion de mémoire de message et de synchronisation.
Proactor : Interface de traitement d’événement I/O asynchrone. Il permet donc, de demultiplexer et de répartir efficacement des événements déclenchés par l'achèvement d'opérations d'entrée-sortie asynchrones.
Streams : Fournit une structure pour des systèmes traitant des flots de données. Il compose donc, des services en couches et transmet des messages (entre ces couches).
Service Configurator : Interface de configuration d’application (à l’exécution). Il découple le comportement des services du moment où les implémentations de ces services sont configurées dans des processus d'application.