FR 2829252 A1 20030307 FR 0111279 A 20010830 Compression d'un programme en langage intermédiaire La présente invention concerne la compression d'un programme compilé en langage intermédiaire, tel qu'une applet ou une bibliothèque de classes écrite initialement dans un langage de haut niveau orienté objet. Le langage compilé est composé d'instructions normalisées sous forme d'octets de code, appelés également"bytecodes". Le dispositif de traitement de données dans lequel la compression du programme en langage intermédiaire peut être effectuée est notamment un objet électronique portable dont les capacités de traitement ainsi que les capacités de mémoire sont relativement limitées. Typiquement, l'objet électronique portable est une carte à puce. La compression d'instructions normalisées auxquelles se réfère l'invention est sans perte d'information. Plus précisément, la compression selon l'invention doit respecter certaines contraintes sur la succession des instructions ainsi que sur la succession des octets de code dans les instructions, lesquelles contraintes interdisent l'utilisation d'algorithmes de compression connus du type LZ (Lempel, Ziv) ou Huffman. A priori, pour compresser un programme compilé en langage intermédiaire, deux solutions sont apparemment possibles. Selon une première solution proposée par la demande de brevet FR-A-2785695, le programme compilé en langage intermédiaire est compressé à l'extérieur de la carte à puce, puis le programme compilé compressé est transmis à la carte à puce pour y être mémorisé. La compression à l'extérieur de la carte à puce engendre de nouvelles instructions qui sont additionnées au programme initial et qui rompt la compatibilité avec les instructions compilées en langage intermédiaire. Les nouvelles instructions sont méconnues par l'interpréteur dans la carte qui refusera d'enregistrer et d'exécuter le programme ainsi compressé si l'interpréteur de la carte n'a pas été modifié auparavant. Une deuxième solution consiste à transmettre directement le programme compilé en langage intermédiaire sans autre traitement à l'extérieur de la carte à puce, puis à compresser complètement le programme compilé dans la carte à puce. Cette deuxième solution n'a pas reçu application au motif que l'algorithme de compression qui doit être implémenté dans la carte à puce est beaucoup trop complexe par rapport aux capacités de traitement et de mémoire dans une carte à puce. En outre, chacune de ces deux solutions impose certaines modifications de l'interpréteur, c'est-àdire de la machine virtuelle dans la carte à puce. La présente invention vise à compresser un programme compilé en langage intermédiaire en n'offrant pas les inconvénients des solutions précédentes. Plus particulièrement, l'invention a pour objectif de préparer la compression effective dans la carte à puce afin que la carte à puce n'effectue que la compression proprement dite sans être chargée du choix de la factorisation des instructions dans le programme compilé, et la compression dans la carte à puce ne nécessite aucune augmentation de capacité de mémoire et de traitement. A cette fin, un procédé pour compresser un programme compilé en langage intermédiaire composé d'instructions successives, selon lequel des séquences d'instructions sont détectées à l'extérieur d'un dispositif de traitement de données, est caractérisé en ce qu'il comprend les étapes de : - analyser, à l'extérieur du dispositif de traitement de données, des séquences d'instructions détectées afin de générer respectivement des annotations en langage intermédiaire définissant des macro-instructions respectives lorsque les séquences d'instructions détectées satisfont des contraintes prédéterminées, - charger depuis l'extérieur les instructions et les annotations dans le dispositif de traitement de données, et - produire et mémoriser dans le dispositif de traitement de données des macro-instructions définies par des annotations de séquences d'instructions chargées, respectivement en remplacement des séquences d'instructions chargées. En variante complémentaire, le procédé peut comprendre après l'étape de charger, une étape de vérifier les annotations chargées en fonction des contraintes dans le dispositif de traitement de données. Ainsi la compression selon l'invention est divisée en deux parties. Une première partie à l'extérieur du dispositif de traitement de données, tel qu'un objet électronique portable qui peut être une carte à puce, analyse le programme compilé en langage intermédiaire afin de générer des annotations sur les séquences d'instructions répétitives normalisées selon le langage intermédiaire qui permettront de participer à la compression dans le dispositif de traitement de données. Les annotations renseignent sur les caractéristiques des séquences détectées qui seront à transformer en macro-instructions. L'analyse de séquences ne modifie pas les instructions du programme compilé qui sont ainsi chargées sans modification avec les annotations dans le dispositif de traitement de données d'une manière conventionnelle. Ainsi, la complexité de l'analyse est déportée à l'extérieur du dispositif de traitement de données qui ne procédera qu'au processus final de la compression dont les directives sont préalablement préparées dans les annotations. La deuxième partie du procédé est mise en guivre dans le dispositif de traitement de données, tel que carte à puce, dans lequel les annotations sont interprétées afin qu'un compresseur intégré dans le dispositif de traitement de données produise selon les annotations et mémorise les macro-instructions en correspondance aux séquences d'instructions répétitives compatibles avec les contraintes prédéterminées. Chaque annotation relative à une séquence d'instructions peut comprendre au moins une adresse positionnant la séquence d'instructions dans le programme compilé et la longueur de la séquence d'instructions, ainsi que les instructions contenues dans la séquence. Les annotations AN sont incluses par exemple dans un composant additionnel qui est lié au programme compilé et qui est chargé avec celui-ci dans le dispositif de traitement de données. Les contraintes imposées sur chaque séquence d'instructions à compresser en macro-instructions peuvent comprendre au moins l'une des suivantes : les instructions dans la séquence sont contenues dans le corps d'une méthode commune ; les instructions dans la séquence ne contiennent aucune étiquette dans la séquence, à l'exception de la première instruction dans la séquence ; aucune instruction de la séquence à l'exception de la dernière instruction de la séquence ne rompt le flot d'exécution du programme compilé. L'étape d'analyser des séquences peut générer au moins une annotation définissant une macroinstruction dite"associée"correspondant à une séquence d'instructions analysée contenue dans une autre séquence d'instructions analysée précédemment. Lorsque le dispositif de traitement de données contient déjà des macro-instructions dites"globales" préalablement à l'analyse du programme compilé, l'étape d'analyser des séquences peut générer au moins une macro-instruction"globale"correspondant à une séquence d'instructions analysée, la correspondance entre ces dernières macro-instruction et séquence d'instructions étant préalablement mémorisée dans le dispositif de traitement de données. Lorsqu'une séquence d'instructions chargée correspond à une macro-instruction déjà produite au cours de la compression du programme compilé ou mémorisée préalablement à la compression dans le dispositif de traitement de données, ladite séquence d'instructions est remplacée par ladite macroinstruction déjà produite ou mémorisée. Afin d'optimiser l'occupation de l'espace mémoire dans le dispositif de traitement de données par la compression, l'étape de produire et mémoriser comprend une écriture de chaque macro-instruction dans un espace de mémoire du dispositif de traitement de données dans lequel la séquence d'instructions correspondant à la macro-instruction a été chargée. D'autres caractéristiques et avantages de la présente invention apparaîtront plus clairement à la lecture de la description suivante de plusieurs réalisations préférées de l'invention en référence aux dessins annexés correspondants dans lesquels : - la figure 1 est un bloc-diagramme d'un système de télécommunications comprenant un serveur et une carte à puce dans un terminal d'accueil, montrant l'implantation de divers moyens logiciels pour la mise en oeuvre du procédé de compression de programme compilé en langage intermédiaire selon l'invention ; et - la figure 2 est un algorithme de vérification et d'exécution d'annotation de séquence d'instructions pour compresser des séquences d'instructions dans la carte à puce. La figure 1 montre à la fois des moyens matériels et logiciels pour la mise en oeuvre de l'invention dans un objet électronique portable, et un moyen électronique externe à celui-ci. L'objet électronique est typiquement une carte à puce CA, dite également carte à microcontrôleur ou à circuit intégré, logée d'une manière amovible dans un lecteur d'un terminal d'accueil TE. Le moyen électronique externe est un serveur SE relié au terminal d'accueil TE de la carte à travers un réseau de télécommunications de type internet RES. Les blocs représentés dans la figure 1 concernent des fonctions mises en oeuvre principalement par les entités électroniques SE et CA et peuvent correspondre à des modules logiciels implantés respectivement dans ces entités. En outre, la figure 1 montre des étapes du procédé de compression de programme selon l'invention qui sont réalisées respectivement par des blocs fonctionnels dans les entités électroniques précitées SE et CA. L'ensemble composé par le terminal électronique TE, tel qu'un ordinateur personnel PC ou un terminal bancaire ou un terminal point de vente, et la carte à puce CA peut être remplacé par un terminal radiotéléphonique avec une carte à puce d'abonné téléphonique SIM (Subscriber Identity Module), ou bien par tout autre objet électronique portable tel qu'un assistant numérique personnel PDA ou portemonnaie électronique relié par un modem au réseau RES. Il sera également compris que la carte à puce recouvre tous les types connus de carte à puce à contact ou sans contact, telle que carte de paiement, carte téléphonique, carte additionnelle, carte de jeux, etc. Dans la suite, il sera supposé que le programme PG à exécuter dans la carte à puce CA a été écrit initialement dans un langage de haut niveau du type orienté objet tel que le langage Java, ou plus particulièrement le langage Java Card. Ce programme peut comprendre un ou plusieurs fichiers de classe afin de former un paquetage pouvant constituer une applet à transmettre à la carte à puce et à traiter par celle-ci. Le serveur SE étant une entité électronique externe à la carte CA, il appartient par exemple à l'éditeur de la carte CA ou à l'éditeur d'une ou plusieurs applications implantées dans la carte CA. Comme montré à la figure 1, pour la mise en oeuvre du procédé de compression selon l'invention, le serveur SE comprend principalement un compilateur COM, un analyseur sémantique d'instruction AS et un chargeur de programme CH sécurisé. Le compilateur COM est un compilateur connu pour le langage Java qui convertit le programme PG en langage source Java en un programme compilé PGC en langage intermédiaire, appelé également pseudo-code, composé de mots d'instruction formés par des octets, appelés bytecodes, qui sont prêts à être exécutés par un interpréteur dans la carte CA. Lorsque le programme en langage source PG, tel qu'une applet ou une librairie, contient plusieurs fichiers, le compilateur COM les compile séparément et un éditeur de liens les regroupe comme on le verra dans la suite au niveau de la carte CA. Chaque octet d'instruction supporte une instruction proprement dite, c'est-à-dire un code opération (opcode) ou bien l'un des paramètres d'une instruction appelée opérandes. Dans la suite, sauf exception, le vocable"instruction"désigne l'ensemble des octets définissant une instruction, c'est-à-dire le code opération (opcode) et ses éventuels opérandes. Après une première étape principale El, consistant en la compilation effectuée par le compilateur COM, le procédé de compression selon l'invention comporte une détection de séquences répétées d'instructions SQ dans le programme compilé PGC à une étape E2, puis génère en langage intermédiaire des annotations AN définissant respectivement des caractéristiques des séquences répétées détectées SQ à une étape E3. Les séquences détectées sont remplacées ultérieurement, lors de la compression effective dans la carte à puce CP, par des macro-instructions respectives MI. Les deux étapes E2 et E3 sont réalisées par l'analyseur sémantique AS selon l'invention. Il est rappelé que la norme Java Card 2.11 réserve 187 octets d'instruction normalisée IN, numérotés de 0 à 184 puis de 254 à 255 = 28 - 1. Chacun des 254-184-1=69 octets d'instruction restants, qui peuvent être suivis chacun d'un nombre prédéterminé d'octets de paramètres, appelés opérandes, ne sont pas utilisés et sont exploités pour désigner au moins 69 macro-instructions MI à 1 octet. Parmi les 69 macro-instructions possibles, de préférence l'une d'elles est utilisée pour indiquer que l'octet suivant est une macro-instruction supplémentaire, appelée macro-instruction"étendue", ce qui permet de définir 256 macro-instructions supplémentaires ainsi chacune à 2 octets. A chaque séquence SQ répétée selon un modèle (pattern) déterminé par l'analyseur AS, comme on le verra ci-après, est attribuée une macro-instruction MI définie par des annotations respectives AN en langage intermédiaire. Les annotations sur une séquence donnée consistent principalement en une table d'indirection à 2 octets comportant une adresse ADSQ spécifiant la position de la première instruction de la séquence donnée dans le programme PGC et la longueur à 3 bits LSQ exprimée en octets de la séquence donnée SQ et en la suite d'instructions composant la séquence donnée. En l'espèce, la longueur LSQ d'une séquence d'instructions répétitive codée sur 3 bits permet de détecter des séquences ayant des tailles de 1 à 8 octets dans les instructions normalisées IN du programme compilé PGC. Par exemple, dans la suite suivante d'instructions normalisées IN du programme PGC : ... ABCADBCABC..., dans laquelle chaque lettre représente une instruction (opcode et éventuellement opérande (s)), l'analyseur AS trouve les quatre séquences répétitives suivantes : une séquence à trois instructions ABC apparaissant deux fois, - une séquence à deux instructions BC apparaissant trois fois, une séquence à deux instructions CA apparaissant deux fois, et une séquence à deux instructions AB apparaissant deux fois. L'analyseur AS ne sélectionne en fait que la première séquence à trois instructions ABC en tant que modèle préféré afin de définir une macroinstruction respective Ml qui factorisera cette séquence d'instructions répétitive ultérieurement lors de la compression effectuée dans la carte à puce CA. L'algorithme de sélection des séquences répétitives pour en constituer ultérieurement des macro-instructions inclus dans l'analyseur AS obéit à certains critères tout en respectant certaines contraintes afin que chaque macro-instruction soit facilement exécutable par l'interpréteur IT, c'est-àdire la machine virtuelle Java Card implantée dans la carte à puce CA. Dans l'exemple précédent, la sélection d'une macro-instruction ne dépend pas seulement de la longueur de la séquence correspondante économisée par la macro-instruction, mais également de la réduction globale qui en résulte due à la répétition de la séquence dans le programme compilé PGC après que la séquence ait été sélectionnée. Dans la suite d'instructions précédente, si la séquence à deux instructions BC était sélectionnée, aucun autre modèle de séquence répétitive ne pourrait être trouvé. Par contre, une fois que la séquence à trois instructions ABC est sélectionnée par l'analyseur AS, l'analyseur sélectionne encore la séquence à deux instructions BC qui apparaît dans la séquence ABC répétée deux fois ainsi qu'une autre fois à la suite de l'instruction D. L'analyseur AS génère alors des annotations AN relatives à une macro-instruction M2 qui définissent les caractéristiques de la séquence BC afin de la retrouver ultérieurement. Dans ce cas, la macro-instruction M2 est dite"associée"à, ou "imbriquée"avec, la macro-instruction Ml, ce qui signifie que le code de la macro-instruction M2 est une partie du code de la macro-instruction Ml. Ainsi ultérieurement, après téléchargement des instructions normalisées IN et des annotations AN des séquences d'instructions détectées, la carte à puce CA compresse la suite d'instructions précitée en la suite compressée suivante Ml A D M2 Ml..., avec Ml = [A, M2 (B C)]. La suite compressée contient la macroinstruction Ml à la place de chaque occurrence de la séquence répétitive ABC et la macro-instruction M2 à la place de chaque occurrence de la séquence répétitive BC contenue dans la séquence ABC analysée précédemment. Selon un exemple pratique, l'analyseur AS reçoit la suite d'instructions suivantes dans laquelle Il et 12 sont des octets d'instruction proprement dite (opcode) et PI, P2 et P3 sont des octets de paramètre 12. Il, Pl, P2. Il, Pl, P3. ... 12. Il, Pl, P2. Il, Pl, P3. ... I2 ; I1, P1, P2 ; I1, P1, P3 ; ... ... I1, P1, P3 ; ... La suite précédente comporte une première séquence à sept octets (12 ; Il, PI, P2 ; Il, PI, P3) répétée trois fois et une deuxième séquence à trois octets (Il, PI, P3) répétée deux fois, soit 27 octets qui devraient occuper la mémoire non-volatile de type EEPROM dans la carte à puce CA, si le programme compilé PGC contenant cette suite n'était pas compressé. En fait, l'analyseur AS produit des annotations relatives à une première macroinstruction Mil définissant la première séquence à sept octets par une table d'indirection à deux octets déterminant son adresse et sa taille, ainsi que des annotations analogues définissant la deuxième séquence répétitive à trois octets. Le remplacement de chacune des trois occurrences de la première séquence permet d'économiser 21-12 = 9 octets. Puis l'analyseur AS détermine une deuxième macroinstruction MI2 correspondant à la deuxième séquence (Il, PI, P3) qui est répétée trois fois dans la première séquence répétitive, puis qui est répétée deux fois isolément. Finalement la suite ultérieurement compressée dans la carte CA est : ... MIl... MIl... MIl... MI2... MI2..., dans laquelle MI2 est associée à Mil. La factorisation de la deuxième séquence en la macroinstruction MI2 permet d'économiser encore deux octets, et le programme final compressé occupe alors 16 octets en mémoire non volatile dans la carte à puce. Les annotations AN générées par l'analyseur sémantique d'instruction normalisée AS respectent plusieurs contraintes CSQ sur les séquences d'instructions, afin que chaque macro-instruction MI définie par des annotations lors de la compression ultérieure puisse être facilement exécutée par l'interpréteur IT et préserve les propriétés de sécurité apportées par le vérificateur : - CSQ1) les instructions IN dans une séquence répétitive SQ correspondant à la macro-instruction MI commencent à l'intérieur d'un corps de méthode et se terminent dans la même méthode, c'est-à-dire sont contenues dans le corps d'une méthode commune ; - CSQ2) les instructions de la séquence SQ ne doivent contenir aucune étiquette (label), seule la première instruction de la séquence répétitive pouvant être pointée par une étiquette, ce qui signifie que la macro-instruction elle-même sera pointée par une étiquette ; - CSQ3) les instructions de la séquence SQ ne doivent contenir aucune instruction normalisée brisant le flot d'exécution telle que des instructions de direction, de commutation, de saut conditionné, etc. (GOTO, SWITCH, INVOKE, JUMP SUBROUTINE, JUMP-CONDITION, etc.) ; seule la dernière instruction dans la séquence peut rompre le flot d'exécution ; la lecture du dernier octet d'opérande de cette dernière instruction déclenchera la fin de la macro-instruction et la poursuite du programme compressé, comme si c'était la macro-instruction elle-même qui rompait le flot d'exécution. En variante complémentaire, il est supposé que l'interpréteur IT, c'est-à-dire la machine virtuelle, implémenté dans la carte à puce CA, comprend déjà des macro-instructions exécutables directement par l'interpréteur. Ces macro-instructions, appelées ciaprès"macro-instructions globales"MG, sont le fruit d'une analyse d'un jeu conséquent d'applications dans la carte CA et sont implémentées dans l'interpréteur IT également sous forme d'objets compilés en langage intermédiaire. En pratique, plus d'une centaine de macro-instructions globales MG peuvent être identifiées ; pour chaque programme PGC compilé envoyé à la carte, l'analyseur AS ne peut sélectionner qu'au plus 69 macro-instructions globales parmi la centaine de macro-instructions globales. Quel que soit le nombre de macroinstructions globales déjà prévues dans l'interpréteur IT, l'analyseur AN, après avoir détecté une séquence d'instructions répétitive SQ dans le programme PGC, recherche la séquence détectée dans une table TMG faisant correspondre des séquences SQ à des macro-instructions globales MG. Dans ce cas, à une étape E4 intermédiaire entre les étapes E2 et E3, l'analyseur AS considère que la macro-instruction correspondant à la séquence détectée est une macroinstruction globale MG qui est déjà connue par l'interpréteur IT et dont les annotations prémémorisées AN sont lues par l'analyseur à une étape E5. Les annotations relatives à une macro-instruction globale sont réduites à un octet généré par l'analyseur AS. Si aucune séquence dans la table de correspondance TMG n'est identique à la séquence détectée à l'étape E4, l'analyseur AS génère les annotations AN définissant une nouvelle macroinstruction MI, à l'étape E3. Les instructions d'une séquence correspondant à une macro-instruction globale MG satisfont également les deux premières contraintes CSQ1 et CSQ2 énoncées précédemment pour des instructions d'une macroinstruction MI définie par l'analyseur AS, à savoir que la séquence d'instructions doit commencer à l'intérieur d'un corps de méthode et se terminer dans le même corps de méthode, et ne doit contenir aucune étiquette (label) à l'exception de la première instruction dans la séquence. En outre, selon une autre contrainte CSQ4, une macro-instruction globale MG doit être strictement identique à la portion de code déjà stockée dans la mémoire ROM de la carte CA en relation avec l'interpréteur IT et définissant la macro-instruction globale. En résumé, l'analyseur sémantique d'instruction AS d'abord détecte les modèles des séquences répétitives d'instructions SQ trouvées dans le programme compilé PGC à l'étape E2, puis construit un graphe dont les états sont les modèles des séquences détectées et dont les flèches définissent des liens entre les macro-instructions correspondant aux séquences détectées, afin de suivre le graphe et d'essayer de nombreux jeux de macro-instructions pour sélectionner la meilleure compression à l'étape E3, en tenant compte, si elles existent de macroinstructions globales MG sélectionnées à l'étape E4. En pratique, les annotations AN contenant les informations sur la manière de compresser les instructions IN du programme PGC, c'est-à-dire les tables d'indirection et les séquences d'instructions SQ définissant respectivement les macro-instructions MI, MG, sont incluses dans un composant additionnel CAD. cap construit par l'analyseur AN et ajouté au composant CN normalisé selon la norme Java Card 1.11 et contenant les instructions IN du programme compilé PGC sans macro-instruction. Le composant additionnel CAD comprend notamment un octet représentant le numéro de celui-ci et deux octets indiquant la taille en octet du composant. Le format du composant additionnel CAD (AN) permet la compression des instructions en langage intermédiaire IN en une seule passe dans la carte à puce CA. Le composant additionnel comprend des entrées qui définissent chacune une zone de code dans le programme PGC, c'est-à-dire une séquence d'instructions SQ, qui est à remplacer par une macroinstruction respective. L'entrée pour la première zone contenant la séquence repère le début de la séquence, le nombre de répétitions de la séquence, sa longueur et la macro-instruction qu'elle contient. Le début de la zone de code à compresser est déterminé grâce à un champ de déplacement qui indique le nombre d'instructions à sauter dans la suite des instructions du programme compilé PGC depuis la fin de la dernière zone à compresser contenant la même séquence d'instructions SQ. A une étape E6, le chargeur sécurisé CH assemble le composant d'instructions CN (IN) et le composant additionnel d'annotations CAD (AN) en un programme PCH qui est téléchargé dans la carte à puce CA à travers le réseau internet RES et le terminal TE. Comme montré également à la figure 1, la carte à puce CA comprend essentiellement un vérificateur VER et un éditeur de liens EL, un compresseur CP et l'interpréteur IT. Ces derniers modules logiciels sont implantés dans la mémoire non volatile EEPROM et la mémoire morte ROM de la carte à puce CA. En particulier, de manière connue, l'interpréteur IT est une machine virtuelle Java Card qui est propre à interpréter séquentiellement de manière connue les instructions normalisées IN d'un programme compilé PGC chargé dans la mémoire EEPROM de la carte. Après interprétation d'une instruction IN, l'interpréteur IT fait exécuter celle-ci en code natif par le microprocesseur PR de la carte. Lorsque le programme PCH est transmis par le serveur SE à travers le réseau internet RES via le terminal TE, le programme PCH est chargé dans le vérificateur VER de la carte à travers le navigateur et un module logiciel intermédiaire de type Plugin ou proxy du terminal. D'une manière connue, le vérificateur VER assure des fonctions de sécurité afin de vérifier que le programme chargé PCH contient des fichiers et des classes et plus précisément des instructions IN ainsi que des annotations AN selon l'invention qui sont compatibles avec le bytecode de l'interpréteur IT. En particulier, le vérificateur VER peut analyser une signature du programme chargé PCH afin de s'assurer que les instructions contenues dans celui-ci n'ont pas été modifiées depuis qu'il a été signé dans le chargeur sécurisé CH. L'éditeur de liens EL identifie les liens entre les divers fichiers et classes contenus dans le programme chargé PCH et en particulier entre le composant additionnel d'annotations CAD (AN) et le composant d'instructions normalisées CN (IN) afin d'écrire ces composants respectivement dans des espaces de mémoire MAN et MIN liés au compresseur CP. Selon l'invention, l'opération de compression des instructions contenues dans le composant reçu CN (IN) réalisée dans le compresseur CP est étroitement liée à une vérification des annotations et à une exécution de celles-ci dans le vérificateur VER. La vérification et l'exécution des annotations pour effectuer la compression des instructions comprennent principalement des étapes SI à S11 mises en oeuvre dans les modules VER et CP, comme montré à la figure 2. Initialement, trois pointeurs PAN, PL et PE sont mis à zéro à une étape initiale SO en réponse au téléchargement du programme PCH. Le pointeur PAN est un pointeur de lecture des annotations AN du composant additionnel CAD écrit dans l'espace de mémoire MAN. Le pointeur PL est un pointeur de lecture pour lire des instructions non compressées IN du composant reçu CN (IN) chargé dans l'espace de mémoire MIN. Le pointeur PE est un pointeur d'écriture des instructions compressées dans l'espace de mémoire MIN afin d'y écrire les macro-instructions MI, MG, résultant de la compression de séquences reçues SQ selon des annotations correspondantes reçues, ainsi que d'y écrire d'éventuelles instructions qui ne subissent aucune compression entre les séquences détectées. Comme on le verra ciaprès, la compression est effectuée en une seule passe de la suite d'instructions IN non compressées comprises dans le composant chargé CN (IN), et les instructions reçues non compressées et les instructions compressées au moins en partie sont respectivement lues et écrites dans le même espace mémoire MIN afin d'optimiser l'espace mémoire occupé par le programme chargé PCP après la compression. Le pointeur de lecture PL progresse alors plus vite que le pointeur d'écriture PE. A l'étape SI, le pointeur PAN commande la lecture d'une entrée courante dans le composant additionnel CAD, c'est-à-dire la lecture d'une annotation courante AN dans l'espace de mémoire MAN. L'annotation courante AN lue est vérifiée à l'étape S2 en fonction de la séquence d'instructions SQ à compresser correspondant à l'annotation AN et lue par le pointeur de lecture PL dans l'espace de mémoire MIN. La vérification à l'étape S2 consiste à contrôler les caractéristiques de séquence lue SQ au regard des contraintes de séquence CSQ définies cidessus. Si les caractéristiques de la séquence SQ ne satisfont pas les contraintes CSQ1 à CSQ3, la séquence SQ n'est pas compressée à l'étape S3, et est ré-écrite sans modification dans l'espace de mémoire MIN en fonction du pointeur d'écriture PE. Par exemple, l'étape S2 vérifie que la séquence SQ à compresser ne contient aucune étiquette (label) sauf si la première instruction est une étiquette, auquel cas la macro-instruction correspondante sera une étiquette. Si les contraintes CSQ sont satisfaites par la séquence SQ correspondant à l'annotation courante AN à l'étape S2, l'étape suivante S4 contrôle que la macro-instruction MI, MG désignée par l'annotation courante AN est déjà définie dans le compresseur CP pouvant comporter la table de correspondance TMG relative aux micro-instructions globales. si la macro-instruction désignée MI est inconnue du compresseur CP et n'est pas associée à une autre instruction à l'étape S5, le compresseur crée et mémorise à l'étape S6 la macro-instruction MI en correspondance avec la séquence d'instructions SQ ; plus précisément une table de correspondance dans le compresseur CP inscrit la correspondance entre la table d'indirection comprenant l'adresse de séquence ADSQ et la longueur LSQ de la séquence SQ et la suite des instructions composant la séquence SQ d'une part et la macro-instruction MI, d'autre part. si à l'étape S5 succédant à l'étape S4, la macroinstruction désignée par l'annotation courante AN est réputée comme"associée"à une autre macroinstruction, comme la macro-instruction M2 associée à la macro-instruction Ml dans l'exemple de suite d'instructions précité, le compresseur CP crée et mémorise la macro-instruction MI à l'étape S7, comme à l'étape S6, mais avec un index de référence à la macro-instruction à laquelle elle est associée. Cette indication permet ultérieurement à l'interpréteur IT d'exécuter la macro-instruction réputée"associée"MI dans la macro-instruction à laquelle elle est associée. En revenant à l'étape S4, lorsque la macroinstruction MI définie par l'annotation courante AN est déjà répertoriée dans une table dans le compresseur CP, soit la macro-instruction MI a déjà été créée lors d'une étape précédente S6 ou S7, soit la macro-instruction désignée MI est une macroinstruction globale MG initialement contenue dans le compresseur CP avant le chargement du programme PCH. L'étape suivante S8 vérifie alors que la séquence d'instructions SQ lue par le pointeur PL à l'étape S2 est exactement identique à la séquence SQ mémorisée dans une table de correspondance du compresseur CP en correspondance avec la macro-instruction MI, MG désignée par l'annotation courante AN. Si ce n'est pas le cas, le compresseur S3 refuse de compresser la séquence d'instructions SQ lue. Après l'étape de création de macro-instruction S6 ou S7, ou lorsque la séquence lue SQ est exactement identique à la séquence mémorisée dans une table de correspondance en correspondance avec la macro-instruction désignée MI, MG à l'étape S8, le compresseur CP effectue la compression de la séquence d'instructions lue SQ à l'étape S9, en remplaçant la séquence SQ dans le composant chargé CN (IN) par la macro-instruction désignée MI, MG qui est écrite dans l'espace de mémoire MIN en fonction du pointeur d'écriture PE. Le pointeur PE est alors incrémenté d'une unité et, le cas échéant, du nombre d'instructions suivantes contenues dans le composant CN (IN) qui ne sont pas à compresser et qui sont à ré- écrire à la suite de la macro-instruction MI, MG résultant de la compression de la dernière séquence SQ lue dans l'espace de mémoire MIN. Puis à l'étape suivante S10, les deux pointeurs PAN et PL sont incrémentés convenablement avant de procéder à la vérification de la prochaine annotation dans le composant additionnel CAD, en fonction du nombres des éventuelles instructions suivantes à ne pas compresser. Ainsi le pointeur de lecture d'annotation PAN est incrémenté d'une unité pour passer à la prochaine annotation, et le pointeur de lecture PL qui a été incrémenté de la longueur LSQ de la séquence SQ qui vient d'être compressée est également incrémentée du nombre d'instructions intermédiaires non compressées. L'étape S10 est suivie de l'étape SI s'il existe encore des annotations à traiter dans le composant additionnel CAD dans l'espace de mémoire MAN. En revanche, lorsque toutes les annotations ont été lues dans l'espace de mémoire MAN et toutes les instructions IN ont été ré-écrites dans l'espace de mémoire MIN soit après compression sous la forme de macro-instructions correspondantes MI, MG, soit sans changement, le compresseur CP arrête la compression à l'étape SU afin qu'éventuellement l'interpréteur IT exécute le programme d'instructions compressé PCP. L'exécution du programme compressé CP par l'interpréteur IT, c'est-à-dire la machine virtuelle, se déroule de la manière suivante, en référence à la suite d'instructions normalisées suivante dans le programme compilé PGC et donc écrite dans l'espace de mémoire MIN lors du chargement du programme correspondant PCH après l'étape E5 : ... ABCADBCABC..., correspondant à la suite d'instructions compressées suivantes ré-écrites dans l'espace de mémoire MIN : ... Ml G1 M2 Ml... avec Ml = [A, M2 (B C)]. Au début de l'interprétation du programme compressé précédant PCP, l'interpréteur IT interprète d'abord la première occurrence de la macroinstruction Ml. La macro-instruction Ml est une macro-instruction propre au programme initial PGC et composée de trois instructions normalisées A, B et C. L'adresse AD (ABC) et la longueur L (ABC) de la séquence correspondant à la macro-instruction Ml est codée sous une forme compacte dans la table de correspondance liée au programme PCP. Le compteur de programme courant est alors positionné sur la macroinstruction Ml et les trois instructions normalisées A, B et C sont traitées et interprétées. Puis le compteur de programme passe à la prochaine instruction qui est la macro-instruction G1 marquée comme globale. L'interpréteur IT lit alors une table de correspondance en fonction de l'adresse de la macroinstruction globale G1 de manière à y lire le code natif C A D afin d'exécuter l'opération correspondante. Puis la prochaine instruction dans le programme compressé PCP est la macro-instruction M2"associée" à la macro-instruction Ml déjà exécutée une fois. La table de correspondance est consultée par l'interpréteur IT afin d'y lire les deux instructions normalisées B et C pointées par le compteur de programme. Après exécution des deux instructions normalisées correspondant à la macro-instruction M2, la macro-instruction Ml est à nouveau exécutée. L'interprétation mise en oeuvre dans l'interpréteur IT n'est pas ainsi modifiée mais simplement étendue. Lorsqu'une macro-instruction doit être exécutée par l'interpréteur, celui-ci lit les instructions correspondantes à la macro-instruction dans la table de correspondance comme s'il exécutait une seule instruction. En variante, le chargement, la vérification, l'édition de lien, la compression et l'interprétation dans le vérificateur VER, l'éditeur de liens EL et le compresseur CP sont effectuées à la volée, quasisimultanément au fur et à mesure du chargement du programme PCH dans la carte CA. REVENDICATIONS 1-Procédé pour compresser un programme (PGC) compilé en langage intermédiaire composé d'instructions successives (IN), selon lequel des séquences d'instructions (SQ) sont détectées à l'extérieur d'un dispositif de traitement de données (CA), caractérisé en ce qu'il comprend les étapes de : - analyser (AN, E2, E3), à l'extérieur du dispositif de traitement de données, des séquences d'instructions détectées (SQ) afin de générer respectivement des annotations (AN) en langage intermédiaire définissant des macro-instructions respectives (MI) lorsque les séquences d'instructions détectées satisfont des contraintes prédéterminées (CSQ), - charger (E6) depuis l'extérieur les instructions (IN) et les annotations (AN) dans le dispositif de traitement de données (CA), et - produire et mémoriser (CP, S6-S9) dans le dispositif de traitement de données (CA) des macroinstructions (MI) définies par des annotations de séquences d'instructions chargées qui sont compatibles avec les contraintes (CSQ), respectivement en remplacement des séquences d'instructions chargées (SQ). 2-Procédé conforme à la revendication 1, comprenant après l'étape de charger, l'étape de vérifier (VER, Sl-S4) les annotations chargées (AN) en fonction des contraintes (CSQ) dans le dispositif de traitement de données. 3-Procédé conforme à la revendication 1 ou 2, selon lequel chaque annotation (AN) relative à une séquence d'instructions (SQ) comprend au moins une adresse (ADSQ) positionnant la séquence d'instructions dans le programme compilé (PGC) et la longueur (LSQ) de la séquence d'instructions, ainsi que les instructions contenues dans la séquence. 4-Procédé conforme à l'une quelconque des revendications 1 à 3, selon lequel les annotations (AN) sont incluses dans un composant additionnel (CAD) qui est lié au programme compilé (PGC) et qui est chargé avec celui-ci dans le dispositif de traitement de données (CA). 5-Procédé conforme à l'une quelconque des revendications 1 à 4, selon lequel les contraintes (CSQ) imposées sur chaque séquence d'instructions (SQ) à compresser en macro-instruction (MI) comprennent au moins l'une des suivantes : les instructions dans la séquence sont contenues dans le corps d'une méthode commune ; les instructions dans la séquence ne contiennent aucune étiquette dans la séquence, à l'exception de la première instruction dans la séquence ; aucune instruction de la séquence à l'exception de la dernière instruction de la séquence ne rompt le flot d'exécution du programme compilé. 6-Procédé conforme à l'une quelconque des revendications 1 à 5, selon lequel l'étape d'analyser des séquences (AN, E2, E3) génère au moins une annotation définissant une macro-instruction correspondant à une séquence d'instructions analysée contenue dans une autre séquence d'instructions analysée précédemment. 7-Procédé conforme à l'une quelconque des revendications 1 à 6, selon lequel l'étape d'analyser des séquences (AN, E2, E3) génère au moins une macroinstruction (MG) correspondant à une séquence d'instructions analysée, la correspondance entre ces dernières macro-instruction (MG) et séquence d'instructions étant préalablement mémorisée dans le dispositif de traitement de données (CA). 8-Procédé conforme à l'une quelconque des revendications 1 à 7, selon lequel, lorsqu'une séquence d'instructions chargée (SQ) correspond à une macro-instruction (MI, MG) déjà produite au cours de la compression du programme compilé ou mémorisée préalablement à la compression dans le dispositif de traitement de données (CA), ladite séquence d'instructions est remplacée par ladite macroinstruction déjà produite ou mémorisée. 9-Procédé conforme à l'une quelconque des revendications 1 à 8, selon lequel l'étape de produire et mémoriser (CP, S6-S9) comprend une écriture de chaque macro-instruction (MI, MG) dans un espace de mémoire (MIN) du dispositif de traitement de données (CA) dans lequel la séquence d'instructions (SQ) correspondant à la macroinstruction a été chargée. 10-Procédé conforme à l'une quelconque des revendications 1 à 9, selon lequel le dispositif de traitement de données est un objet électronique portable du type carte à puce (CA).