Types et langages
1. Langages typés ou non
Quelques langages sont très souples avec les variables. Vous pouvez tout d’abord y mettre des nombres, puis du
texte, puis de nouveau des nombres. Ces langages sont dits "non typés". Certains poussent le raisonnement assez
loin : une variable peut contenir le chiffre 3, et l’autre le texte "3 petits cochons", il pourra les additionner (ce qui
devrait donner 6) ! C’est le cas du PHP par exemple : le type de la variable dépend alors de son contexte d’utilisation,
le langage tentant de convertir son contenu quand c’est possible !
À l’inverse, d’autres langages sont de "typage fort" où toutes les variables doivent être déclarées de manière
extrêmement précise : type, signe, longueur, et les éventuelles conversions doivent être explicites.
En algorithmique, vous vous contenterez de donner le nom, le type et éventuellement la taille de la variable, qui
gardera ses propriétés tout au long de l’algorithme, sa valeur pouvant bien entendu évoluer.
2. La gestion de la mémoire
La gestion de la mémoire est le calvaire des programmeurs en langages de bas niveau ou même de haut niveau quand
ceuxci laissent au programmeur la tâche de gérer la mémoire luimême. C’est le cas de langages comme le C ou le
C++. Imaginez une chaîne de caractères « Hello World ! ». Celleci est composée de 12 caractères en comptant la
ponctuation et l’espace. Comme une chaîne se termine par un caractère nul, il faut, selon le principe qu’un caractère
est codé en ASCII, 13 octets pour stocker cette chaîne en mémoire.
En algorithmique, vous n’avez pas à vous soucier de l’occupation mémoire de vos variables et chaînes. En Java, ou
encore en PHP, non plus : ces langages disposent de mécanismes appelés "ramassemiettes" qui le font pour vous.
Mais en C par exemple, ce serait à vous de déclarer votre variable de manière à ce que son contenu puisse contenir
jusqu’à 13 octets en déclarant, en fait, 13 cases mémoires d’un octet. Voici la méthode dite statique :
char texte[13] ;
ou encore la méthode dynamique :
char *texte=malloc(13*sizeof(char));
Ce n’est pas tout. En effet avec cette dernière syntaxe le malheur veut que outre cette tâche complexe d’allocation
mémoire, vous deviez libérer vousmême la mémoire, sinon votre programme continuera à consommer celleci jusqu’à
la fin de son exécution. Mais ce système de gestion de la mémoire estil vraiment un inconvénient ? Prenez en compte
ces quelques allégations :
q La gestion de la mémoire de manière dynamique nécessite une connaissance avancée de la taille des variables
utilisées, de la quantité de mémoire nécessaire et de la mémoire physique de la machine.
q L’accès à la mémoire passe par l’utilisation de variables particulières appelées pointeurs car elles ne
représentent pas une valeur mais l’adresse d’une case. Une fois maîtrisées, cellesci se révèlent être très
puissantes et pratiques.
q L’allocation dynamique permet d’utiliser uniquement la quantité de mémoire nécessaire à un instant donné.
C’est certes insignifiant pour quelques octets, mais s’il s’agit de manipuler de grosses images ou des films, ça
compte.
q La mémoire inutilisée peut être libérée dès qu’elle n’est plus nécessaire. Avec les méthodes dites statiques,
elle l’est uniquement à la fin du programme (ou d’un bloc d’instructions).
q L’allocation mémoire est la plus grande source d’erreurs dans un programme, pouvant occasionner du simple
dysfonctionnement au plantage complet du programme, voire même de graves problèmes de sécurité
(piratage) dans des applications critiques.
Partant du principe qu’un langage de haut niveau ne doit pas embêter le programmeur avec une quelconque gestion
du matériel, Java gère la mémoire à votre place et donc vous n’avez pas à vous soucier de libérer la mémoire de
manière si complexe en apparence.
- 1 -
© ENI Editions - All rigths reserved - Jonifar lina
46
1. Langages typés ou non
Quelques langages sont très souples avec les variables. Vous pouvez tout d’abord y mettre des nombres, puis du
texte, puis de nouveau des nombres. Ces langages sont dits "non typés". Certains poussent le raisonnement assez
loin : une variable peut contenir le chiffre 3, et l’autre le texte "3 petits cochons", il pourra les additionner (ce qui
devrait donner 6) ! C’est le cas du PHP par exemple : le type de la variable dépend alors de son contexte d’utilisation,
le langage tentant de convertir son contenu quand c’est possible !
À l’inverse, d’autres langages sont de "typage fort" où toutes les variables doivent être déclarées de manière
extrêmement précise : type, signe, longueur, et les éventuelles conversions doivent être explicites.
En algorithmique, vous vous contenterez de donner le nom, le type et éventuellement la taille de la variable, qui
gardera ses propriétés tout au long de l’algorithme, sa valeur pouvant bien entendu évoluer.
2. La gestion de la mémoire
La gestion de la mémoire est le calvaire des programmeurs en langages de bas niveau ou même de haut niveau quand
ceuxci laissent au programmeur la tâche de gérer la mémoire luimême. C’est le cas de langages comme le C ou le
C++. Imaginez une chaîne de caractères « Hello World ! ». Celleci est composée de 12 caractères en comptant la
ponctuation et l’espace. Comme une chaîne se termine par un caractère nul, il faut, selon le principe qu’un caractère
est codé en ASCII, 13 octets pour stocker cette chaîne en mémoire.
En algorithmique, vous n’avez pas à vous soucier de l’occupation mémoire de vos variables et chaînes. En Java, ou
encore en PHP, non plus : ces langages disposent de mécanismes appelés "ramassemiettes" qui le font pour vous.
Mais en C par exemple, ce serait à vous de déclarer votre variable de manière à ce que son contenu puisse contenir
jusqu’à 13 octets en déclarant, en fait, 13 cases mémoires d’un octet. Voici la méthode dite statique :
char texte[13] ;
ou encore la méthode dynamique :
char *texte=malloc(13*sizeof(char));
Ce n’est pas tout. En effet avec cette dernière syntaxe le malheur veut que outre cette tâche complexe d’allocation
mémoire, vous deviez libérer vousmême la mémoire, sinon votre programme continuera à consommer celleci jusqu’à
la fin de son exécution. Mais ce système de gestion de la mémoire estil vraiment un inconvénient ? Prenez en compte
ces quelques allégations :
q La gestion de la mémoire de manière dynamique nécessite une connaissance avancée de la taille des variables
utilisées, de la quantité de mémoire nécessaire et de la mémoire physique de la machine.
q L’accès à la mémoire passe par l’utilisation de variables particulières appelées pointeurs car elles ne
représentent pas une valeur mais l’adresse d’une case. Une fois maîtrisées, cellesci se révèlent être très
puissantes et pratiques.
q L’allocation dynamique permet d’utiliser uniquement la quantité de mémoire nécessaire à un instant donné.
C’est certes insignifiant pour quelques octets, mais s’il s’agit de manipuler de grosses images ou des films, ça
compte.
q La mémoire inutilisée peut être libérée dès qu’elle n’est plus nécessaire. Avec les méthodes dites statiques,
elle l’est uniquement à la fin du programme (ou d’un bloc d’instructions).
q L’allocation mémoire est la plus grande source d’erreurs dans un programme, pouvant occasionner du simple
dysfonctionnement au plantage complet du programme, voire même de graves problèmes de sécurité
(piratage) dans des applications critiques.
Partant du principe qu’un langage de haut niveau ne doit pas embêter le programmeur avec une quelconque gestion
du matériel, Java gère la mémoire à votre place et donc vous n’avez pas à vous soucier de libérer la mémoire de
manière si complexe en apparence.
- 1 -
© ENI Editions - All rigths reserved - Jonifar lina
46
