Brevet FR2888013A1 — publié le 20070105

PROCEDES ET DISPOSITIFS DE COMPRESSION ET DE DECOMPRESSION DE CODE EXECUTABLE PAR UN MICROPROCESSEUR A ARCHITECTURE RISC. La présente invention concerne le domaine de la compression de code exécutable par un microprocesseur. Elle s'applique notamment, mais non exclusivement, au code exécutable par les microprocesseurs à jeu d'instructions réduit RISC (Reduced Instruction Set Computer), par opposition aux microprocesseurs à architecture CISC (Complex Instruction Set Computer). Par rapport aux microprocesseurs à architecture CISC, les microprocesseurs RISC présentent l'avantage de posséder une architecture simplifiée, ce qui permet d'obtenir des vitesses d'exécution notablement supérieures, et de mettre en oeuvre des compilateurs de code notablement plus simples que les microprocesseurs à jeu d'instructions complexe. En contrepartie, les programmes écrits pour les microprocesseurs à architecture RISC sont notablement plus volumineux, typiquement de 20 à 50 %. Il en résulte une augmentation du temps de chargement du programme en vue de son exécution, des ressources mémoire nécessaires pour stocker le programme, ainsi que de la bande passante nécessaire si le programme doit être transmis par un réseau. Pour apporter une solution à ce problème, le brevet US 5 764 994 propose d'appliquer au code exécutable par de tels microprocesseurs des procédés de compression tels que Lempel-Ziv, basés sur la détection de répétitions de motifs, le code compressé étant ensuite décompressé à la volée au moment de son exécution par le microprocesseur. Toutefois, un tel code est difficile à compresser en raison du fait de la présence dans les instructions de code exécutable RISC de champs redondants qui ne contiennent pas d'information, mais réduisent l'efficacité du modèle de données construit durant la compression. En outre, les instructions de code exécutable RISC présentent différents formats, et utilisent de nombreux registres et des valeurs littérales, qui rendent difficile la détection de motifs répétés dans le code. Les brevets US 6 618 506 et US 6 199 126 prévoient de décomposer le programme exécutable à compresser en deux sous-ensembles comprenant 2888013 -2- respectivement le champ de code d'opération et le champ opérande de chaque instruction, puis d'effectuer une analyse statistique de chaque sous-ensemble afin d'évaluer des fréquences d'apparition de symboles. Ensuite, on attribue à chaque symbole un code dont la taille est plus petite pour les symboles ayant une fréquence d'apparition élevée dans le sous-ensemble, et on constitue une table de correspondance entre les symboles et les codes attribués aux symboles. Chaque code comprend un préfixe associé soit à un index soit à la valeur du symbole selon la valeur du préfixe. Dans le cas où le préfixe est suivi d'un index, le préfixe désigne un groupe de symboles dans la table de correspondance et l'index précise la position du symbole correspondant dans le groupe. Enfin, chaque champ des instructions du code exécutable est remplacé par le code correspondant tel que spécifié dans la table de correspondance pour obtenir le programme sous forme compressée. Pour optimiser la place mémoire occupée par le programme compressé, les codes de longueur variable sont mémorisés les uns à la suite des autres sans être alignés sur des mots mémoire. Pour pouvoir être décompressé à la volée à partir d'une adresse d'instruction requise par le microprocesseur, le programme est compressé par blocs de 64 octets (16 instructions de 32 bits), et une table d'index est générée pour pouvoir accéder directement à chaque bloc compressé. Il s'avère que cette solution dégrade les performances en termes de vitesse d'exécution du programme. Cette dégradation provient du fait que les instructions compressées sont de taille variable et donc qu'il n'est pas possible de décompresser une instruction d'un bloc avant d'avoir déterminé la longueur de l'instruction compressée précédente. Cette solution ne permet donc pas d'effectuer certaines opérations de décompression en parallèle. Cette solution n'est pas non plus optimum en terme d'occupation de la mémoire. En effet, il est nécessaire que chaque bloc d'instructions compressé soit aligné sur les mots mémoire de l'espace d'adressage, ce qui laisse à la fin de chaque bloc, des emplacements inoccupés d'autant plus importants que les blocs choisis sont grands ou d'autant plus nombreux que les blocs sont choisi petits. En outre, la table d'index est relativement volumineuse puisqu'elle occupe 32 bits (4 octets) par bloc de 64 octets, ce qui pénalise d'une manière importante l'efficacité de la compression. La présente invention a pour but de supprimer ces inconvénients. Cet objectif 2888013 -3- est atteint par la prévision d'un procédé de compression de code exécutable par un microprocesseur, comprenant des étapes consistant à décomposer le code exécutable en mots, et compresser chaque mot de code exécutable. Selon l'invention, chaque mot de code exécutable compressé comprend une partie de longueur fixe prédéfinie et une partie de longueur variable dont la longueur est définie par la partie de longueur fixe, le procédé comprenant en outre une étape consistant à regrouper toutes les parties de longueur fixe et toutes les parties de longueur variable des mots respectivement dans un bloc de parties de longueur fixe et dans un bloc de parties de longueur variable, les positions respectives d'au moins certaines parties de longueur variable dans le bloc de parties de longueur variable étant mémorisées dans une table d'adressage. Selon un mode de réalisation de l'invention, le code exécutable est divisé en lignes d'un nombre prédéfini d'instructions, chaque ligne de code exécutable étant compressée en une ligne de parties de longueur fixe figurant dans le bloc de parties de longueur fixe, et une ligne de parties de longueur variable figurant dans le bloc de parties de longueur variable, chacune des lignes de parties de longueur variable étant localisée dans le bloc de parties de longueur variable à l'aide de la table d'adressage. Avantageusement, la table d'adressage comprend une entrée par groupe d'un nombre prédéfini de lignes de parties de longueur variable, chaque entrée spécifiant la position d'une première ligne de parties de longueur variable dans l'ensemble des parties de longueur variable du code compressé, et les longueurs respectives des lignes de parties de longueur variable du groupe, sauf une dernière ligne de parties de longueur variable du groupe, dont la longueur est déterminée à l'aide de la position d'une première ligne de parties de longueur variable d'un groupe de lignes de parties de longueur variable suivant. De préférence, chacun des mots du code exécutable à compresser correspond à une instruction. Selon un mode de réalisation de l'invention, le code exécutable est scindé en plusieurs parties contenant chacune un mot respectif de chaque instruction du code exécutable à compresser, le procédé étant appliqué séparément à chacune des parties de code exécutable, pour obtenir pour chaque mot d'instruction du 2888013 -4- code exécutable une partie de longueur fixe qui est insérée dans le bloc de parties de longueur fixe et une partie de longueur variable qui est insérée dans le bloc de parties de longueur variable. Selon un mode de réalisation de l'invention, l'étape de compression comprend des étapes consistant à : constituer un histogramme donnant pour chaque mot distinct du code exécutable un nombre d'occurrences de ce mot dans le code exécutable, et extraire au moins une partie des mots de l'histogramme dans une table de décompression, dans laquelle les mots sont répartis en sous-tables rassemblant des mots ayant des nombres d'occurrences voisins dans l'histogramme, chaque sous-table étant associée à une longueur prédéfinie, la partie de longueur fixe de chaque mot du code exécutable référençant une sous-table de la table de décompression, et la partie de longueur variable donnant une position dans la sous-table de décompression du mot du code exécutable. Selon un mode de réalisation de l'invention, les mots du code exécutable associés dans l'histogramme à un nombre d'occurrences inférieur à un seuil prédéterminé ne sont pas insérés dans la table de décompression, chaque mot de code exécutable non inséré dans la table de décompression étant compressé à l'aide d'une partie de longueur fixe spécifiant que le mot de code exécutable ne figure pas dans la table de décompression, et une partie de longueur variable contenant au moins une partie du mot de code exécutable. Selon un mode de réalisation de l'invention, si deux mots de code exécutable identiques apparaissent consécutivement dans le code exécutable à compresser, le second mot de code exécutable est compressé sans partie de longueur variable, à l'aide d'une partie de longueur fixe spécifiant que le mot de code exécutable est le même que le mot précédent. Selon un mode de réalisation de l'invention, la partie de longueur fixe de chaque mot compressé spécifie selon sa valeur: soit un numéro de sous-table de la table de décompression, soit que le mot du code exécutable correspondant est le second mot de deux mots consécutifs identiques du code exécutable, 2888013 -5- soit que la partie de longueur variable du mot compressé contient au moins une partie du mot de code exécutable correspondant. Selon un mode de réalisation de l'invention, une valeur prédéfinie de la partie 5 de longueur fixe d'un mot compressé spécifie un point d'arrêt à introduire dans le code exécutable lors d'une phase de test du programme. Selon un mode de réalisation de l'invention, la division en sous-tables de la table de décompression est choisie de manière à obtenir une taille de l'ensemble 10 des parties de longueur variable du code compressé la plus petite possible. Selon un mode de réalisation de l'invention, le code exécutable est scindé en plusieurs parties contenant chacune un mot respectif de chaque instruction du code exécutable à compresser, le procédé étant appliqué séparément à chacune des parties de code exécutable, pour obtenir une table de décompression pour chaque partie du code exécutable. L'invention concerne également un procédé de décompression de code exécutable par un microprocesseur, stocké dans une zone mémoire programme 20 sous forme compressée, le procédé comprenant des étapes consistant à : recevoir du microprocesseur des requêtes d'instructions de code exécutable comportant une adresse d'instruction à exécuter, déterminer une adresse de lecture d'une table d'adressage en fonction de 25 l'adresse d'instruction à exécuter, lire à l'adresse de lecture dans la table d'adressage des informations d'adressage de mots compressés correspondant à l'instruction à exécuter, déterminer en fonction des informations d'adressage lues une adresse de lecture de la mémoire programme, lire la mémoire programme à l'adresse de lecture, et décompresser les mots lus et les transmettre au microprocesseur. Selon l'invention, chaque mot du code exécutable est compressé sous la forme d'une partie de longueur fixe prédéfinie et d'une partie de longueur variable dont la longueur est définie par la partie de longueur fixe, toutes les parties de longueur fixe et toutes les parties de longueur variable des mots de code exécutable étant regroupés respectivement dans un bloc de parties de longueur fixe et dans un bloc de parties de longueur variable, au moins certaines parties 2888013 -6- de longueur variable étant localisées dans le bloc de parties de longueur variable à l'aide d'une table d'adressage, le procédé de décompression comprenant en outre des étapes consistant à : déterminer une adresse de lecture dans le bloc de parties de longueur fixe en fonction de l'adresse de l'instruction à exécuter, lire les blocs de parties de longueur fixe et variable aux adresses de lecture déterminées, et décompresser les parties de longueur fixe et variable lues pour obtenir une 10 instruction exécutable qui est transmise au microprocesseur. Selon un mode de réalisation de l'invention, le code compressé est organisé en lignes de parties de longueur fixe et en lignes de parties de longueur variable, chaque ligne de parties de longueur fixe et la ligne de parties de longueur variable associée correspondant à une ligne respective d'un nombre prédéfini d'instructions de code exécutable, chacune des lignes de parties de longueur variables étant localisée dans la zone mémoire programme à l'aide de la table d'adressage, le procédé comprenant des étapes de: lecture d'une ligne de parties de longueur fixe et d'une ligne de parties de longueur variable, localisées à l'aide des informations lues dans la table d'adressage, et décompression des lignes de parties de longueur fixe et variable lues pour obtenir une ligne d'instructions exécutables. Selon un mode de réalisation de l'invention, la table d'adressage comprend une entrée par groupe d'un nombre prédéfini de lignes de parties de longueur variable, chaque entrée spécifiant la position d'une première ligne de parties de longueur variable dans l'ensemble des parties de longueur variable du code compressé, et les longueurs respectives des lignes de parties de longueur variable du groupe, sauf une dernière ligne de parties de longueur variable du groupe, dont la longueur est déterminée à l'aide de la position d'une première ligne de parties de longueur variable d'un groupe de lignes de parties de longueur variable suivant. Selon un mode de réalisation de l'invention, la partie de longueur fixe de chaque instruction compressée référence une sous-table d'une table de décompression rassemblant au moins une partie des mots du code exécutable, la partie de longueur variable donnant la position dans la sous-table du mot de code exécutable, la décompression d'une partie de longueur fixe et d'une partie de longueur variable correspondante comprenant des étapes de: détermination de la longueur de la partie de longueur variable en fonction de la valeur de la partie de longueur fixe correspondante, lire la partie de longueur variable correspondante compte tenu de la longueur déterminée de la partie de longueur variable, et si la partie de longueur fixe référence une sous-table de la table de décompression, lire le mot de code exécutable dans la sous-table de la table de décompression référencée par la partie de longueur fixe lue, à une position définie par la partie de longueur variable lue. Selon un mode de réalisation de l'invention: si la partie de longueur fixe indique que le mot de code exécutable correspondant est un second mot de deux mots identiques apparaissant consécutivement dans le code exécutable, la partie de longueur fixe est décompressée par le mot de code exécutable précédemment décompressé ; si la partie de longueur fixe spécifie que le mot de code exécutable correspondant ne figure pas dans la table de décompression, le procédé comprend en outre des étapes d'extraction d'au moins une partie du mot de code exécutable de la partie de longueur variable correspondant à la partie de longueur fixe; et si la partie de longueur fixe spécifie un point d'arrêt, un point d'arrêt est inséré dans le code exécutable décompressé. Avantageusement, chacun des mots de code exécutable décompressé correspond à une instruction. Alternativement, le code exécutable est scindé en plusieurs parties contenant chacune un mot respectif de chaque instruction du code exécutable à compresser, chaque partie du code exécutable ayant été compressée séparément et étant associée à une table de décompression respective rassemblant des mots de code exécutable de la partie du code exécutable. L'invention concerne également une unité de décompression de code exécutable par un microprocesseur, stocké dans une zone mémoire programme 2888013 -8- sous forme compressée, l'unité de décompression étant connectée au microprocesseur, l'unité de décompression comprenant: des moyens pour recevoir du microprocesseur des requêtes d'instructions de code exécutable comportant une adresse d'instruction à exécuter, des moyens pour déterminer une adresse de lecture d'une table d'adressage en fonction de l'adresse d'instruction à exécuter, la table d'adressage permettant de localiser dans la mémoire programme certains mots compressés stockés, des moyens pour lire à l'adresse de lecture dans la table d'adressage des informations d'adressage de mots compressés correspondant à l'instruction à exécuter, des moyens pour déterminer en fonction des informations d'adressage lues une adresse de lecture de la mémoire programme, des moyens pour lire des mots compressés dans la mémoire programme à l'adresse de lecture, des moyens pour décompresser les mots compressés lus pour obtenir une instruction exécutable, et des moyens pour transmettre au microprocesseur l'instruction exécutable. 20 Selon l'invention, chaque mot du code exécutable est compressé sous la forme d'une partie de longueur fixe prédéfinie et d'une partie de longueur variable, dont la longueur est définie par la partie de longueur fixe, toutes les parties de longueur fixe et toutes les parties de longueur variable des mots de code exécutable étant regroupés dans une zone mémoire programme respectivement dans un bloc de parties de longueur fixe et dans un bloc de parties de longueur variable, au moins certaines parties de longueur variable étant localisées dans le bloc de parties de longueur variable à l'aide d'une table d'adressage, l'unité de décompression comprenant en outre: des moyens pour déterminer une adresse de lecture dans bloc de parties de longueur fixe en fonction de l'adresse de l'instruction à exécuter, des moyens pour lire le bloc de parties de longueur fixe à l'adresse de lecture déterminée, et des moyens pour décompresser les parties de longueur fixe et variable lues pour obtenir une instruction exécutable. Selon un mode de réalisation de l'invention, l'unité de décompression 2888013 -9- comprend en outre des moyens pour mémoriser des adresses de début du bloc de parties de longueur fixe et du bloc de parties de longueur variable du code compressé. Selon un mode de réalisation de l'invention, le code compressé est organisé en lignes de parties de longueur fixe et en lignes de parties de longueur variable, chaque ligne de parties de longueur fixe et la ligne de parties de longueur variable associée correspondant à une ligne respective d'un nombre prédéfini d'instructions de code exécutable, chacune des lignes de parties de longueur variables étant localisée dans la zone mémoire programme à l'aide d'une table d'adressage stockée dans une zone de la mémoire programme, l'unité de décompression comprenant en outre des moyens pour mémoriser une adresse de début de la table d'adressage. Selon un mode de réalisation de l'invention, la table d'adressage comprend une entrée par groupe d'un nombre prédéfini de lignes de parties de longueur variable, chaque entrée spécifiant la position d'une première ligne de parties de longueur variable dans l'ensemble des parties de longueur variable du code compressé, et les longueurs respectives des lignes de parties de longueur variable du groupe, sauf une dernière ligne de parties de longueur variable du groupe, dont la longueur est déterminée à l'aide de la position d'une première ligne de parties de longueur variable d'un groupe de lignes de parties de longueur variable suivant, l'unité de décompression comprenant en outre: des moyens pour recevoir du microprocesseur des requêtes d'instructions de code exécutable comportant une adresse d'instruction, des moyens pour lire la table d'adressage en fonction de l'adresse d'instruction de code exécutable fournie par le microprocesseur, des moyens pour déterminer à l'aide de la table d'adressage la position dans la mémoire programme de la ligne de parties de longueur fixe contenant les mots de code compressé correspondant à l'adresse d'instruction fournie par le microprocesseur, des moyens pour déterminer à l'aide de la table d'adressage la position et la longueur dans la mémoire programme de la ligne de parties de longueur variable contenant les mots de code compressé correspondant à l'adresse d'instruction fournie par le microprocesseur, et des moyens pour décompresser et mémoriser toutes les instructions de code exécutable correspondant à la ligne de parties de longueur fixe lue et à la - 10 ligne de parties de longueur variable lue. Selon un mode de réalisation de l'invention, l'unité de décompression comprend en outre: une mémoire cache pour stocker un nombre prédéfini d'instructions décompressées, des moyens pour lire la mémoire cache à la suite de la réception d'une requête d'instructions émise par le microprocesseur, et pour transmettre en 10 réponse les instructions correspondantes si celles-ci se trouvent dans la mémoire cache. Selon un mode de réalisation de l'invention, au moins certaines parties de longueur fixe référencent une sous-table d'une table de décompression rassemblant au moins une partie des mots du code exécutable, la partie de longueur variable donnant la position dans la sous-table du mot de code exécutable, l'unité de décompression comprenant en outre: des moyens de stockage d'une table de décompression, des moyens pour déterminer la position du mot de code exécutable à lire dans la table de décompression à partir de la partie de longueur fixe et de la partie de longueur variable, si la partie de longueur fixe référence une sous-table de la table de décompression, et des moyens pour lire le mot de code exécutable à la position déterminée dans 25 la sous-table. Selon un mode de réalisation de l'invention, l'unité de décompression comprend en outre des moyens pour transmettre au microprocesseur un mot de code exécutable précédemment décompressé si la partie de longueur fixe indique que le mot de code exécutable correspondant est un second mot de deux mots identiques apparaissant consécutivement dans le code exécutable. Selon un mode de réalisation de l'invention, l'unité de décompression comprend en outre des moyens pour transmettre au microprocesseur la partie de longueur variable lue si la partie de longueur fixe spécifie que le mot de code exécutable correspondant ne figure pas dans la table de décompression. Selon un mode de réalisation de l'invention, l'unité de décompression 2888013 -11- comprend en outre des moyens pour transmettre au microprocesseur un point d'arrêt d'exécution de programme, si la partie de longueur fixe le spécifie. Selon un mode de réalisation de l'invention, chacun des mots de code 5 exécutable décompressé correspond à une instruction. Selon un mode de réalisation de l'invention, le code exécutable est scindé en plusieurs parties contenant chacune un mot respectif de chaque instruction du code exécutable à compresser, chaque partie du code exécutable ayant été compressée séparément et étant associée à une table de décompression respective rassemblant des mots de code exécutable de la partie du code exécutable. L'invention concerne également un microprocesseur comportant une unité de 15 décompression telle que définie ci-avant. Un mode de réalisation préféré de l'invention sera décrit ci-après, à titre d'exemple non limitatif, avec référence aux dessins annexés dans lesquels: La figure 1 représente schématiquement un système de compression de code source binaire, selon l'invention; La figure 2 montre la structure d'une table d'adressage selon l'invention obtenue durant la compression; La figure 3 montre plus en détail sous la forme d'un 25 organigramme une séquence de traitements de compression exécutée par le système représenté sur la figure 1; La figure 4 montre la structure d'une table de décompression obtenue durant la compression effectuée conformément à la séquence de traitements illustrée sur la figure 3; La figure 5 montre plus en détail sous la forme d'un organigramme une étape du traitement de compression illustré sur la figure 3; 2888013 - 12 - La figure 6 illustre sous la forme d'un organigramme un procédé de décompression selon l'invention; La figure 7 représente schématiquement l'architecture d'un calculateur comportant une unité de décompression selon l'invention; La figure 8 représente schématiquement l'architecture de l'unité de décompression montrée sur la figure 7; La figure 9 montre la structure d'une page mémoire de programme compressé, selon l'invention; La figure 10 montre la structure d'une table de gestion de mémoire cache de l'unité de décompression représentée sur la figure 8. Sur la figure 1, le système de compression 1 selon l'invention est conçu pour traiter du code source binaire 2, c'est-à-dire exécutable par un microprocesseur, pour produire du code compressé. L'algorithme de compression est choisi de manière à ce que chaque mot du code exécutable soit compressé sous la forme d'une partie de longueur fixe et d'une partie de longueur variable. Cet algorithme est du type "à longueur variable", basé sur la fréquence d'apparition des différents mots dans le code à compresser, des codes courts étant attribués aux mots à compresser les plus fréquents, et des codes plus longs aux mots à compresser les plus rares. L'algorithme choisi est par exemple issu de la méthode de Huffman. Ensuite, toutes les parties de longueur fixe sont regroupées dans un bloc 11 d'instructions compressées de longueur fixe, et toutes les parties de longueur variable sont regroupées dans un bloc 12 d'instructions compressées de longueur variable, une table d'adressage 13 étant constituée pour pouvoir accéder aux instructions compressées dans le bloc 12 d'instructions compressées de longueur variable sans avoir à lire et décompresser toutes les instructions précédentes dans le bloc. De cette manière, la position en mémoire de la partie fixe d'une instruction peut être déterminée directement en fonction de l'adresse de l'instruction dans le 2888013 - 13 - code exécutable, ce qui permet à la décompression de traiter en parallèle les parties de longueur fixe et variable. Avantageusement, le code source à compresser est traité par lignes DL de 32 ou 64 instructions, chaque ligne DL conduisant à l'obtention d'une ligne de parties fixes FCL et d'une ligne de parties variables VCL. Dans ce contexte, la table d'adressage 13 est structurée de la manière illustrée sur la figure 2 en mots d'adressage référençant un groupe j de plusieurs lignes de parties variables, par exemple 4: VCLL(0), VCLi(1), VCLL(2) et VCLL(3). Chaque mot d'adressage mémorisé dans la table d'adressage 13 comprend la position Pi(0) en nombre de bits dans la partie variable 12 du début d'une première ligne VCLL(0), et les longueurs Li(0), LL(1), Li(2) en nombre de bits, des première, seconde et troisième lignes VCLi(0), VCLi(l) et VCLi(2). Les positions respectives PO), PP(2), Pi(3) en nombre de bits des seconde, troisième et quatrième lignes VCLi(1) VCLi(2) et VCLL(3) sont obtenues en additionnant la position Pi et la longueur Li de la partie fixe de la ligne précédente: Pi(k) = P,(k-1) + Li(k-1), pour k = 1 à 3 (1) La longueur L43) de la quatrième ligne VCLL(3) est déduite de la position de la première ligne Pi+1(0) spécifiée dans le mot d'adressage référençant le groupe j+l des quatre lignes suivantes, et de la position Pi(3) du quatrième groupe: Li(3) = Pi+1(0) Pi(3) (2) Chaque mot j de la table d'adressage 13 comporte par exemple 64 bits répartis dans les différents champs de la manière suivante: Bits 63 à 33: P;(0) Bits 32 à 22: Li(0) Bits 21 à 11: L(1) Bits 10 à 0: Li(2) La table d'adressage 13 permet ainsi d'accéder directement à une ligne VCL de parties variables d'instructions compressées. Par comparaison avec les tables d'adressage décrites dans le brevet US 6 199 126, la table d'adressage selon l'invention permet d'adresser quatre lignes de 32 ou 64 instructions de 32 bits à l'aide de mots de 64 bits, ce qui augmente dans une relativement faible mesure la taille du code compressé. 2888013 - 14 - L'algorithme de compression choisi est par exemple conforme à celui illustré sur la figure 3. A la première étape 31 de cet algorithme, le système 1 lit le code source binaire pour constituer un histogramme donnant pour chaque mot distinct du code source un nombre d'occurrences dans le code source de ce mot. Cet histogramme est constitué d'une table ordonnée par nombre d'occurrences décroissant. A l'étape suivante 32, le système construit une table de décompression 10 extraite de l'histogramme en rassemblant tous les mots distincts associés dans l'histogramme à un nombre d'occurrences supérieur à un seuil prédéfini. L'ordre des mots dans la table de décompression correspond à celui des mots dans l'histogramme. La table de décompression est ensuite divisée en sous-tables rassemblant des mots ayant des nombres d'occurrences voisins, c'est-à- dire dont la position dans la sous-table sera codée par un même nombre de bits. A l'étape suivante 33, le code binaire source 2 est lu une nouvelle fois, pour compresser chaque mot du code binaire sous la forme d'une partie de longueur fixe, constante pour tous les mots du code exécutable à compresser, et d'une partie de longueur variable d'un mot à l'autre. Deux cas se présentent selon que le mot à compresser se trouve ou non dans la table de compression. Si le mot à compresser se trouve dans la table de compression 10, on applique le principe de compression illustré par la figure 4 qui montre la table de décompression 10 divisée en sous-tables 21 référencées chacune par un code BC respectif. Selon ce principe, la partie fixe du mot 25 résultant de la compression contient le code BC de sous-table de la table de décompression 10 dans laquelle se trouve le mot 22 à l'état décompressé, et la partie variable indique la position VLI de ce mot dans la sous-table. Dans l'exemple de la figure 4, le code BC de sous-table est codé sur 4 bits, de manière à pouvoir référencer jusqu'à 16 sous- tables. En pratique, certaines valeurs du code BC devront être réservées à d'autres usages comme le codage des mots du code source ne se trouvant pas dans la table de compression 10. Si le mot à compresser ne se trouve pas dans la table de compression 10, la partie fixe du mot résultant de la compression contient un numéro BC non attribué à une sous-table 21, réservé à cet effet, et la partie variable contient le mot à compresser. 2888013 -15- Si l'on peut réserver deux valeurs du code BC au codage des mots à compresser ne se trouvant pas dans la table de compression, on peut gagner un bit dans le codage du mot en considérant qu'un bit du code BC détermine un bit du mot à compresser. Par exemple le bit de poids faible du code BC est égal au bit de poids fort du mot à compresser. Avantageusement, on réserve une valeur du code BC pour spécifier que le mot à compresser est le même que le mot précédent. De cette manière, si le code source à compresser comprend deux mots successifs identiques, le second mot est codé sans partie variable, sous la forme d'une seule partie fixe incluant le code BC réservé, spécifiant que le mot du code source est le même que le mot précédent. Avantageusement, la division de la table de décompression 10 en soustables 21 est effectuée de manière à minimiser la taille du code compressé et en particulier la longueur de la partie variable 12 du code compressé, sachant que la longueur de la partie fixe 11 du code compressé dépend du nombre d'instructions figurant dans le code source à compresser et de la longueur (en nombre de bits) choisie pour le code BC. Le code BC présente les fonctions suivantes: soit il spécifie un numéro de sous-table, soit il introduit un mot du code non compressé, soit il spécifie que le mot qu'il code est identique au mot précédent. On peut en outre prévoir de réserver une valeur du code BC pour introduire des points d'arrêts dans le code source binaire lors d'une phase de test du programme. La fonction du code BC en fonction de sa valeur est avantageusement définie dans une table 15 indexée en fonction de la valeur de BC, spécifiant soit la longueur L en nombre de bits de la partie variable VLI lorsque BC spécifie un numéro de sous-table 21, soit la longueur du mot non compressé lorsque BC introduit un mot non compressé, soit que le mot introduit par le code BC est identique au mot précédent, soit que la valeur de BC correspondante est un point d'arrêt. La taille T de la partie variable 12 du code compressé est obtenue par la formule suivante: - 16- N 1 Hi+1 T = EVi EOi + (M HN) . Vlitteral (3) i=0 j=Hi dans laquelle: N est le nombre de sous-tables 21 dans la table de décompression 10, Vi (0 i HN peut être calculé à l'aide de la formule suivante: N 1 HN = 12Vi (4) i=0 Si S est la taille maximum réservée à la table de décompression 10, HN S. Si on peut réserver deux valeurs du code BC au codage des mots à compresser ne se trouvant pas dans la table de compression, la formule (3) devient: N 2 Hi+1 T = Vi É Io; + (M HN) É (Vlitteral -1) (5) i=0 j=Hi De même, si on peut réserver une valeur du code BC pour spécifier que le mot à compresser est le même que le mot précédent, la formule (3) devient: N 2 Hi+1 T = E Vi E Oj+ (M-HN) V É htteral (6) i=0 j=Hi L'histogramme est modifié car deux mots consécutifs identiques ne comptent - 17 - que pour un pour le nombre d'occurrences de ce mot. Ce qui conduit à considérer un nouvel histogramme et un nombre d'occurrences O'i. En combinant les deux conditions précédentes (réservation de deux valeurs du code BC au codage des mots à compresser ne se trouvant pas dans la table de compression et d'une valeur du code BC pour spécifier que le mot à compresser est le même que le mot précédent), la formule (1) devient: N 3 Hi+1 T = Vi. IO' + (M HN) ' (Vlitterai -1) (7) i=0 j=Hi A l'aide des formules (3), (5), (6) et (7), on calcule T appliqué au code à compresser pour toutes les partitions possibles de la table de décompression en sous-tables, c'est-à-dire pour toutes les valeurs possibles de Hi, en imposant que Vi V;+1, c'est-à-dire que la taille de la sous-table i est inférieure ou égale à celle de la sous-table i+l. La partition choisie de la table de décompression en sous-tables est celle qui permet d'obtenir une taille T de partie variable minimum. On détennine ainsi les composantes V; du modèle de compression. La procédure de compression 33 des mots du code à compresser est illustrée sur la figure 5. A la première étape 331 de cette procédure, on lit le mot suivant du code à compresser. Si ce mot est identique au mot précédent (étape 332), on écrit à l'étape 333 le code BC correspondant dans le code compressé, puis on retourne à l'étape 331 de lecture du mot à compresser suivant. Si le mot à compresser n'est pas identique au précédent, on détermine à l'étape 334 si le mot à compresser figure dans la table de décompression 10. Si tel est le cas, on insère à l'étape 335 le code BC correspondant à la sous-table 21 où se trouve le mot à compresser dans le code compressé. Ensuite, on insère dans le code compressé la position du mot à compresser dans la sous-table 21 (étape 336), et on retourne à l'étape 331. Si le mot à compresser ne figure pas dans la table de décompression 10, on insère dans le code compressé le code BC correspondant (étape 337), puis le mot à compresser ou une partie de celui-ci si le code BC choisi spécifie les bits du mot à compressé non insérés (étape 338). 2888013 -18- Avantageusement, on prévoit de scinder chaque instruction du code source binaire à compresser en plusieurs mots de manière à faire apparaître davantage de répétitions dans les mots à compresser. On constitue alors autant de tables de décompression qu'il y a de mots dans chaque instruction. Ainsi par exemple, dans le cas d'un code binaire exécutable par un microprocesseur à architecture RISC constitué d'instructions codées sur 32 bits, chaque instruction est scindée en deux mots, à savoir un mot de poids fort et un mot de poids faible, par exemple de longueurs égales à 16 bits. Ces mots sont avantageusement traités séparément pour constituer deux histogrammes respectifs, un pour les mots de poids faible et un pour les mots de poids fort. Chacun de ces histogrammes conduit à l'obtention de deux tables de décompression et la compression du code source à compresser fournit deux parties fixes et deux parties variables pour chaque instruction du code exécutable. La figure 6 illustre le procédé de décompression correspondant au procédé de compression décrit ci-avant en référence à la figure 3. A la première étape 41 de ce procédé, on calcule une adresse j de lecture de la table d'adressage 13 à partir de l'adresse AD d'une première instruction à exécuter. Cette étape consiste tout d'abord à déterminer l'adresse m de la ligne d'instructions DL(m) dans laquelle se trouve l'instruction à partir de laquelle le traitement de décompression doit être effectué. Ce calcul est effectué à l'aide de la formule suivante: m = (AD ADs) /DLS (8) 25 dans laquelle ADs est l'adresse de début du programme compressé et DLS est la longueur d'une ligne d'instructions. La ligne j de 64 bits à lire dans la table d'adressage est obtenue en divisant m par le nombre de lignes DL référencées par ligne j de la table d'adressage, soit 4 30 dans l'exemple décrit précédemment. A l'étape suivante 42, on lit la ligne j identifiée dans la table d'adressage 13, puis on détermine la position de la ligne d'instructions VCL(m) dans la partie variable 12 du code compressé, et le nombre de mots à lire pour obtenir tout le code compressé de la ligne d'instruction de longueur variable (étape 43). La position P(m) de la ligne m à lire dans la partie variable 12 est obtenue de la manière suivante: si k = m modulo 4 = 0, 2888013 - 19 -P(m) = PP(0), (9) sinon, si k = 1, 2 ou 3, P(m) = Pi(k 1) + LJ(k 1). (10) Une fois que l'on a identifié dans quelle ligne m appartient la partie variable de l'instruction à lire, on détermine le nombre F de mots (de 32 bits) à lire dans la partie variable en fonction du numéro de ligne m, à l'aide de la formule suivante: F(m) = 1 + (LL(k) 1)/32 A l'étape suivante 45, on lit la partie fixe FCL(m) de la ligne de code compressé DL(m). Sachant que la partie fixe d'une instruction compressée est codée sur 8 bits (si les codes BC sont définis sur 4 bits et si chaque instruction est décomposée en deux mots de 16 bits codés séparément), la position PF en octets de la ligne de code dans la partie fixe compressée 11 est donnée par la valeur de m. La longueur de la partie fixe FCL(m) est de 32 ou 64 octets selon la longueur d'une ligne. A l'étape suivante 46, on lit la partie variable VCL(m) de la ligne de code compressée, déterminée à l'étape 44. Bien entendu, les étapes 44 et 45 d'une part et d'autre part 42, 43 et 46, peuvent être effectuées dans n'importe quel ordre ou en parallèle. Enfin, à la dernière étape 47, on décompresse la ligne de code compressée, à l'aide des tables de décompression pour obtenir une ligne de code exécutable 2'. A cet effet, on lit chaque code BC de la ligne de longueur fixe FCL(m), on détermine la fonction du code BC en accédant au champ BCOP dans la table 15, si la fonction du code BC spécifiée dans la table 15 indique que l'instruction correspondante est la même que l'instruction précédente, on duplique l'instruction précédemment décompressée, dans le code décompressé 2'. Si la fonction du code BC spécifiée dans la table 15 est d'introduire une partie variable non compressée de 15 ou 16 bits, on lit respectivement les 15 ou 16 bits suivants dans la partie variable VCL(m) et on les écrit dans le code décompressé 2'. Si longueur de la partie variable est de 15 bits, le bit de poids fort (16ième bit) est égal au bit de poids faible du code BC. Si la fonction du code BC est de référencer une sous-table de la table de décompression 10, on détermine la l'adresse de la sous-table 21 correspondante dans la table de 2888013 - 20 - décompression, et la longueur VLI de la partie variable à lire dans la ligne de parties variable VCL(m), tel que spécifiée dans la table 15. On lit les VLI bits suivants dans la partie variable VCL(m) pour obtenir une position à lire dans la table de décompression 10 à partir de l'adresse de la sous-table 21 correspondant au code BC. Enfin, on lit le mot 22 se trouvant à la position ainsi déterminée dans la sous-table de décompression 21, le mot lu étant inscrit dans le code décompressé 2'. Le procédé de décompression qui vient d'être décrit est adapté pour être effectué à la volée au moment de l'exécution d'un programme par un microprocesseur ou microcontrôleur. La figure 7 représente schématiquement un exemple d'architecture d'un circuit intégré comprenant un tel microprocesseur. Sur cette figure, le microprocesseur comprend une unité centrale CPU couplée directement à une unité d'accès DM à la mémoire de données, et à une unité d'accès à la mémoire programme PMX conçue pour accélérer la lecture des instructions à exécuter dans une mémoire programme PM à accès rapide ou éventuellement dans d'autres mémoires, accessibles par l'intermédiaire d'un bus périphérique PB auquel sont connectés une unité de gestion des interruptions ITC et des organes périphériques P# 1, P#2, ... , P#N tels que des mémoires. Le circuit intégré comprend en outre un commutateur de bus PBS établissant une liaison entre le microprocesseur, et en particulier l'unité d'accès DM à la mémoire de données, et l'unité d'accès PMX à la mémoire programme et un bus système SB d'accès à des mémoires externes et à des interfaces externes. Selon l'invention, le microprocesseur comprend une unité de décompression DecU pour décompresser à la volée du code exécutable stocké dans la mémoire programme sous une forme compressée obtenue grâce au procédé de compression décrit ci-avant. A cet effet, l'unité de décompression est interposée entre l'unité d'accès à la mémoire programme PMX d'une part et d'autre part, la mémoire programme PM, le commutateur de bus PBS et le bus périphérique PB. Un exemple d'architecture de l'unité de décompression est représenté sur la figure 8. Sur cette figure, l'unité de décompression DecU comprend un circuit de contrôle de port esclave SPC chargé des communications avec le bus périphérique PB et de l'initialisation de l'unité de décompression DecU, un moteur de décompression DE chargé du traitement de décompression proprement-dit, et un circuit de contrôle de mémoire cache DCC. 2888013 -21 - Le moteur de décompression DE comprend des registres CRL, CRI destinés à recevoir la table 1.5 pour donnant la fonction du code BC pour chacune des valeurs de ce code. Le moteur de décompression comprend en outre une unité de traitement DP rassemblant dans des registres DTF les tables de décompression 10. Si les instructions de code sont scindées en deux mots, on prévoit deux tables 15 stockées dans quatre registres CRL[0], CRL[ 1], CRH[0], CRH[l] et deux tables de décompression stockées respectivement dans deux registres DTFO et DTF 1. Plus généralement, on prévoit deux registres CRL, CRH et un registre DTF pour chaque mot compressé séparément des instructions du code exécutable. L'unité de traitement DP présente avantageusement une architecture pipeline, c'est-àdire permettant d'effectuer en parallèle plusieurs opérations normalement effectuées en série. Le circuit de contrôle de mémoire cache DCC comprend: une interface MIF de bus maître conçue pour être connectée au commutateur de bus PB S, une mémoire tampon d'entrée PFB connectée à l'interface MIF, un ensemble de registres 18 prévus pour recevoir des adresses permettant d'accéder aux différentes parties du code compressé stockées dans les mémoires programme, à savoir les parties fixes 11 et variables 12 du code compressé et les tables d'adressage 13, un registre DCTR de contrôle de l'unité de décompression, une zone mémoire de travail WA comportant une mémoire cache CM, et une table Tags de gestion de la mémoire cache CM contenant les adresses des dernières instructions décompressées stockées dans la mémoire cache CM. Le circuit SPC comprend un port d'adresse d'entrée AD, et des ports d'entrée et de sortie de données DIN et DOUT connectés au bus périphérique PB, notamment pour recevoir du CPU par l'intermédiaire du commutateur de bus PBS, les données à charger dans les différents registres décrits ci-avant de l'unité de décompression pour effectuer le traitement de décompression. Il est également chargé d'effectuer les tests de bon fonctionnement de l'unité de décompression DecU et en particulier de tester le contenu des registres. Avantageusement, le code compressé est réparti dans la mémoire programme dans des pages de code compressé, chaque page rassemblant une partie fixe 11 2888013 - 22 - et une partie variable 12 de code compressé, et une table d'adressage 13. L'ensemble de registres 18 est alors prévu pour recevoir pour chaque page de code compressé, un ensemble d'adresses comprenant des adresses de début et de fin de page de code compressé DPSTA et DPEND, une adresse MTSTA de début de table d'adressage 13, et une adresse VASTA de début de partie variable 12 du code compressé, la partie fixe 11 du code compressé étant par exemple rangée à partir de l'adresse de début DPSTA, comme illustré sur la figure 9. Tel que représenté sur la figure 10, la table Tags permet d'adresser 8 lignes DL d'instructions décompressées. Chaque ligne i de cette table qui correspond à une ligne i de la mémoire cache CM, contient l'adresse AD_DL[i] de la ligne décompressée dans le plan d'adressage du CPU, associée à un bit global de validité GL[i], et un ensemble de bits de validité VB[i], à raison d'un bit de validité par groupe de 4 instructions décompressées dans la ligne DL[i] de la mémoire cache CM. Le circuit de contrôle de mémoire cache DCC est prévu pour se connecter directement à l'unité d'accès à la mémoire programme PMX et à la mémoire programme rapide PM. Ainsi, le circuit DCC comprend une entrée d'adresse connectée à une sortie d'adresse AD de l'unité PMX pour recevoir de celleci une adresse de début d'instructions à décompresser provenant du CPU, et une sortie de données connectée à une entrée DIN de l'unité PMX par laquelle le circuit DCC transmet en réponse les instructions décompressées correspondantes. Le circuit DCC comprend également une sortie d'adresse et une entrée de données connectées respectivement à une entrée AD d'adresse et une sortie DOUT de données de la mémoire programme rapide PM, pour recevoir une ligne d'instructions compressées à partir de l'adresse fournie. Lorsque l'adresse reçue de l'unité PMX ne se trouve pas dans la mémoire programme rapide, le circuit de contrôle DCC accède à la mémoire programme externe par l'intermédiaire de l'interface MIF comportant un port de sortie d'adresse et un port d'entrée de données connectés au commutateur de bus PBS. Chaque adresse reçue en tant que de requête d'instruction du CPU par l'intermédiaire de l'unité PMX porte sur un groupe de quatre instructions successives. A la réception d'une telle requête, le circuit de contrôle DCC recherche si l'adresse du groupe d'instructions requis figure dans les champs AD DL[i] de la table Tags. Le circuit de contrôle DCC considère que les 2888013 - 23 - instructions requises sont décompressées dans la mémoire cache CM si l'adresse requise se trouve dans la table Tags et si le bit global de validité GL[i] correspondant est levé, et si ce bit n'est pas levé, si le bit de validité VB[i][j] correspondant au groupe j d'instructions requis est levé. Si le groupe d'instructions requis figure dans la mémoire cache, le circuit de contrôle DCC lit le groupe d'instructions requis dans le champ correspondant i de la mémoire cache, les transmets à l'unité PMX. Il est alors disponible pour recevoir une nouvelle requête du CPU. Dans le cas où le groupe d'instructions requis n'est pas décompressé dans la mémoire cache, l'unité de contrôle DCC détermine si le groupe d'instructions requis appartient ou non au champ d'adresses du code compressé, c'est-à-dire si l'adresse du groupe d'instructions requis est compris entre les adresses DPSTA[i] et DPEND[i] de la page de code à laquelle appartient l'adresse du groupe d'instructions requis. Si ce n'est pas le cas, l'unité de contrôle accède à la mémoire programme PM ou à une mémoire externe via le port maître, à l'adresse du groupe d'instructions requis et transmet les instructions lues à l'unité PMX. Si le groupe d'instructions requis appartient au champ d'adresses du code compressé, l'unité de contrôle DCC détermine une ligne i de la table Tags et de la mémoire cache CM qu'elle peut utiliser pour y insérer la nouvelle ligne de code décompressé qu'elle va générer. La ligne i sélectionnée est par exemple celle qui a été lue le plus anciennement. Ensuite, l'unité de contrôle DCC exécute la procédure de décompression telle que décrite ci-avant en référence à la figure 6. En particulier, aux étapes 45 et 46, l'unité de contrôle DCC fournit les parties fixes FCL(m) et variables VCL(m) lues, au moteur de décompression DE, par exemple par l'intermédiaire d'une mémoire tampon FIFO (First In First Out) . Tant que la FIFO n'est pas vide, le moteur de décompression DE exécute l'étape 47 de décompression proprement dite. A cet effet, il lit les parties fixe et variable de la première ligne introduite dans la FIFO, lit les codes BC de la partie fixe, successivement ou deux par deux si les instructions compressées ont été scindées en deux mots, et décompresse chaque instruction. Les instructions décompressées sont fournies à l'unité de contrôle DCC qui les charge dans la ligne i de la mémoire cache CM sélectionnée préalablement, et met à jour la table Tags, et en particulier les bits de validité VB[i] correspondant à la ligne de la mémoire cache, à chaque fois qu'un groupe de quatre instructions décompressées est écrit dans la mémoire cache. Lorsqu'une ligne entière 2888013 - 24 -d'instructions décompressées est inscrite dans la mémoire cache, l'unité de contrôle met à jour le bit de validité global GV[i] correspondant à la ligne. Parallèlement, dès que le bit de validité VB[i] du groupe d'instructions correspondant à l'adresse reçue en tant que requête d'instructions du CPU est levé, l'unité de contrôle transmet le groupe d'instructions correspondant situé dans la mémoire cache CM à l'unité PMX pour qu'il soit fourni au CPU, et se met en attente d'une nouvelle requête d'instructions provenant du CPU. Parallèlement, on peut prévoir également d'utiliser une autre mémoire cache pour mémoriser les mots lus dans la table d'adressage 13. Grâce à ces dispositions, si le CPU demande des instructions figurant dans la mémoire cache CM, il n'est pas nécessaire d'effectuer le traitement de décompression. De nombreux cycles de traitement sont ainsi économisés, et le bus système est laissé libre pour d'autres tâches. Il résulte également de la description qui précède que les algorithmes de compression et de décompression selon l'invention permettent d'obtenir une grande flexibilité, en terme de possibilité d'effectuer différentes opérations de décompression en parallèle, tout en offrant un taux élevé de compression. Ainsi, l'invention permet d'obtenir un taux de compression typiquement compris entre 30 et 45%, sans augmenter le nombre de cycles d'exécution du code de plus de 5%, lorsque l'on utilise une mémoire cache pour mémoriser les instructions décompressées. - 25 - REVENDICATIONS 1. Procédé de compression de code exécutable (2) par un microprocesseur, comprenant des étapes consistant à décomposer le code exécutable en mots, et compresser chaque mot de code exécutable, caractérisé en ce que chaque mot de code exécutable compressé comprend une partie (BC) de longueur fixe prédéfinie et une partie (VLI) de longueur variable dont la longueur est définie par la partie de longueur fixe, le procédé comprenant en outre une étape consistant à regrouper toutes les parties de longueur fixe et toutes les parties de longueur variable des mots respectivement dans un bloc (11) de parties de longueur fixe et dans un bloc (12) de parties de longueur variable, les positions respectives d'au moins certaines parties de longueur variable dans le bloc de parties de longueur variable étant mémorisées dans une table d'adressage (13). 2. Procédé de compression selon la revendication 1, dans lequel le code exécutable est divisé en lignes (DL) d'un nombre prédéfini d'instructions, chaque ligne de code exécutable étant compressée en une ligne (FCL) de parties (BC) de longueur fixe figurant dans le bloc (11) de parties de longueur fixe, et une ligne (VCL) de parties de longueur variable figurant dans le bloc (12) de parties de longueur variable, chacune des lignes de parties de longueur variable étant localisée dans le bloc (12) de parties de longueur variable à l'aide de la table d'adressage (13). 3. Procédé de compression selon la revendication 2, dans lequel la table d'adressage (13) comprend une entrée par groupe d'un nombre prédéfini de lignes de parties de longueur variable (VC40), VCL;(l), VCLL(2), VCLL(3)), chaque entrée (j) spécifiant la position (Pj(0)) d'une première ligne (VC40)) de parties de longueur variable dans l'ensemble des parties (12) de longueur variable du code compressé, et les longueurs respectives (4(0) , 42)) des lignes de parties de longueur variable du groupe, sauf une dernière ligne (VCL,(3)) de parties de longueur variable du groupe, dont la longueur est déterminée à l'aide de la position (Pi+,(0)) d'une première ligne de parties de longueur variable d'un groupe (j+l) de lignes de parties de longueur variable suivant. 4. Procédé de compression selon l'une des revendications 1 à 3, dans lequel chacun des mots du code exécutable à compresser correspond à une 26 - instruction. 5. Procédé de compression selon l'une des revendications 1 à 3, dans lequel le code exécutable est scindé en plusieurs parties contenant chacune un mot respectif de chaque instruction du code exécutable à compresser, le procédé étant appliqué séparément à chacune des parties de code exécutable, pour obtenir pour chaque mot d'instruction du code exécutable une partie de longueur fixe (BC) qui est insérée dans le bloc (11) de parties de longueur fixe et une partie de longueur variable qui est insérée dans le bloc (12) de parties de longueur variable. 6. Procédé de compression selon l'une des revendications 1 à 5, dans lequel l'étape de compression (33) comprend des étapes consistant à : constituer (31) un histogramme (9) donnant pour chaque mot 15 distinct du code exécutable (2) un nombre d'occurrences de ce mot dans le code exécutable, et extraire (32) au moins une partie des mots de l'histogramme dans une table de décompression (10), dans laquelle les mots sont répartis en soustables (21) rassemblant des mots (22) ayant des nombres d'occurrences voisins dans l'histogramme, chaque sous-table étant associée à une longueur prédéfinie, la partie (BC) de longueur fixe de chaque mot du code exécutable référençant une sous-table de la table de décompression, et la partie de longueur variable (VLI) donnant une position dans la sous- table de décompression du mot du code exécutable. 7. Procédé de compression selon la revendication 6, dans lequel les mots du code exécutable (2) associés dans l'histogramme (9) à un nombre d'occurrences inférieur à un seuil prédéterminé ne sont pas insérés dans la table de décompression (10), chaque mot de code exécutable non inséré dans la table de décompression étant compressé à l'aide d'une partie de longueur fixe (BC) spécifiant que le mot de code exécutable ne figure pas dans la table de décompression, et une partie de longueur variable contenant au moins une partie du mot de code exécutable. 8. Procédé de compression selon la revendication 6 ou 7, dans lequel si deux mots de code exécutable identiques apparaissent consécutivement dans le code exécutable (2) à compresser, le second mot de code exécutable est compressé sans partie de longueur variable, à l'aide d'une partie (BC) de 2888013 -27- longueur fixe spécifiant que le mot de code exécutable est le même que le mot précédent. 9. Procédé de compression selon l'une des revendications 6 à 8, 5 dans lequel la partie (BC) de longueur fixe de chaque mot compressé spécifie selon sa valeur: soit un numéro de sous-table (21) de la table de décompression (10), soit que le mot du code exécutable correspondant est le second mot 10 de deux mots consécutifs identiques du code exécutable, soit que la partie de longueur variable du mot compressé contient au moins une partie du mot de code exécutable correspondant. 10. Procédé de compression selon la revendication 9, dans lequel une valeur prédéfinie de la partie (BC) de longueur fixe d'un mot compressé spécifie un point d'arrêt à introduire dans le code exécutable lors d'une phase de test du programme. 11. Procédé de compression selon l'une des revendications 6 à 10, dans lequel la division en sous-tables (21) de la table de décompression (10) est choisie de manière à obtenir une taille de l'ensemble (12) des parties de longueur variable du code compressé la plus petite possible. 12. Procédé de compression selon l'une des revendications 6 à 11, dans lequel le code exécutable est scindé en plusieurs parties contenant chacune un mot respectif de chaque instruction du code exécutable à compresser, le procédé étant appliqué séparément à chacune des parties de code exécutable, pour obtenir une table de décompression (10) pour chaque partie du code exécutable. 13. Procédé de décompression de code exécutable (2) par un microprocesseur (CPU), stocké dans une zone mémoire programme sous forme compressée, le procédé comprenant des étapes consistant à : recevoir du microprocesseur des requêtes d'instructions de code 35 exécutable comportant une adresse d'instruction à exécuter, déterminer une adresse de lecture d'une table d'adressage (13) en fonction de l'adresse d'instruction à exécuter, lire à l'adresse de lecture dans la table d'adressage des informations 2888013 -28- d'adressage de mots compressés correspondant à l'instruction à exécuter, déterminer en fonction des informations d'adressage lues une adresse de lecture de la mémoire programme, lire la mémoire programme à l'adresse de lecture, et décompresser les mots lus et les transmettre au microprocesseur, caractérisé en ce que chaque mot du code exécutable (2) est compressé sous la forme d'une partie (BC) de longueur fixe prédéfinie et d'une partie (VLI) de longueur variable dont la longueur est définie par la partie de longueur fixe, toutes les parties de longueur fixe et toutes les parties de longueur variable des mots de code exécutable étant regroupés respectivement dans un bloc (11) de parties de longueur fixe et dans un bloc (12) de parties de longueur variable, au moins certaines parties de longueur variable étant localisées dans le bloc (12) de parties de longueur variable à l'aide d'une table d'adressage (13), le procédé de décompression comprenant en outre des étapes consistant à : déterminer une adresse de lecture dans le bloc de parties de longueur fixe en fonction de l'adresse de l'instruction à exécuter, lire les blocs de parties de longueur fixe et variable aux adresses de lecture déterminées, et décompresser les parties de longueur fixe et variable lues pour 20 obtenir une instruction exécutable qui est transmise au microprocesseur. 14. Procédé de décompression selon la revendication 13, dans lequel le code compressé est organisé en lignes (FCL) de parties de longueur fixe et en lignes (VCL) de parties de longueur variable, chaque ligne de parties de longueur fixe et la ligne de parties de longueur variable associée correspondant à une ligne (DL) respective d'un nombre prédéfini d'instructions de code exécutable, chacune des lignes de parties de longueur variables étant localisée dans la zone mémoire programme à l'aide de la table d'adressage (13), le procédé comprenant des étapes de: lecture d'une ligne de parties de longueur fixe et d'une ligne de parties de longueur variable, localisées à l'aide des informations lues dans la table d'adressage, et décompression des lignes de parties de longueur fixe et variable lues pour obtenir une ligne d'instructions exécutables. 15. Procédé de décompression selon la revendication 14, dans lequel la table d'adressage (13) comprend une entrée par groupe d'un nombre prédéfini de lignes de parties de longueur variable (VCL,(0), VCLL(1), VCLL(2), 2888013 - 29 - VCLi(3)), chaque entrée (j) spécifiant la position (Pj(0)) d'une première ligne (VCLL(0)) de parties de longueur variable dans l'ensemble des parties (12) de longueur variable du code compressé, et les longueurs respectives (4(0), 4(2)) des lignes de parties de longueur variable du groupe, sauf une dernière ligne (VCL,(3)) de parties de longueur variable du groupe, dont la longueur est déterminée à l'aide de la position (Pi+l(0)) d'une première ligne de parties de longueur variable d'un groupe 0+1) de lignes de parties de longueur variable suivant. 16. Procédé de décompression selon l'une des revendications 13 à 15, dans lequel la partie de longueur fixe de chaque instruction compressée référence une sous-table (21) d'une table de décompression (10) rassemblant au moins une partie des mots du code exécutable, la partie de longueur variable donnant la position dans la sous-table du mot de code exécutable, la décompression d'une partie de longueur fixe et d'une partie de longueur variable correspondante comprenant des étapes de: détermination de la longueur de la partie de longueur variable en fonction de la valeur de la partie de longueur fixe correspondante, lire la partie de longueur variable correspondante compte tenu de la 20 longueur déterminée de la partie de longueur variable, et si la partie de longueur fixe référence une sous-table de la table de décompression, lire le mot de code exécutable dans la sous-table de la table de décompression référencée par la partie de longueur fixe lue, à une position définie par la partie de longueur variable lue. 17. Procédé de décompression selon la revendication 16, dans lequel: si la partie de longueur fixe (BC) indique que le mot de code exécutable correspondant est un second mot de deux mots identiques apparaissant consécutivement dans le code exécutable (2), la partie de longueur fixe (BC) est décompressée par le mot de code exécutable précédemment décompressé ; si la partie de longueur fixe (BC) spécifie que le mot de code exécutable correspondant ne figure pas dans la table de décompression (10), le procédé comprend en outre des étapes d'extraction d'au moins une partie du mot de code exécutable de la partie de longueur variable correspondant à la partie de longueur fixe; et si la partie de longueur fixe (BC) spécifie un point d'arrêt, un point - 30 - d'arrêt est inséré dans le code exécutable décompressé. 18. Procédé de décompression selon l'une des revendications 13 à 17, dans lequel chacun des mots de code exécutable décompressé correspond à 5 une instruction. 19. Procédé de décompression selon l'une des revendications 16 à 17, dans lequel le code exécutable est scindé en plusieurs parties contenant chacune un mot respectif de chaque instruction du code exécutable à compresser, chaque partie du code exécutable ayant été compressée séparément et étant associée à une table de décompression (10) respective rassemblant des mots de code exécutable de la partie du code exécutable. 20. Unité de décompression de code exécutable (2) par un microprocesseur (CPU), stocké dans une zone mémoire programme sous forme compressée, l'unité de décompression étant connectée au microprocesseur, l'unité de décompression comprenant: des moyens pour recevoir du microprocesseur des requêtes d'instructions de code exécutable comportant une adresse d'instruction à 20 exécuter, des moyens pour déterminer une adresse de lecture d'une table d'adressage (13) en fonction de l'adresse d'instruction à exécuter, la table d'adressage (13) permettant de localiser dans la mémoire programme certains mots compressés stockés, des moyens pour lire à l'adresse de lecture dans la table d'adressage des informations d'adressage de mots compressés correspondant à l'instruction à exécuter, des moyens pour déterminer en fonction des informations d'adressage lues une adresse de lecture de la mémoire programme, des moyens pour lire des mots compressés dans la mémoire programme à l'adresse de lecture, des moyens pour décompresser les mots compressés lus pour obtenir une instruction exécutable, et des moyens pour transmettre au microprocesseur l'instruction 35 exécutable, caractérisée en ce que chaque mot du code exécutable (2) est compressé sous la forme d'une partie (BC) de longueur fixe prédéfinie et d'une partie (VLI) de longueur variable, dont la longueur est définie par la partie de longueur fixe, 2888013 -31-toutes les parties de longueur fixe et toutes les parties de longueur variable des mots de code exécutable étant regroupés dans une zone mémoire programme respectivement dans un bloc (11) de parties de longueur fixe et dans un bloc (12) de parties de longueur variable, au moins certaines parties de longueur variable étant localisées dans le bloc (12) de parties de longueur variable à l'aide d'une table d'adressage (13), l'unité de décompression comprenant en outre: des moyens pour déterminer une adresse de lecture dans bloc de parties de longueur fixe en fonction de l'adresse de l'instruction à exécuter, des moyens pour lire le bloc de parties de longueur fixe à l'adresse de lecture déterminée, et des moyens pour décompresser les parties de longueur fixe et variable lues pour obtenir une instruction exécutable. 21. Unité de décompression selon la revendication 20, comprenant en outre des moyens pour mémoriser des adresses de début du bloc de parties de longueur fixe et du bloc de parties de longueur variable du code compressé. 22. Unité de décompression selon la revendication 20 ou 21, dans laquelle le code compressé est organisé en lignes (FCL) de parties de longueur fixe et en lignes (VCL) de parties de longueur variable, chaque ligne de parties de longueur fixe et la ligne de parties de longueur variable associée correspondant à une ligne (DL) respective d'un nombre prédéfini d'instructions de code exécutable, chacune des lignes de parties de longueur variables étant localisée dans la zone mémoire programme à l'aide d'une table d'adressage (13) stockée dans une zone de la mémoire programme, l'unité de décompression comprenant en outre des moyens pour mémoriser une adresse de début de la table d'adressage. 23. Unité de décompression selon la revendication 22, dans laquelle la table d'adressage (13) comprend une entrée par groupe d'un nombre prédéfini de lignes de parties de longueur variable (VCLj(0), VCLj(1), VCLi(2), VCLi(3)), chaque entrée (j) spécifiant la position (P,(0)) d'une première ligne (VCLL(0)) de parties de longueur variable dans l'ensemble des parties (12) de longueur variable du code compressé, et les longueurs respectives (4(0), LL(1), Li(2)) des lignes de parties de longueur variable du groupe, sauf une dernière ligne VCL,(3) de parties de longueur variable du groupe, dont la longueur est déterminée à l'aide de la position (PP+,(0)) d'une première ligne de parties de 2888013 - 32 longueur variable d'un groupe (j+l) de lignes de parties de longueur variable suivant, l'unité de décompression comprenant en outre: des moyens pour recevoir du microprocesseur (CPU) des requêtes d'instructions de code exécutable comportant une adresse d'instruction, des moyens pour lire la table d'adressage en fonction de l'adresse d'instruction de code exécutable fournie par le microprocesseur (CPU), des moyens pour déterminer à l'aide de la table d'adressage la position dans la mémoire programme de la ligne (FCL) de parties de longueur fixe contenant les mots de code compressé correspondant à l'adresse d'instruction fournie par le microprocesseur (CPU), des moyens pour déterminer à l'aide de la table d'adressage la position et la longueur dans la mémoire programme de la ligne (VCL) de parties de longueur variable contenant les mots de code compressé correspondant à l'adresse d'instruction fournie par le microprocesseur (CPU), et des moyens pour décompresser et mémoriser toutes les instructions de code exécutable correspondant à la ligne (FCL) de parties de longueur fixe lue et à la ligne (VCL) de parties de longueur variable lue. 24. Unité de décompression selon l'une des revendications 20 à 23, 20 comprenant en outre: une mémoire cache (CM) pour stocker un nombre prédéfini d'instructions décompressées, des moyens pour lire la mémoire cache à la suite de la réception d'une requête d'instructions émise par le microprocesseur (CPU), et pour transmettre en réponse les instructions correspondantes si celles-ci se trouvent dans la mémoire cache. 25. Unité de décompression selon l'une des revendications 20 à 24, dans laquelle au moins certaines parties de longueur fixe référencent une soustable (21) d'une table de décompression (10) rassemblant au moins une partie des mots du code exécutable, la partie de longueur variable donnant la position dans la sous-table du mot de code exécutable, l'unité de décompression comprenant en outre: des moyens de stockage (DTFO, DTF1) d'une table de 35 décompression, des moyens pour déterminer la position du mot de code exécutable à lire dans la table de décompression à partir de la partie de longueur fixe (BC) et de la partie de longueur variable, si la partie de longueur fixe référence une - 33 - sous-table de la table de décompression, et des moyens pour lire le mot de code exécutable à la position déterminée dans la sous-table. 26. Unité de décompression selon la revendication 25, comprenant en outre des moyens pour transmettre au microprocesseur (CPU) un mot de code exécutable précédemment décompressé si la partie de longueur fixe (BC) indique que le mot de code exécutable correspondant est un second mot de deux mots identiques apparaissant consécutivement dans le code exécutable (2). 27. Unité de décompression selon la revendication 25 ou 26, comprenant en outre des moyens pour transmettre au microprocesseur (CPU) la partie de longueur variable lue si la partie de longueur fixe (BC) spécifie que le mot de code exécutable correspondant ne figure pas dans la table de décompression (10). 28. Unité de décompression selon l'une des revendications 25 à 27, comprenant en outre des moyens pour transmettre au microprocesseur (CPU) un point d'arrêt d'exécution de programme, si la partie de longueur fixe (BC) le spécifie. 29. Unité de décompression selon l'une des revendications 20 à 28, dans laquelle chacun des mots de code exécutable décompressé correspond à une instruction. 30. Unité de décompression selon l'une des revendications 25 à 28, dans laquelle le code exécutable est scindé en plusieurs parties contenant chacune un mot respectif de chaque instruction du code exécutable à compresser, chaque partie du code exécutable ayant été compressée séparément et étant associée à une table de décompression (10) respective rassemblant des mots de code exécutable de la partie du code exécutable. 31. Microprocesseur comportant une unité de décompression (DecU) selon l'une quelconque des revendications 20 à 30.