Mémoire
Exécution de Programme, Mémoire et Références
1 Introduction
La gestion de la mémoire et la compréhension des références sont des concepts fondamentaux en programmation orientée objet (POO). Ces éléments influencent non seulement la conception d'un programme mais également son implémentation et son optimisation. Bien qu'ils soient universels, leur mise en œuvre et leur gestion peuvent varier significativement selon les langages de programmation utilisés, notamment ceux d'usage courant comme Python, Java et C++.
2 Organisation de la Mémoire pour l’Exécution des Programmes
2.1 Vue d’Ensemble de la Mémoire d’un Ordinateur
La mémoire d'un ordinateur est gérée par le système d'exploitation, qui alloue et libère des segments de mémoire en fonction des besoins des programmes en cours d'exécution. Chaque programme reçoit une portion distincte de mémoire, appelée mémoire privée. Cette mémoire a une taille fixe, déterminée lors de l'allocation, et elle est restituée au système à la fin de l'exécution du programme, permettant ainsi une gestion efficace des ressources.
2.2 Composants de l'Espace Mémoire d’un Programme
L'espace mémoire d'un programme est généralement divisé en plusieurs segments pour optimiser le stockage et la récupération des données. Deux des principaux segments sont :
La pile (Stack) : Cette zone de mémoire est responsable du stockage des paramètres de fonction, des variables locales, et des informations de retour des sous-programmes. Elle fonctionne sur le principe de LIFO (dernier arrivé, premier sorti), ce qui signifie que le dernier élément ajouté est le premier à être retiré, garantissant ainsi un accès rapide et efficace aux données temporaires.
Le tas (Heap) : Contrairement à la pile, le tas est utilisé pour stocker des objets et des tableaux qui ne sont pas nécessairement de taille fixe. Les objets créés dans le tas existent jusqu'à ce qu'ils ne soient plus référencés ou nécessaires. La gestion de cette zone de mémoire peut être complexe car la durée de vie des objets dépend de la façon dont ils sont référencés et de la collecte des objets non utilisés, comme c'est le cas avec le Garbage Collector en Java.
3.3 Pile (Stack)
La pile est particulièrement dédiée aux fonctions et aux méthodes. Chaque méthode en cours d'exécution a un espace réservé spécifique pour stocker ses paramètres et ses variables locales. Par exemple, en Java, lorsqu'une méthode est appelée, un nouveau cadre d'exécution est créé sur la pile, contenant toutes les informations nécessaires pour cette méthode, y compris, mais sans s'y limiter, les données d'entrée et l'adresse de retour.
3.4 Tas (Heap)
Le tas offre une flexibilité supplémentaire en matière d'allocation de mémoire. Les objets stockés dans le tas restent en mémoire tant qu'ils sont nécessaires. Si un objet n'est plus référencé, sa mémoire est automatiquement libérée par le Garbage Collector de Java, permettant une gestion dynamique des ressources mémoire.
3.5 Affectation et Passage de Paramètre
Par rapport à la gestion de la mémoire, le passage de paramètres et l'affectation d'objets et de valeurs varient selon les langages :
3.5.1 En Java : Les types primitifs tels que les entiers et les booléens résultent en une copie de leur valeur. En revanche, les types d'objet entraînent une copie de référence qui permet d'accéder directement à l'objet sans créer de nouvelles instances.
3.5.2 En Python et Javascript : Dans ces langages, tout est considéré comme un objet; il n'y a donc aucune distinction entre les types primitifs et les objets. La copie de référence est l'approche par défaut tant pour l'affectation que pour le passage de paramètres, facilitant ainsi la manipulation des objets sans duplication inutile.
3.5.3 En C++ : L’affectation et le passage de paramètres se font généralement par copie de valeur par défaut, ce qui implique que chaque fonction reçoit une copie distincte des variables. Les références doivent être explicitement déclarées pour permettre le passage d'objets par référence, évitant ainsi de copier des objets volumineux et optimisant la performance.
3.5.4 Création d'Objets dans le Tas en C++ : En C++, les objets peuvent être créés dans le tas à l'aide de pointeurs et de l'instruction
new, ce qui permet d'allouer de la mémoire dynamique et de gérer la durée de vie des objets de manière plus flexible.
3.6 Chaînes de Références
Les chaînes de références permettent d'accéder à des objets à travers des références imbriquées. Par exemple, en Java, on peut accéder à un auteur et à son nom en naviguant à travers un livre, illustrant ainsi la complexité potentielle des relations entre les objets.
3.7 Conclusion
En résumé, la compréhension de la pile et du tas est essentielle dans la gestion de la mémoire pour le stockage des données dans les programmes. Un bon mécanisme de compréhension des références est crucial pour la programmation orientée objet car il a un impact direct sur la performance du programme et l'utilisation efficace des ressources.