FR 3038086 A1 20161230 FR 1556097 A 20150629 1 PROCÉDÉ D'EXÉCUTION D'UN PROGRAMME D'ORDINATEUR COMPORTANT UNE FONCTION PARAMÉTRÉE [1] L'invention concerne un procédé d'exécution d'un programme d'ordinateur comportant une fonction paramétrée susceptible d'être exécutée une ou plusieurs fois au cours de l'exécution du programme. L'invention a également pour objet un support d'enregistrement d'informations, un programme d'ordinateur, ainsi qu'une unité centrale pour la mise en oeuvre de ce procédé. [2] La fonction paramétrée comporte au moins un paramètre dont la valeur est 10 obtenue au moment où la fonction est appelée pour être exécutée par un microprocesseur ou durant son exécution par le microprocesseur. [3] Des procédés connus pour exécuter de tels programmes d'ordinateur comportent : a) la fourniture d'un code générique de la fonction dans lequel chaque paramètre de 15 la fonction est codé comme une variable de sorte que ce code générique ne contient pas en lui-même la valeur de ce paramètre mais contient une opération de lecture de sa valeur à une adresse spécifiée par le code générique, b) l'enregistrement dans une mémoire de plusieurs codes spécialisés de cette fonction, écrits dans le langage machine du microprocesseur, chaque code spécialisé 20 réalisant, lorsqu'il est exécuté par le microprocesseur, la même fonction que le code générique mais dans le cas particulier où au moins un paramètre de la fonction est spécialisé, la spécialisation d'un paramètre de la fonction consistant à affecter une valeur spécifique à ce paramètre puis à traiter ce paramètre non plus comme une variable mais comme une constante de sorte que le code spécialisé ne comporte 25 aucune opération de lecture de sa valeur à une adresse située en dehors de la plage continue d'adresses où est enregistré ce code spécialisé, les codes spécialisés enregistrés différant les uns des autres par la valeur affectée au même paramètre spécialisé ou par le paramètre qui a été spécialisé, c) pour chaque code spécialisé, la mémorisation, dans une table, d'une adresse où 30 est enregistré ce code spécialisé dans la mémoire, d) lors de l'exécution du programme, le microprocesseur obtient une valeur numérique pour chaque paramètre de la fonction, puis e) le microprocesseur recherche, dans la table, l'adresse d'un code spécialisé apte, lorsqu'il est exécuté par le microprocesseur, à réaliser la fonction paramétrée avec les 35 valeurs obtenues lors de l'étape d), puis f) si une telle adresse existe dans la table, le microprocesseur réalise la fonction en exécutant directement le code spécialisé enregistré dans la mémoire à cette adresse sans utiliser le code générique, et sinon 3038086 2 g) le microprocesseur réalise cette fonction en utilisant son code générique. [4] Dans cette description, par l'expression « lecture de la valeur d'un paramètre à une adresse », on désigne aussi bien l'opération de lecture de la valeur de ce paramètre dans une mémoire que dans un registre. Ainsi, le terme « adresse » 5 désigne aussi bien une adresse dans une mémoire qu'un identifiant d'un registre dans lequel doit être lue la valeur de ce paramètre. [5] Le code spécialisé d'une fonction s'exécute avec un coût moindre que le code générique de cette fonction, notamment parce qu'il a pu être optimisé, à partir des valeurs spécifiques connues des paramètres. Par exemple, le coût peut être le temps d'exécution, la consommation électrique, la puissance électrique consommée, la température, le niveau de bruit électrique ou acoustique. Par exemple, contrairement au code générique, le code spécialisé ne comporte pas d'opération de lecture de la valeur des paramètres spécialisés en dehors de la plage d'adresses où est enregistré ce code spécialisé. Ainsi, pour réaliser la même fonction, le code spécialisé comporte moins d'instructions que le code générique ou comporte des instructions de lecture moins coûteuses par exemple si les instructions de lecture sont réarrangées pour accéder à de la mémoire locale. Si son exécution nécessite moins d'accès à la mémoire, il sera probablement plus rapide et donc moins coûteux. C'est pour cela que, dès que c'est possible, il est généralement préférable d'exécuter le code spécialisé plutôt que le code générique. [6] Jusqu'à présent, il était connu d'enregistrer un seul code spécialisé pour chaque fonction paramétrée différente. Dans les procédés connus, si un nouveau code spécialisé est généré pour une fonction, alors qu'il existe déjà un ancien code spécialisé enregistré en mémoire pour cette même fonction, le nouveau code spécialisé remplace l'ancien code spécialisé. La recherche en mémoire du code spécialisé à exécuter est donc simple, puisqu'il n'existe, au maximum, qu'un seul code spécialisé par fonction paramétrée différente. Un tel procédé connu est par exemple décrit dans l'article suivant : - I.R.de Assis Costa et al., « Just-in-time value specialization », Computer languages, 30 Systems and Structures, Vol. 40, n° 2, pp 37-52, 2014. [7] Plus récemment, dans la demande US2010/0095284, il a été proposé d'enregistrer dans la mémoire, non pas un seul code spécialisé par fonction, mais plusieurs. Ainsi, à un instant donné, la mémoire peut contenir plusieurs codes spécialisés de la même fonction, chacun de ces codes spécialisés mémorisés ayant 35 été obtenu en spécialisant différemment les paramètres de cette fonction. Pour retrouver en mémoire le code spécialisé à exécuter, la demande US2010/0095284 enseigne de construire un identifiant qui dépend à la fois de la fonction et des valeurs spécifiques des arguments d'appel spécialisés. Ensuite, l'identifiant construit est associé à l'emplacement où est enregistré le code spécialisé correspondant. Enfin, 40 pour retrouver en mémoire ce code spécialisé, l'identifiant du code spécialisé 3038086 3 recherché est d'abord construit à partir des valeurs des arguments de la fonction paramétrée appelée. C'est cet identifiant construit qui est utilisé pour retrouver dans la mémoire le code spécialisé s'il existe (voir par exemple les paragraphes 23, 24 et 29 de la demande US2010/0095284). Pour l'homme du métier, la construction d'un 5 identifiant de la fonction et des valeurs spécifiques des paramètres spécialisés est typiquement obtenue, par exemple, à l'aide d'une fonction de hachage. Ainsi, il ne peut pas être totalement exclu que deux identifiants construits pour deux fonctions f et g différentes et pour des valeurs spécifiques différentes soient identiques. Ceci peut conduire, si rien n'est fait, à l'exécution de la fonction f à la place de la fonction g 10 ou vice versa. Pour éviter ce problème, dans une implémentation réelle de l'enseignement de la demande US2010/0095284, il faut donc en plus implémenter une routine anti-collision (habituellement appelée « garde »)_qui va vérifier que c'est bien le code spécialisé de la bonne fonction qui va être exécuté avant de lancer l'exécution de ce code spécialisé. La construction des identifiants et l'exécution de la 15 routine anti-collision induit un coût supplémentaire. De plus, généralement, la routine anti-collision (code de garde) est incluse dans le préambule du code spécialisé. Cela présente l'inconvénient d'augmenter le nombre d'opérations que doit réaliser le code spécialisé et d'augmenter le coût de la génération de code spécialisé. [8] L'invention vise entre autres à proposer un procédé différent de celui de la 20 demande US2010/0095284 dans lequel le temps mis pour rechercher et vérifier que le code spécialisé trouvé est bien le bon code spécialisé à exécuter, est réduit. [9] Elle a donc pour objet un procédé d'exécution d'un programme d'ordinateur comportant une fonction paramétrée dans lequel : - l'étape c) comporte également la mémorisation, associée à chaque adresse d'un 25 code spécialisé, de la valeur de chacun de ses paramètres spécialisés, et - l'étape e) comporte pour une adresse enregistrée dans la table: el ) la comparaison de la valeur de chaque paramètre spécialisé, associé dans la table à cette adresse, à la valeur du même paramètre obtenue lors de l'étape d), puis e2) si lors de l'opération el ), pour chaque paramètre spécialisé sa valeur mémorisée dans la table correspond à la valeur de ce paramètre obtenue lors de l'étape d), alors le microprocesseur sélectionne cette adresse en tant qu'adresse du code spécialisé apte à réaliser la fonction paramétrée avec les valeurs obtenues lors de l'étape d) et, sinon, le microprocesseur sélectionne une adresse suivante dans la table pour laquelle les opérations el ) et e2) n'ont pas encore été réalisées puis réitère les opérations el) et e2) pour cette adresse suivante. [0010] Le fait d'enregistrer, pour chaque code spécialisé, les valeurs spécifiques des paramètres spécialisés dans la table permet simultanément : - d'utiliser les valeurs des paramètres spécialisés comme un critère de recherche lors de la recherche de l'adresse d'un code spécialisé dans la table, et 3038086 4 - de vérifier en même temps que l'adresse trouvée correspond bien à un code spécialisé apte à réaliser la fonction paramétrée avec les valeurs des paramètres obtenues lors de l'appel de cette fonction ou lors de son exécution. [0011] Dès lors, contrairement au procédé de la demande US2010/0095284, il n'est 5 pas nécessaire pour exécuter un code spécialisé de procéder à deux opérations successives, c'est-à-dire : 1) Construire un identifiant du code spécialisé recherché en fonction des valeurs des paramètres obtenus lors de l'appel ou de l'exécution de la fonction, puis 2) Vérifier que le code spécialisé trouvé correspond bien à celui qui permet de 10 réaliser la fonction paramétrée avec les valeurs obtenues des paramètres. [0012] Ainsi, le procédé revendiqué limite le nombre d'opérations à réaliser avant de déclencher l'exécution d'un code spécialisé. Il est donc moins coûteux. De plus, il n'est plus nécessaire d'introduire dans chaque code spécialisé les opérations de la routine anti-collision. Dès lors, le nombre d'opérations à réaliser par le code 15 spécialisé est réduit et le nombre d'opérations à réaliser par le générateur de code pour générer ce code spécialisé est également réduit. [0013] Les modes de réalisation de ce procédé peuvent comporter une ou plusieurs des caractéristiques suivantes : ^ à chaque fois que l'adresse d'un code spécialisé doit être modifiée, supprimée 20 ou ajoutée dans la table, le microprocesseur génère et enregistre dans la mémoire une routine de recherche écrite dans le langage machine du microprocesseur, cette routine de recherche étant apte, lorsqu'elle est exécutée par le microprocesseur, à réaliser les opérations el ) et e2), cette routine de recherche contenant, codé en tant que constante, chaque adresse 25 et chaque valeur de paramètres spécialisés mémorisés dans la table de sorte que la routine de recherche ne comporte aucune opération de lecture de la valeur d'un paramètre spécialisé ou de l'adresse d'un code spécialisé en dehors de la plage continue d'adresses où est enregistrée cette routine de recherche, et à chaque fois que l'étape e) est exécutée, le microprocesseur 30 exécute directement la routine de recherche enregistrée dans sa mémoire ; ^ - la génération de la routine de recherche comporte pour chaque adresse d'un code spécialisé contenue dans la table, la génération d'un jeu d'instructions qui code un branchement conditionnel direct vers cette adresse du code spécialisé, et lorsque ce branchement conditionnel est exécuté par le 35 microprocesseur, seulement si la valeur de chaque paramètre spécialisé associé dans la table à cette adresse est égale à la valeur du même paramètre obtenue lors de l'étape d), alors le microprocesseur remplace la valeur actuelle d'un compteur ordinal du microprocesseur par cette adresse de sorte que la 3038086 5 prochaine instruction exécutée par le microprocesseur est directement la première instruction de ce code spécialisé ; ^ le procédé comporte l'exécution d'une routine de collecte de données statistiques qui incrémente un compteur, associé à un paramètre de la fonction 5 paramétrée et à une valeur prédéterminée de ce paramètre, à chaque fois qu'une valeur de ce paramètre de la fonction paramétrée obtenue lors de l'étape d) est égale à cette valeur prédéterminée et, en alternance, l'absence d'incrémentation de ce compteur si la valeur obtenue lors de l'étape d) pour ce paramètre est différente de cette valeur prédéterminée, et en réponse au 10 franchissement d'un seuil pré-calculé par ce compteur, la génération, lors d'une étape h), d'un nouveau code spécialisé de la fonction paramétrée en spécialisant le paramètre associé à ce compteur avec la valeur prédéterminée associée à ce compteur, puis l'enregistrement de ce nouveau code spécialisé dans la mémoire et la mise à jour de la table pour y incorporer l'adresse où est 15 enregistré ce nouveau code spécialisé et la valeur du paramètre spécialisé ; ^ le procédé comporte le calcul du seuil pré-calculé à partir d'un rapport Kgen/ [Klib-Kdyn], où : - Kgen est un coût pour exécuter l'étape h), - Kdyn est un coût pour exécuter l'étape f), 20 - Klib est un coût pour exécuter l'étape g), et les coûts Kgen, Kdyn et Klib sont chacun des quantités respectives d'une même grandeur physique ou d'une même combinaison de grandeurs physiques qui varie selon que le microprocesseur exécute l'étape f) ou l'étape g) , 25 ^ lorsque la mémoire est pleine, à chaque fois qu'un nouveau code spécialisé doit être enregistré dans la mémoire, le microprocesseur enregistre ce nouveau code spécialisé à la place du code spécialisé le plus ancien contenu dans cette mémoire ; ^ seulement si aucun des branchements conditionnels directs de la routine de 30 recherche n'a déclenché l'exécution d'un code spécialisé, alors la routine de collecte de données statistiques est exécutée ; ^ les étapes a) à g) sont exécutées, en alternance, pour, respectivement, une première puis une seconde fonctions paramétrées dont les codes génériques sont différents, et l'étape c) comporte en plus la mémorisation dans la table 35 d'un identifiant du code générique de la fonction qui a été spécialisée associé à l'adresse de ce code spécialisé, et lors de l'étape d), le microprocesseur obtient aussi l'identifiant du code générique de la fonction à exécuter, et lors de l'opération el ), le microprocesseur compare l'identifiant, associé dans la table 3038086 6 à l'adresse du code spécialisé, à l'identifiant obtenu lors de l'étape d), et lors de l'opération e2), seulement si lors de l'opération el ), l'identifiant associé à l'adresse du code spécialisé correspond à l'identifiant obtenu lors de l'étape d) et seulement si la valeur de chaque paramètre spécialisé associé dans la table 5 à cette adresse de code spécialisé correspond à la valeur obtenue lors de l'étape d), alors le microprocesseur sélectionne cette adresse en tant qu'adresse du code spécialisé apte à réaliser la fonction paramétrée avec les valeurs obtenues lors de l'étape d) ; ^ les étapes a) à g) sont exécutées pour une fonction paramétrée comportant au 10 moins un premier et un second paramètres dont les valeurs sont obtenues au moment où cette fonction est appelée pour être exécutée par le microprocesseur ou durant son exécution par le microprocesseur, et l'étape b) comporte : - l'enregistrement d'un premier code spécialisé obtenu en spécialisant le 15 premier paramètre de la fonction avec une première valeur spécifique, et - l'enregistrement d'un second code spécialisé obtenu en spécialisant le second paramètre de la fonction avec une seconde valeur spécifique, - l'étape c) comporte en plus la mémorisation dans la table, associée à chaque adresse d'un code spécialisé de cette table, d'un identifiant du ou des 20 paramètres spécialisés pour obtenir le code spécialisé enregistré à cette adresse, - lors de l'opération el ), le microprocesseur identifie le ou les paramètres de la fonction qui ont été spécialisés pour générer le code spécialisé enregistré à cette adresse à l'aide de l'identifiant du ou des paramètres spécialisés 25 associés, dans la table, à cette adresse, puis le microprocesseur compare seulement les valeurs, obtenues lors de l'étape d), des paramètres de la fonction ainsi identifiés aux valeurs de ces mêmes paramètres associés dans la table à cette adresse. [0014] Les modes de réalisation de ce procédé d'exécution d'un programme 30 d'ordinateur présentent en outre les avantages suivants : - L'utilisation d'une routine de recherche écrite en langage machine et comportant l'ensemble du contenu de la table codé en tant que constante permet de réduire le coût d'exécution du programme lorsque l'étape e) est plus fréquemment exécutée que l'étape c), ce qui est généralement le cas. 35 - L'utilisation de branchement conditionnel direct à l'intérieur de la routine de recherche permet dans la majorité des cas de réduire le coût de l'exécution du programme. En effet un branchement conditionnel direct permet de passer directement de l'exécution de la routine de recherche à l'exécution du code spécialisé 3038086 7 recherché sans avoir d'abord à stocker dans un registre l'adresse du code spécialisé trouvé dans la table avant de lancer son exécution. - En exécutant la routine de collecte statistique après les branchements conditionnels directs de la routine de recherche, cette routine de collecte de données statistiques 5 n'est exécutée que s'il n'y a pas d'égalité entre les valeurs des paramètres obtenus lors de l'étape d) et des valeurs des paramètres spécialisés enregistrées dans la table. Dès lors, les branchements conditionnels directs servent aussi à filtrer les appels à cette routine de collecte statistique, ce qui limite le nombre de fois où elle est exécutée et donc accélère la vitesse d'exécution du programme. 10 - La collecte de données statistiques sur les valeurs utilisées pour les paramètres de la fonction permet de déclencher la génération de codes spécialisés en fonction de l'utilisation du programme exécuté et donc d'adapter l'exécution du programme d'ordinateur au contexte dans lequel il est exécuté. - Déclencher la génération d'un code spécialisé à partir du rapport Kgen/(Klib - Kdyn) 15 permet de déclencher la génération d'un code spécialisé même si le cumul du coût pour générer ce code spécialisé et du coût pour exécuter ce code spécialisé est supérieur au coût d'exécution du code générique de la fonction. En effet, cela permet de prendre en compte le fait que le coût Kgen peut être amorti non pas après une seule exécution du code spécialisé, mais seulement après plusieurs exécutions de ce 20 code spécialisé. - L'enregistrement dans la table, associé à chaque adresse du code spécialisé, d'un identifiant de la fonction paramétrée qui a été spécialisée permet de spécialiser plusieurs fonctions différentes, et donc d'accélérer l'exécution du programme. - La mémorisation dans la table d'un identifiant du ou des paramètres qui ont été 25 spécialisés permet de générer et d'utiliser des codes spécialisés obtenus en spécialisant différents paramètres de cette fonction. On augmente ainsi le nombre de codes spécialisés différents qui peuvent être générés, et donc le nombre de possibilités pour accélérer l'exécution du programme. En fin de compte, cela se traduit, dans la plupart des cas, par une réduction du coût de l'exécution du 30 programme. [0015] L'invention a également pour objet un support d'enregistrement d'informations et un programme d'ordinateur comportant des instructions pour l'exécution du procédé revendiqué, lorsque ces instructions sont exécutées par un microprocesseur. [0016] Enfin, l'invention a également pour objet une unité centrale électronique pour 35 exécuter un programme d'ordinateur comportant au moins une fonction paramétrée susceptible d'être exécutée une ou plusieurs fois au cours de l'exécution du programme, cette fonction comportant au moins un paramètre dont la valeur est obtenue au moment où la fonction est appelée pour être exécutée par un microprocesseur ou durant son exécution par le microprocesseur, cette unité centrale comportant : 3038086 8 - une mémoire ou un ensemble de mémoires contenant : - un code générique de la fonction dans lequel chaque paramètre de la fonction est codé comme une variable de sorte que ce code générique ne contient pas en lui-même la valeur de ce paramètre mais contient une opération de lecture 5 de sa valeur à une adresse spécifiée par le code générique, - plusieurs codes spécialisés de cette fonction, écrits dans le langage machine du microprocesseur, chaque code spécialisé réalisant, lorsqu'il est exécuté par le microprocesseur, la même fonction que le code générique mais dans le cas particulier où au moins un paramètre de la fonction est spécialisé, la 10 spécialisation d'un paramètre de la fonction consistant à affecter une valeur spécifique à ce paramètre puis à traiter ce paramètre non plus comme une variable mais comme une constante de sorte que le code spécialisé ne comporte aucune opération de lecture de sa valeur à une adresse située en dehors de la plage continue d'adresses où est enregistré ce code spécialisé, 15 les codes spécialisés enregistrés différant les uns des autres par la valeur affectée au même paramètre spécialisé ou par le paramètre qui a été spécialisé, - un microprocesseur programmé pour exécuter les étapes suivantes : c) pour chaque code spécialisé, la mémorisation, dans une table, d'une adresse où 20 est enregistré ce code spécialisé dans la mémoire, d) lors de l'exécution du programme, le microprocesseur obtient une valeur numérique pour chaque paramètre de la fonction, puis e) le microprocesseur recherche, dans la table, l'adresse d'un code spécialisé apte, lorsqu'il est exécuté par le microprocesseur, à réaliser la fonction paramétrée avec les 25 valeurs obtenues lors de l'étape d), puis f) si une telle adresse existe dans la table, le microprocesseur réalise la fonction en exécutant directement le code spécialisé enregistré dans la mémoire à cette adresse sans utiliser le code générique, et sinon g) le microprocesseur réalise cette fonction en utilisant son code générique, 30 dans lequel le microprocesseur est également programmé de manière à ce que : - l'étape c) comporte également la mémorisation, associée à chaque adresse d'un code spécialisé, de la valeur de chacun de ses paramètres spécialisés, et - l'étape e) comporte pour une adresse enregistrée dans la table: el ) la comparaison de la valeur de chaque paramètre spécialisé, associé 35 dans la table à cette adresse, à la valeur du même paramètre obtenue lors de l'étape d), puis e2) si lors de l'opération el ), pour chaque paramètre spécialisé sa valeur mémorisée dans la table correspond à la valeur de ce paramètre obtenue 3038086 9 lors de l'étape d), alors le microprocesseur sélectionne cette adresse en tant qu'adresse du code spécialisé apte à réaliser la fonction paramétrée avec les valeurs obtenues lors de l'étape d) et, sinon, le microprocesseur sélectionne une adresse suivante dans la table pour laquelle les opérations el ) et e2) 5 n'ont pas encore été réalisées puis réitère les opérations el) et e2) pour cette adresse suivante. [0017] L'invention sera mieux comprise à la lecture de la description qui va suivre, donnée uniquement à titre d'exemple non limitatif et faite en se référant aux dessins sur lesquels : 10 - la figure 1 est une illustration schématique d'une unité centrale programmée pour exécuter un programme d'ordinateur comportant des fonctions paramétrées ; - la figure 2 est une illustration schématique de la structure d'une table utilisée dans l'unité centrale de la figure 1 ; - la figure 3 est un organigramme d'un procédé d'exécution d'un programme 15 d'ordinateur à l'aide de l'unité centrale de la figure 1 ; - la figure 4 est un pseudo-code partiel d'un programme d'ordinateur susceptible d'être exécuté à l'aide du procédé de la figure 3, et - la figure 5 est un pseudo-code partiel d'une routine de recherche mise en oeuvre dans le procédé de la figure 3. 20 [0018] Dans ces figures, les mêmes références numériques sont utilisées pour désigner les mêmes éléments. Dans la suite de cette description, les caractéristiques et fonctions bien connues de l'homme du métier ne sont pas décrites en détails. [0019] Dans cette description, une « instruction » désigne une instruction machine directement exécutable par un microprocesseur. Une telle instruction est typiquement 25 constituée : - d'un opcode, ou code d'opération, codant la nature de l'opération à exécuter, et - d'un ou plusieurs opérandes définissant la ou les valeurs des paramètres de cette opération. [0020] Un « code binaire » ou un « code écrit en langage machine » est un 30 ensemble d'instructions machines. Il s'agit typiquement d'un fichier contenant une succession de bits portant la valeur « 0 » ou « 1 », ces bits codant les instructions à exécuter par le microprocesseur. Le code binaire est directement exécutable par le microprocesseur, c'est-à-dire sans nécessiter une compilation ou une interprétation préalable. 35 [0021] On parle d'exécution d'une fonction pour désigner l'exécution des instructions réalisant cette fonction. [0022] Dans un souci de simplification, dans cette description, les instructions ne sont pas représentées sous forme binaire, mais plutôt sous une forme symbolique exprimée dans un langage machine ou assembleur. En particulier, l'opcode est 40 représenté de façon connue par un mnémonique. 3038086 10 [0023] La figure 1 représente une unité centrale électronique 1 comportant un microprocesseur 2 et un support 16 d'enregistrement d'informations. Ce microprocesseur 2 comporte ici : - une unité arithmétique et logique 4 ; 5 - un ensemble de registres 6 ; - un module de commande 10 ; - une interface 12 d'entrée/sortie de données qui permet d'accéder au support 16 par l'intermédiaire d'un bus mémoire. [0024] Le support 16 comporte, par exemple : 10 - une mémoire programme 18, par exemple non volatile, telle qu'une mémoire EEPROM ou Flash, et - une mémoire 22 à accès non séquentiel plus connu sous l'acronyme de « RAM » (Random Access Memory), et - une mémoire 20 de données. 15 [0025] Ces mémoires 18, 20 et 22 peuvent être des mémoires matérielles distinctes les unes des autres ou des mémoires logicielles. Les mémoires logicielles correspondent à différentes plages d'adresses, par exemple, à l'intérieur d'une même mémoire matérielle. Il peut aussi s'agir d'une combinaison de mémoires matérielles et logicielles. En particulier, ici, la mémoire 22 est une mémoire cache logicielle et non 20 pas une mémoire cache matérielle. [0026] Les mémoires 18 et 22 sont configurées pour stocker des instructions devant être exécutées par l'unité 4. Typiquement, un compteur ordinal, également appelé « pointeur d'instruction », du microprocesseur 2 pointe sur l'emplacement de la mémoire 18 ou 22 contenant la prochaine instruction à exécuter par l'unité 4. Le 25 microprocesseur 2 est notamment configuré pour exécuter les instructions stockées dans la mémoire 18 ou 22, la plus part du temps dans l'ordre où ces instructions sont stockées dans ces mémoires, et, le cas échéant, à stocker le résultat de ces instructions exécutées dans un ou plusieurs des registres 6 ou dans la mémoire 20 ou 22. Ici, on considère qu'une instruction, pour être exécutée par l'unité 4, doit être 30 placée dans la mémoire 18 ou 22. Dans cette description, on utilisera comme synonymes « exécution par le microprocesseur 2 » et « exécution par l'unité 4 ». [0027] Le module 10 est configuré pour déplacer des mots mémoires entre les registres 6, le support 16, et l'interface 12. On notera que les mots mémoires enregistrés dans la mémoire 22 peuvent être traités, en alternance, soit comme des 35 instructions soit comme des données. À cet effet, le microprocesseur comporte également ici un bus d'échange de données et d'instructions 14. L'interface 12 est notamment apte à acquérir des données, par exemple depuis la mémoire 20 extérieur au microprocesseur 2. Dans ce mode de réalisation, il n'est pas fait de distinction entre le bus de données et le bus d'instructions. Ces deux types de bus sont 40 représentés par le seul bus 14. 3038086 11 [0028] Dans ce mode de réalisation, les ressources mémoires utilisées sont très limitées. Par exemple, la taille de la mémoire 22 est inférieure à 1 Mo ou 500 ko ou 128 ko. Par exemple, la mémoire 22 est une mémoire volatile. [0029] Un tel microprocesseur 2 est bien connu de l'homme du métier et ne sera pas 5 décrit en détail. Dans cet exemple, le microprocesseur 2 est le microprocesseur MSP430 commercialisé par la société « Texas Instruments ». [0030] La mémoire 18 comporte un programme 28 à exécuter. Il peut s'agir d'un programme apte à commander des périphériques électroniques tels qu'une interface homme-machine ou une imprimante. Il peut également s'agir d'un programme apte à 10 acquérir des données transmises par des capteurs électroniques, puis à les traiter. Il peut aussi s'agir d'un programme qui traite des données techniques comme par exemple un programme de simulation assistée par ordinateur. De façon plus générale, l'enseignement donné ici s'applique à tout type de programmes exécutés par un microprocesseur. 15 [0031] Dans ce mode de réalisation, à titre d'illustration, le programme 28 n'est pas directement écrit dans le langage machine du microprocesseur 2, mais dans un langage intermédiaire indépendant des spécificités de l'architecture matérielle de l'unité centrale 1 sur laquelle doit être exécuté ce programme. Par exemple, le programme 28 est écrit en Bytecode, tel que du Bytecode Java®. 20 [0032] Le programme 28 comporte de nombreuses fonctions paramétrées. Une fonction paramétrée est une fonction qui comporte au moins un paramètre dont la valeur est obtenue au moment où cette fonction est appelée pour être exécutée par le microprocesseur 2 ou pendant son exécution par le microprocesseur 2. Fréquemment, un paramètre est un argument de la fonction dont la valeur est 25 obtenue au moment où cette fonction est appelée pour être exécutée par le microprocesseur 2. On dit alors que le paramètre est explicite, car il figure explicitement comme argument de la fonction dont la valeur doit être fournie pour que la fonction puisse être réalisée. C'est le cas le plus courant pour une fonction paramétrée. Toutefois, il existe aussi des paramètres qui n'apparaissent pas comme 30 étant explicitement des arguments de la fonction, mais dont les valeurs sont lues en mémoire lors de la réalisation de cette fonction. C'est par exemple le cas d'une variable globale. Une telle variable globale est déclarée généralement au début du programme et peut-être utilisée à l'intérieur de toutes les fonctions du programme sans qu'il soit nécessaire que cette variable globale apparaisse explicitement dans la 35 liste des arguments de ces fonctions. Par exemple, une variable globale peut être utilisée pour contenir la taille d'une image ou d'une matrice. Un autre exemple d'un paramètre implicite est une variable destinée à contenir une valeur retournée par une sous-fonction appelée par la fonction. [0033] Puisque les valeurs des paramètres ne sont pas connues au moment où le 40 programme est écrit, mais seulement au moment de son exécution, chaque 3038086 12 paramètre est codé comme une variable dans le code générique de la fonction paramétrée. Ainsi, le code générique de chaque fonction paramétrée, contenu dans le programme 28, comporte des opérations de lecture de la valeur de chaque paramètre dans une mémoire, avant de pouvoir traiter ce paramètre. Par exemple, la valeur du 5 paramètre est utilisée, à l'intérieur du code générique de la fonction, comme opérande d'une ou plusieurs opérations à réaliser. Il peut s'agir de n'importe quelle opération. Par exemple, ces opérations sont des opérations arithmétiques, booléennes ou de lecture d'une données à une adresse spécifiée par la valeur du paramètre. Le paramètre peut aussi être de nature non fonctionnelle. Par exemple, il 10 contient des informations sur les caractéristiques de la micro-architecture du microprocesseur 2 sur lequel va être exécuté le programme 28. [0034] Une fonction correspond à au moins un bloc de base. Un bloc de base est une succession d'instructions à exécuter systématiquement les unes après les autres et donc situées à des adresses consécutives dans la mémoire programme 8 15 lorsqu'elles sont chargées dans cette mémoire. Un bloc de base comprend un seul point d'entrée (la première instruction du bloc) et un seul point de sortie (la dernière instruction). Ce bloc de base se termine par un branchement, c'est-à-dire un saut à une adresse non-consécutive de la mémoire programme 10. Le début du bloc de base débute par une instruction vers laquelle un branchement du programme pointe. 20 Toutefois, une fonction n'est pas limitée à un seul bloc de base et peut comporter plusieurs blocs de base dont les exécutions doivent être enchaînées les unes après les autres. Par la suite, pour simplifier cette description, on considère que le programme 28 comporte deux fonctions paramétrées f et g. La fonction f comporte deux paramètres notés pf1 et pf2 et la fonction g comporte trois paramètres notés 25 pg1, pg2 et pg3. [0035] Dans le cas particulier décrit ici, pour exécuter le programme 28 sur le microprocesseur 2, la mémoire 18 comporte aussi : - le code d'un interpréteur 30 de Bytecode, - le code d'un générateur 32 de code spécialisé, et 30 - le code d'un gestionnaire 34 du flux d'exécution du programme à exécuter. [0036] Chacun de ces codes 30, 32 et 34 est, de préférence, écrit dans le langage machine du microprocesseur 2 et donc directement exécutable par ce microprocesseur. Dans cette description, lorsqu'on dit qu'un code, une instruction ou un bloc d'instructions est directement exécutable par le microprocesseur 2, cela 35 signifie que ce code, cette instruction ou ce bloc d'instructions est écrit dans le langage machine du microprocesseur 2 et qu'il n'est donc pas nécessaire de le compiler ou de l'interpréter avant de pouvoir l'exécuter. [0037] L'interpréteur 30 est également connu sous le terme de « machine virtuelle » dans le cas particulier du Bytecode Java. L'interpréteur contient un jeu de routines en 40 langage machine associées à chaque instruction contenue dans le jeu d'instruction 3038086 13 bytecode. L'interprétation consiste à exécuter la routine en langage machine correspondant à chaque instruction bytecode du programme. [0038] Le générateur 32 génère un code binaire spécialisé à partir du code générique d'une fonction et l'enregistre dans la mémoire 22. Dans ce mode de 5 réalisation, le générateur 32 est un compilateur à la volée plus connu sous le nom de « compilateur JIT (Just In Time) ». Ici, il est utilisé pour générer, à partir du code générique d'une fonction, un code spécialisé de cette fonction en spécialisant un ou plusieurs des paramètres de cette fonction. La spécialisation d'un paramètre d'une fonction consiste à affecter une valeur spécifique à ce paramètre, puis à optimiser et 10 à compiler le code générique de cette fonction en tenant compte de la valeur spécifique connue du paramètre spécialisé, pour obtenir le code spécialisé. Le code spécialisé réalise, lorsqu'il est exécuté par le microprocesseur 2, la même fonction que si le code générique était interprété par l'interpréteur 30, mais en exécutant moins d'instructions. Par exemple, si l'on spécialise le paramètre pfl de la fonction f 15 avec la valeur spécifique « 2 », on obtient un code spécialisé, noté Sf-2,pf2, qui réalise, lorsqu'il est exécuté par le microprocesseur 2, exactement la même fonction f(2,pf2) que celle qui serait réalisée en interprétant le code générique de la fonction f dans le cas où la valeur du paramètre pfl est égale à « 2 ». [0039] Par la suite, on utilise la notation suivante pour désigner un code spécialisé 20 « Sb-al ,a2, ..,an », où : - « S » indique qu'il s'agit d'un code spécialisé. - « b » est l'identifiant du code générique spécialisé. Dans cet exemple, b prend soit la valeur f pour identifier la fonction f soit la valeur g pour identifier la fonction g. - «a1, a2, ..., an » est la liste des paramètres de la fonction classés dans l'ordre où ils 25 apparaissent en tant qu'arguments de la fonction. Si le paramètre « ai » a été spécialisé, il est remplacé par sa valeur spécifique. S'il n'a pas été spécialisé, il est remplacé par le nom de son paramètre. Par exemple, la notation Sg-2,3,pg3 désigne le code spécialisé de la fonction g obtenu en spécialisant les paramètres pg1 et pg2 avec, respectivement, les valeurs 30 spécifiques 2 et 3 et dans lequel le paramètre pg3 n'a pas été spécialisé. [0040] Le coût d'exécution du code Sf-2,pf2 est inférieur au coût d'interprétation du code générique de la fonction f(2, pf2). Par exemple, le nombre d'instructions du code Sf-2,pf2 est inférieur au nombre d'instructions exécutées par le microprocesseur 2 lorsque le code générique de cette fonction f(2, pf2) est interprété. En effet, puisque 35 la valeur du paramètre pfl est connue lors de la compilation du code générique, le générateur 32 traite ce paramètre non plus comme une variable, mais comme une constante, et cela permet d'optimiser le code spécialisé généré. Pour cela, le générateur 32 met en oeuvre au moins l'une des deux optimisations suivantes. La première optimisation consiste à inclure la valeur du paramètre spécialisé directement 3038086 14 dans le code spécialisé généré. La deuxième optimisation consiste à supprimer le paramètre spécialisé du code spécialisé. [0041] La suppression d'un paramètre spécialisé est illustrée dans le cas particulier où le code générique comporte une opération : « Si pf1 3 Alors faire l'action 1, 5 Sinon faire l'action 2 ». Si la valeur spécifique du paramètre pf1 est égal à 2, le générateur 32 génère un code spécialisé comportant seulement l'opération : « faire action 1 ». Dans ce cas, les instructions de test de la valeur du paramètre pf1 sont omises et le paramètre pf1 n'apparaît plus à cet endroit dans le code spécialisé généré. 10 [0042] Que le paramètre pf1 ait été remplacé par une constante ou tout simplement supprimé du code spécialisé, dans tous les cas, le code spécialisé ne comporte plus d'instruction de lecture de sa valeur à une adresse mémoire située en dehors de la plage continue d'adresses où est enregistré le code spécialisé. A cause de cela, le code spécialisé peut comporter moins d'instructions que le code générique. De plus, 15 les instructions de lecture de la valeur d'un paramètre en mémoire sont des instructions coûteuses en temps d'exécution. Ainsi, par exemple, le code spécialisé généré permet au microprocesseur 2 d'exécuter plus rapidement la fonction f que s'il devait pour cela interpréter le code générique de cette même fonction f. [0043] Le gestionnaire 34 a pour fonction de gérer le flux d'exécution du programme 20 28. En particulier, comme cela sera décrit plus en détail plus loin, le gestionnaire 34 regroupe les routines suivantes : - un générateur 35 d'une routine 36 de recherche dans une table 38 de l'adresse d'un code spécialisé, - une routine 40 de collecte de données statistiques, et 25 - une routine 42 de gestion de la mémoire 20. [0044] La figure 2 est une illustration schématique de la table 38 et de son contenu sous la forme d'un tableau de colonnes et de lignes. L'homme du métier comprend que cette représentation de la table 38 est une vue de l'esprit qui simplifie les explications et qu'il existe un très grand nombre de possibilités pour enregistrer dans 30 la mémoire 20 une telle table. Par contre, quelle que soit la possibilité choisie pour enregistrer la table 38 dans la mémoire 20, celle-ci permet de reconstruire une représentation de cette table sous la forme d'un tableau comme illustré sur la figure 2. Ainsi, la table 38 correspond à une zone de la mémoire 20 dans laquelle sont enregistrées les informations représentées sous la forme d'un tableau dans la figure 35 2. Dans un premier temps, les explications sur le fonctionnement de l'unité centrale 1 sont données en utilisant la représentation de la table 38 sous la forme d'un tableau. Ensuite, en référence à la figure 5, un exemple de codage de la routine 36 de recherche dans la table 38 est décrit. [0045] La table 38 comporte ici sept colonnes et une ligne par code spécialisé 40 enregistré dans la mémoire 20. La première colonne comporte l'identifiant du code 3038086 15 générique de la fonction spécialisée. Ici, les identifiants des fonctions f et g sont notées, respectivement, If et Ig. Par exemple, l'adresse où a été enregistré le code générique de la fonction est utilisée en tant qu'identifiant de ce code générique. Cet identifiant est indépendant des valeurs des paramètres de cette fonction. La 5 deuxième colonne comporte l'identifiant des paramètres de la fonction qui ont été spécialisés. Ce mode de réalisation est décrit dans le cas particulier où les paramètres spécialisés sont des paramètres explicites de la fonction, c'est-à-dire les arguments de cette fonction. Ce qui est décrit par la suite dans ce cas particulier des paramètres explicites, s'applique à l'identique aux paramètres implicites des fonctions 10 paramétrées. De plus, on suppose que les paramètres sont toujours spécialisés dans l'ordre où ils apparaissent en tant qu'argument dans la fonction. Ainsi, le premier paramètre pf1 est toujours spécialisé avant le paramètre pf2. Dès lors, le générateur 32 peut générer les codes spécialisés Sf-0,pf2 et Sf-0,2. Par contre, le code spécialisé Sf-pf1,0 , où seul le paramètre pf2 est spécialisé ne peut pas être généré, 15 puisque le paramètre pf1 apparaît, dans l'ordre des arguments de la fonction f, avant le paramètre pf2. Avec ces hypothèses, le nombre de paramètres spécialisés de la fonction est suffisant pour identifier sans ambiguïté les paramètres spécialisés. Dans le cas présent, le nombre « 1 » est systématiquement ajouté au nombre de paramètres spécialisés. Grâce à cela, le nombre contenu dans la deuxième colonne 20 repère en plus la fin de la ligne. [0046] La troisième colonne contient l'adresse dans la mémoire 22 où est enregistré le code spécialisé. Ici, cette adresse pointe sur la première instruction du code spécialisé enregistré dans la mémoire 22. Pour les adresses, on utilise la même notation que pour les codes spécialisés sauf que la lettre « S » est remplacée par le 25 symbole « @ ». Sur la figure 2, les symboles « VO » à « V5 » représentent des valeurs spécifiques. [0047] Les quatrième, cinquième, sixième et septième colonnes sont destinées à contenir les valeurs spécifiques des paramètres spécialisés. Dans le cas particulier représenté ici, seuls deux paramètres de la fonction f ont été spécialisés, et seul un 30 paramètre de la fonction g l'a été. Ainsi, les sixième et septième colonnes sont vides. De plus, les cellules de la cinquième colonne associées aux codes spécialisés SgV5,pg2,pg3 et Sg-V0,pg2,pg3 sont aussi vides, car la fonction g n'a été spécialisée que pour les valeurs V5 et VO de son premier paramètre pg1. Sur la figure 2, la ligne ondulée indique que seule une partie du contenu de la table 38 a été représentée. 35 Bien entendu, la table 38 peut contenir des colonnes supplémentaires si plus de quatre paramètres d'une fonction sont spécialisés. [0048] Le procédé d'exécution du programme 28 va maintenant être décrit en référence à la figure 3. Initialement, lors d'une étape 50, le microprocesseur 2 commence par exécuter l'interpréteur 30 L'interprétation consiste à exécuter la 40 routine en langage machine correspondant à chaque instruction bytecode du 3038086 16 programme en balayant les unes après les autres les opérations en Bytecode du programme 28. Ainsi, l'étape 50 est réitérée pour l'opération suivante du programme 28. Lors de ces réitérations de l'étape 50, le microprocesseur 2 obtient d'abord les valeurs de chaque paramètre d'une fonction paramétrée avant de l'appeler avec les 5 valeurs ainsi obtenues. L'appel de la fonction se matérialise par un branchement vers l'adresse où est enregistré le code générique de cette fonction. L'adresse vers laquelle l'exécution du programme 28 est déroutée est nécessairement l'adresse du code générique de la fonction, étant donné que le programme 28 ne connaît pas et ne gère pas l'exécution de code spécialisé. 10 [0049] Un branchement est un saut qui déroute l'exécution du programme vers une autre instruction que l'instruction immédiatement suivante dans la mémoire 18 ou 22. Par exemple, pour cela, la valeur du compteur ordinale est changée pour que le pointeur d'instruction du microprocesseur 2 pointe vers une autre instruction que l'instruction suivante. 15 [0050] Dès qu'un branchement vers l'adresse d'une fonction doit être exécuté, lors d'une étape 52, la routine 36 de recherche est exécutée. L'exécution d'un tel branchement correspond à l'appel d'une fonction avec les valeurs des paramètres obtenues lors de l'exécution de l'étape 50. [0051] Lors de l'étape 52, le microprocesseur 2 recherche dans la table 38 s'il existe 20 un code spécialisé apte à réaliser la fonction appelée lorsqu'il est exécuté. Pour cela, le microprocesseur 2 balaie, dans l'ordre, les lignes de la table 38 en partant de la première ligne et en allant vers la dernière ligne. Ainsi, il réalise les opérations suivantes : a) il sélectionne une ligne de la table 38, puis 25 b) il lit l'identifiant du code générique contenu dans la première cellule de cette ligne, puis c) il compare l'identifiant du code générique lu à l'adresse du code générique appelé, d) si l'identifiant du code générique lu n'est pas égal à l'adresse du code générique appelé, le microprocesseur exécute à nouveau les opérations a) à c), mais pour la 30 ligne suivante de la table 38, e) si l'identifiant du code générique lu lors de l'opération b) est égal à l'adresse du code générique appelé, le microprocesseur 2 lit l'identifiant des paramètres spécialisés contenus dans la deuxième cellule de cette ligne. Ici, cette identifiant des paramètres spécialisés est un nombre entier positif noté n. Ensuite, le 35 microprocesseur 2 exécute le pseudo-code suivant : Pour i allant de 4 à n+2 : Si T[L,i] est différent de la valeur du i-ième paramètre obtenue lors de l'exécution de l'étape 50, Alors sortir de la boucle et exécuter à nouveau les opérations a) à c) pour la ligne suivante de la table 38. 40 Fin pour. 3038086 17 [0052] Dans le pseudo-code ci-dessus, T[L,i] est le contenu de la cellule de la table 38 située à l'intersection de la ligne n° L sélectionnée lors de l'opération a) et de la colonne i. Ici, la numérotation des colonnes de la table 38 commence avec le chiffre 1. 5 [0053] Si la boucle « Pour... Fin pour » du pseudo-code ci-dessus s'exécute jusqu'à la fin, cela signifie que les valeurs spécifiques de tous les paramètres spécialisés sont égaux aux valeurs des paramètres de la fonction appelée. Il existe donc un code spécialisé capable de réaliser exactement la même fonction que le code générique appelé avec les valeurs des paramètres obtenus lors de l'étape 50. 10 [0054] Dans ce cas, lors d'une étape 54, le microprocesseur 2 déclenche l'exécution du code spécialisé dont l'adresse est contenue dans la troisième cellule de la ligne sélectionnée lors de la dernière exécution de l'opération a) de l'étape 52. [0055] On notera que lorsque l'étape 54 est exécutée, il n'est pas nécessaire d'interpréter ou de compiler le code générique de la fonction, ce qui constitue déjà un 15 gain de temps substantiel. De plus, comme expliqué précédemment, le code spécialisé s'exécute aussi plus rapidement que le code générique, car, par exemple, il n'a pas besoin d'aller lire les valeurs de tous les paramètres de la fonction avant de les traiter. Ainsi, l'exécution du code spécialisé accélère substantiellement la réalisation de la fonction par le microprocesseur 2. À la fin de l'exécution du code 20 spécialisé, le microprocesseur retourne à l'étape 50 et reprend l'interprétation du programme 28 à l'opération suivante. [0056] Si à l'issue de l'étape 52, aucun code spécialisé n'a été trouvé dans la table 38, le microprocesseur 2 exécute une étape 56 de collecte de données statistiques. Pour cela la routine 40 est exécutée par le microprocesseur 2. Lors de cette étape 56, 25 le microprocesseur 2 collecte et mémorise des données statistiques sur l'exécution des fonctions paramétrées du programme 28. Ces données statistiques sont destinées à être utilisées pour décider si oui ou non un code spécialisé doit être généré. [0057] L'étape 56 va maintenant être décrite plus en détail dans le cas particulier de 30 la fonction paramétrée f. Toutefois, les explications données dans ce cas particulier se transposent sans difficulté, pour l'homme du métier, à toute autre fonction paramétrée du programme 28 telle que la fonction g. [0058] A chaque fois que l'étape 56 est exécutée pour la fonction f avec les valeurs spécifiques Vx et Vy pour, respectivement, les paramètres pfl et pf2 de cette 35 fonction, le microprocesseur 2 met à jour la valeur d'un compteur Cf-Vx,pf2 et un compteur Cf-Vx,Vy. Ici, la mise à jour consiste à incrémenter d'un pas prédéterminé les valeurs de ces compteurs. Les valeurs Vx et Vy des paramètres pfl et pf2 sont celles obtenues lors de la précédente itération de l'étape 50. La notation utilisée ici pour désigner les compteurs est la même que celle utilisée pour désigner les codes 3038086 18 spécialisés sauf que la lettre « S » est remplacée par la lettre « C ». Le pas prédéterminé est, par exemple, égal à un. [0059] Ainsi, il existe un compteur Cf-Vx,pf2 associé à chaque valeur Vx différente obtenue lors de l'exécution du programme 28 et pour laquelle il n'existe pas déjà un 5 code spécialisé de la fonction f. Il existe également autant de compteurs Cf-Vx,Vy que de couples de valeurs Vx,Vy différents obtenus lors de l'exécution du programme 28 et pour lesquels il n'existe pas déjà de code spécialisé de la fonction f. [0060] On rappelle aussi ici que par hypothèse, dans ce mode de réalisation, les paramètres sont uniquement spécialisés dans leur ordre d'apparition comme 10 argument de la fonction f. Ainsi, la spécialisation du paramètre pf2 sans spécialiser le paramètre pf1 est rendue impossible. Dès lors, il n'est pas nécessaire de collecter des données statistiques sur les valeurs du paramètre pf2 indépendamment des valeurs du paramètre pf1. Les compteurs Cf-pf1,Vy ne sont donc pas utilisés dans ce mode de réalisation. 15 [0061] Les compteurs Cf-Vx,pf2 et Cf-Vx,Vy sont créés et initialisés à zéro lorsque l'étape 56 est exécutée pour la première fois avec les valeurs Vx et Vy des paramètres pf1 et pf2. [0062] Une fois l'étape 56 terminée, le microprocesseur 2 procède à une étape 58 où il utilise le code générique de la fonction pour réaliser cette fonction et non pas un 20 code spécialisé pré-existant enregistré dans la mémoire 22. Dans ce mode de réalisation, il existe deux alternatives pour réaliser l'étape 58. La première alternative consiste à générer à partir du code générique de la fonction, un code spécialisé qui n'a pas été trouvé dans la table 38 lors de l'étape 52, puis à stocker son adresse dans la table 38 et à exécuter ce code spécialisé. La deuxième alternative consiste à 25 interpréter le code générique de la fonction à l'aide de l'interpréteur 30. La première alternative peut s'avérer plus coûteuse que la deuxième alternative. Par la suite, dans ce mode de réalisation, le coût correspond au temps d'exécution. Par exemple, le temps nécessaire pour réaliser la fonction selon la première alternative peut s'avérer plus long que le temps nécessaire pour réaliser la même fonction, mais en mettant en 30 oeuvre la deuxième alternative. En effet, dans le cas de la première alternative, il faut ajouter au temps d'exécution du code spécialisé, le temps nécessaire pour générer ce code spécialisé. Toutefois, même si le temps d'exécution de la première alternative est plus long que celui de la deuxième alternative, il peut être intéressant de quand même mettre en oeuvre cette première alternative si le code spécialisé généré peut 35 être réutilisé plusieurs fois lors d'exécutions ultérieures de cette même fonction. En effet, lors des exécutions ultérieures du code spécialisé, le temps mis pour générer ce code spécialisé n'est plus à prendre en compte puisqu'il est présent dans la mémoire 22. Cela fait donc, généralement, gagner du temps par rapport à l'interprétation du code générique de la fonction. Ici, pour choisir entre la première et la deuxième 3038086 19 alternatives, le gestionnaire 34 est exécuté afin de minimiser autant que possible le coût choisi, c'est-à-dire ici le temps d'exécution du programme 28. [0063] Plus précisément, dans ce mode de réalisation, la première alternative est exécutée dès qu'une condition prédéterminée est vérifiée. La condition est ici le 5 franchissement d'un seuil pré-calculé par la valeur d'un compteur. [0064] Par exemple, chaque compteur incrémenté est comparé à un seuil pré- calculé qui lui est associé. Par la suite, on utilise la même notation pour les seuils pré- calculés que celle définie pour les codes spécialisés, sauf que la lettre « S » est remplacée par la lettre « N ». Ainsi, les seuils associés aux compteurs Cf-Vx,pf2 et 10 Cf-Vx,Vy sont notés, respectivement, Nf-Vx,pf2 et Nf-Vx,Vy. [0065] Ici, cette comparaison est réalisée en commençant d'abord par les compteurs associés au plus grand nombre de paramètres spécialisés et en allant vers les compteurs associés au plus petit nombre de paramètres spécialisés. Ainsi, le microprocesseur 2 compare systématiquement d'abord la valeur du compteur Cf- 15 Vx,Vy au seuil Nf-Vx,Vy, puis la valeur du compteur Cf-Vx,pf2 au seuil Nf-Vx,pf2. Grâce à cela, comme décrit plus loin, cela permet de classer les lignes de la table 38 dans un ordre qui empêche l'apparition de conflits. [0066] Dès que la valeur d'un compteur dépasse le seuil qui lui est associé, le microprocesseur 2 met en oeuvre la première alternative lors d'une opération 60 de 20 génération d'un code spécialisé puis d'exécution de ce code spécialisé. Dans le cas contraire, c'est-à-dire si aucun des compteurs incrémentés n'a dépassé le seuil qui lui est associé, le microprocesseur 2 met en oeuvre, lors d'une opération 62, la deuxième alternative. [0067] Ainsi, lors de l'opération 60, le générateur 32 est exécuté pour générer un 25 code spécialisé avec les valeurs spécifiques des paramètres associés au compteur qui a franchi le seuil qui lui est associé. [0068] Par exemple, si la valeur du compteur Cf-Vx,Vy dépasse le seuil Nf-Vx,Vy, alors le générateur 32 génère le code Sf-Vx,Vy de la fonction f avec les valeurs spécifiques Vx et Vy pour, respectivement, les paramètres pf1 et pf2. Ensuite, seul le 30 compteur Cf-Vx,Vy est supprimé. Dès lors puisque le compteur Cf-Vx,pf2 subsiste, plus tard au cours de l'exécution du programme 28, ce compteur Cf-Vx,pf2 peut dépasser le seuil Nf-Vx,pf2. Si c'est le cas, alors le générateur 32 génère le code spécialisé Sf-Vx,pf2. Par contre, quand le générateur 32 génère le code Sf-Vx,pf2, il supprime à la fois les compteurs Cf-Vx,pf2 et tous les compteurs Cf-Vx,Y, où Y est 35 une valeur spécifique quelconque. En effet, dès que le générateur 32 génère le code spécialisé Sf-Vx,pf2, ensuite il ne doit plus générer un code spécialisé Sf-Vx,Y. Cela est dû au fait que lors de l'étape 52, les lignes de la table 38 sont balayées dans l'ordre en partant de la première ligne vers la dernière ligne. Si le code Sf-Vx,pf2 est généré avant le code Sf-Vx,Vy, l'adresse @f-Vx,pf2 se trouve systématiquement sur 40 une ligne située avant la ligne qui pourrait contenir l'adresse @f-Vx,Vy. Dès lors, 3038086 20 quand la fonction f est appelée avec les valeurs Vx et Vy, c'est l'adresse @f-Vx,pf2 qui est systématiquement trouvée en premier et donc le code spécialisé Sf-Vx,pf2 qui est systématiquement exécuté. Ainsi, même si le code Sf-Vx,Vy avait été généré après le code Sf-Vx,pf2, dans ce mode de réalisation, il ne serait quasiment jamais 5 exécuté. [0069] De plus, cette façon de procéder permet de résoudre simplement le conflit qui pourrait survenir si : - le microprocesseur 2 générait à la fois les codes spécialisés Sf-Vx,pf2 et Sf-Vx,Vy, et 10 - lors de l'étape 52, le microprocesseur 2 balayait systématiquement toutes les lignes de la table 38. Dans ce cas, lorsque la fonction f est appelée avec les valeurs Vx et Vy des paramètres pf1 et pf2, le microprocesseur 2 identifierait dans la table 38 deux codes spécialisés Sf-Vx,pf2 et Sf-Vx,Vy susceptibles d'être exécutés pour réaliser la fonction 15 f. Il faudrait donc en plus implémenter une règle permettant au microprocesseur 2 de choisir automatiquement lequel de ces deux codes spécialisés doit être exécuté. [0070] Après avoir généré le code spécialisé, le microprocesseur 2 l'enregistre dans la mémoire 22. Pour cela, le microprocesseur 2 exécute la routine 42 qui réalise les opérations suivantes : 20 g) La routine 42 examine s'il existe un espace libre de taille suffisante dans la mémoire 22 pour contenir le code spécialisé généré. h) Dans l'affirmative, le microprocesseur 2 enregistre alors le code spécialisé généré dans une plage continue d'adresses à l'intérieur de cet espace libre. i) Ensuite, le microprocesseur 2 met à jour la table 38. Plus précisément, le 25 microprocesseur 2 ajoute une nouvelle ligne contenant l'identifiant du code générique, l'identifiant des paramètres spécialisés pour générer ce code spécialisé, l'adresse où débute la plage continue d'adresses où est enregistré ce code spécialisé dans la mémoire 22, et les valeurs spécifiques des paramètres spécialisés. Cette nouvelle ligne est ajoutée juste après la dernière ligne de la table 38. 30 j) S'il n'existe pas d'espace libre suffisamment grand pour contenir le code spécialisé généré dans la mémoire 22, le microprocesseur 2 commence par supprimer le code spécialisé le plus ancien, c'est-à-dire celui enregistré dans la plage d'adresses qui débute à l'adresse contenue dans la première ligne de la table 38. Cette première ligne de la table 38 est aussi supprimée, de sorte que c'est la seconde ligne de cette 35 table 38 qui devient maintenant la première ligne. Ensuite, il exécute à nouveau les opérations g) à j). [0071] Cette manière de gérer la mémoire 22 permet de minimiser sa taille. De plus, dans ce mode de réalisation, à chaque fois que la table 38 est modifiée, le microprocesseur exécute le générateur 35 pour générer une nouvelle routine 36, 40 écrite dans le langage machine du microprocesseur 2 et l'enregistre à la place de la 3038086 21 précédente routine 36. Cette opération est décrite plus en détail en référence à la figure 5. [0072] A la fin de l'opération 60, le microprocesseur 2 exécute le code spécialisé généré pour réaliser la fonction souhaitée. 5 [0073] Lors de l'opération 62, le microprocesseur 2 exécute l'interpréteur 30 pour interpréter le code générique de la fonction. Dans ce cas, les valeurs de tous les paramètres sont traitées comme des variables et ces valeurs doivent donc être lues en mémoire en dehors de la plage d'adresses où est enregistré le code générique avant d'être traité par l'interpréteur 30. 10 [0074] Une fois que l'opération 60 ou 62 a été exécuté, l'étape 58 est terminée et le microprocesseur retourne à l'étape 50 pour exécuter l'opération suivante du programme 28. [0075] En parallèle des étapes précédemment décrites, lors d'une phase 70, le microprocesseur 2 calcule et met à jour dynamiquement chaque seuil associé à un 15 compteur. Plus précisément, le microprocesseur calcule, lors d'une étape 72, chaque seuil à partir d'un rapport Kgen/[Klib-Kdyn]. Dans ce mode de réalisation, chaque coût Kgen, Klib et Kdyn est obtenu uniquement à partir de données concernant la même fonction paramétrée et les mêmes valeurs spécifiques que celles associées au compteur pour lequel ce seuil est calculé. Dès lors, les coûts Kgen, Klib et Kdyn sont 20 spécifiques à chaque compteur. Dans ce mode de réalisation, pour faire ressortir cette spécificité, les coûts Kgen, Klib et Kdyn sont suivis, entre parenthèse, d'un identifiant du compteur auquel ils sont associés. [0076] Le calcul d'un seuil est maintenant décrit dans le cas particulier du seuil NfVx,Vy associé au compteur Cf-Vx,Vy. L'homme du métier sait adapter cette 25 enseignement au calcul des seuils de tous les autres compteurs précédemment décrits. Ici, le seuil Nf-Vx,Vy est calculé à l'aide de la formule suivante : Nf-Vx,Vy = Kgen(f-Vx,Vy) / [Klib(f-Vx,Vy) - Kdyn(f-Vx,Vy)], où : - Kgen(f-Vx,Vy) est le coût de génération du code spécialisé Sf-Vx,Vy. - Klib(f-Vx,Vy) est le coût de réalisation de la fonction f sans utiliser le code spécialisé, 30 et - Kdyn(f-Vx,Vy)] est le coût de réalisation de la fonction f en exécutant le code spécialisé Sf-Vx,Vy. [0077] Ici, le coût est le temps d'exécution. Ainsi, le coût Kgen(f-Vx,Vy) est égal au temps nécessaire pour que le microprocesseur 2 génère le code spécialisé Sf-Vx,Vy. 35 Le coût Klib(f-Vx,Vy) est égal au temps mis par le microprocesseur 2 pour interpréter le code générique de la fonction f avec les valeurs Vx et Vy pour les paramètres pfl et pf2. Le coût Kdyn(f-Vx,Vy) est le temps mis par le microprocesseur 2 pour exécuter le code spécialisé Sf-Vx,Vy lors de l'étape 54. [0078] L'étape 72 est exécutée une première fois avant la première utilisation, lors 40 de l'étape 58, du seuil Nf-Vx,Vy. Lors de cette première exécution de l'étape 72, les 3038086 22 coûts Kgen(f-Vx,Vy), Klib(f-Vx,Vy) et Kdyn(f-Vx,Vy) sont initialisés à partir de valeurs pré-enregistrées dans la mémoire 20. [0079] Ensuite, lors d'une étape 74, le microprocesseur 2 mesure et met à jour les coûts. Par exemple, à chaque fois que le code spécialisé Sf-Vx,Vy est généré, le 5 microprocesseur 2 acquiert une mesure du temps mis pour générer ce code spécialisé et l'enregistre dans la mémoire 20 à la place de la précédente valeur du coût Kgen(f-Vx,Vy). Ici, par exemple, le microprocesseur 2 mesure le temps mis pour exécuter une tâche en déclenchant une minuterie juste avant de débuter l'exécution de cette tâche. Ensuite, il relève la valeur de cette minuterie juste après la fin de 10 l'exécution de cette tâche. La valeur relevée est considérée comme étant le temps mis pour exécuter cette tâche. [0080] De même, à chaque fois que l'opération 62 est exécutée pour la fonction f avec les valeurs Vx, Vy des paramètres pf1 et pf2, le temps mis pour réaliser l'opération 62 est mesuré puis enregistré dans la mémoire 20 à la place de la 15 précédente valeur du coût Klib(f-Vx,Vy). [0081] Enfin, à chaque fois que le code spécialisé Sf-Vx,Vy est exécuté lors de l'étape 54 ou de l'étape 60, le temps mis pour exécuter cette étape est mesuré puis enregistré dans la mémoire 20 à la place de la précédente valeur du coût Kdyn(f-Vx, Vy). Après chaque mise à jour d'un des coûts Kgen(f-Vx,Vy), Klib(f-Vx,Vy) et Kdyn(f- 20 Vx,Vy), l'étape 72 est de nouveau exécutée. On rappelle ici que lors d'une même exécution du programme 28, le code spécialisé Sf-Vx,Vy peut être généré plusieurs fois car, comme décrit précédemment, le code spécialisé peut être effacé de temps en temps de la mémoire 22 pour libérer de la place pour d'autres codes spécialisés. [0082] On remarque que la formule ci-dessus conduit à une valeur du seuil Nf-Vx,Vy 25 strictement inférieure à un si le cumul du temps de génération du code spécialisé SfVx,Vy et du temps d'exécution de ce code spécialisé est strictement inférieur au temps d'interprétation du code générique de la fonction f avec les valeurs Vx, Vy des paramètres pf1 et pf2. Dans ce cas, le code spécialisé Sf-Vx,Vy est généré dès le premier appel de la fonction f avec les valeurs Vx,Vy. 30 [0083] Dans les autres cas, la valeur du seuil Nf-Vx,Vy sera d'autant plus grande qu'il sera difficile d'amortir la génération du code spécialisé Sf-Vx,Vy. Typiquement, amortir la génération d'un code spécialisé est difficile si l'écart entre le coût d'exécution de l'opération 62 et de l'étape 54 pour la même fonction avec les mêmes valeurs de paramètres est petit, ou si le coût Kgen de génération du code spécialisé 35 est grand. Si le temps d'exécution du code spécialisé Sf-Vx,Vy est plus long que le temps d'interprétation du code générique avec les valeurs Vx, Vy des paramètres, alors la valeur du seuil Nf-Vx,Vy est négative. Dans ce cas, le microprocesseur 2 inhibe systématiquement la génération du code spécialisé Sf-Vx,Vy. [0084] Ce qui a été décrit ci-dessus pour le calcul du seuil Nf-Vx,Vy est appliqué à 40 l'identique pour tous les autres seuils en remplaçant dans les explications ci-dessus 3038086 23 le symbole « f-Vx,Vy » par l'identifiant de la fonction et des valeurs spécifiques des paramètres spécialisés associés à ce compteur. Ainsi, la valeur du seuil Nf-Vx,pf2 est calculée et mise à jour comme décrit ci-dessus mais en utilisant la formule suivante : Nf-Vx,pf2 = Kgen(f-Vx,pf2)/[Klib(f-Vx,pf2) - Kdyn(f-Vx,pf2)] où Kgen(f-Vx,pf2), Klib(f- 5 Vx,pf2) et Kdyn(f-Vx,pf2) sont les mêmes que respectivement les coûts Kgen(fVx,Vy), Klib(f-Vx,Vy) et Kdyn(f-Vx,Vy) mais pour la fonction f avec la valeur Vx pour le paramètre pf1 et une valeur quelconque pour le paramètre pf2. [0085] Le fonctionnement du procédé de la figure 3 est maintenant illustré dans le cas particulier du pseudo-code représenté sur la figure 4. Sur cette figure et sur la 10 figure 5, les numéros à gauche sont les numéros de ligne. On suppose que les seuils Nf-2,pf2 ; Nf-5,pf2 ; Nf-2,10 ; Nf-2,12 ; Nf-5,20 et Nf-5,14 sont tous égaux à deux. Lors du premier appel de la fonction f, à la ligne 3, les compteurs Cf-2,pf2 et Cf-2,10 sont créés puis incrémentés de un. A ce stade, leur valeur est donc égale à un. La fonction f(2, 10) est réalisée en interprétant le code générique de cette fonction. 15 [0086] Lors du deuxième appel à la fonction f, à la ligne 4, les compteurs Cf-5,pf2 et Cf-5,10 sont créés puis incrémentés de un. Ils sont donc maintenant tous les deux égaux à un. Ensuite, la fonction f(5, 10) est réalisée en interprétant le code générique de cette fonction. [0087] Lors de la première itération de la boucle comprise entre les lignes 5 et 8, les 20 compteurs Cf-2,pf2 et Cf-2,12 sont incrémentés de 1 et la fonction f(2, 12) est réalisée en interprétant le code générique de la fonction f. [0088] Lors de la deuxième itération de la boucle comprise entre les lignes 5 à 8, le compteur Cf-2,pf2 est incrémenté et dépasse le seuil Nf-2,pf2. Le code spécialisé Sf2,pf2 est donc généré et les compteurs Cf-2,10, Cf-2,12 et Cf-2,pf2 sont supprimés. 25 La table 38 est mise à jour pour ajouter la ligne qui contient l'adresse @f-2,pf2 où est enregistré le code spécialisé Sf-2,pf2 dans la mémoire 22. Enfin, la fonction f(2, 12) est réalisée en exécutant le code spécialisé Sf-2,pf2. [0089] A partir de la troisième jusqu'à la quinzième itération de la boucle comprise entre les lignes 5 à 8, c'est le code spécialisé Sf-2,pf2 qui est exécuté pour réaliser la 30 fonction f(2, 12). [0090] Lors de la première itération de la boucle comprise entre les lignes 9 à 12, le compteur Cf-5,pf2 est incrémenté et le compteur Cf-5,14 est créé et incrémenté aussi. A ce stade, la valeur du compteur Cf-5,pf2 est égal à deux et la valeur du compteur Cf-5,14 est égale à un. 35 [0091] Lors de la deuxième itération de la boucle comprise entre les lignes 9 à 12, le compteur Cf-5,pf2 dépasse le seuil Nf-5,pf2. Le code spécialisé Sf-5,pf2 est donc généré et les compteurs Cf-5,pf2, Cf-5,20 et Cf-5,14 sont supprimés. La table 38 est mise à jour pour ajouter la ligne qui contient l'adresse @f-5,pf2. Enfin, la fonction f(5,14) est réalisée en exécutant le code spécialisé Sf-5,pf2. A partir de la troisième 3038086 24 jusqu'à la quinzième itération de la boucle comprise entre les lignes 9 à 12, c'est le code spécialisé Sf-5,pf2 qui est exécuté pour réaliser la fonction f(5,14). [0092] La figure 5 représente une partie du code de la routine 36 de recherche généré lors de l'opération 60 du procédé de la figure 3. La routine 36 est générée à 5 partir du contenu mis à jour de la table 38. Dans la figure 5, la routine de recherche 36 s'appelle « Lookup-spec ». Aux lignes 6 et 11, le symbole « » indique simplement qu'une partie du code de la routine 36 n'a pas été représentée. Ces parties non représentées se déduisent sans difficulté des explications qui suivent. [0093] La routine 36 présente deux caractéristiques qui accélèrent son exécution par 10 le microprocesseur 2. Premièrement, le contenu de la table 38 est codé en tant que constante à l'intérieur du code de cette routine 36. Ainsi, lors de l'exécution de la routine 36, il n'est pas nécessaire d'aller lire le contenu de la table 38 à des adresses situées en dehors de la plage continue d'adresses où est enregistré le code de cette routine 36. Deuxièmement, plutôt que de renvoyer l'adresse du code spécialisé 15 recherché ou, si aucun code spécialisé n'a été trouvé une valeur par défaut, la routine 36 comporte des branchements qui déclenchent directement l'exécution du code spécialisé trouvé et, sinon, du code générique. Sur la figure 5, ces branchements sont représentés par l'instruction « branch » suivie soit de l'adresse d'un code spécialisé, soit de l'adresse @f qui déclenche la réalisation de la fonction f à l'aide du code 20 générique. Ainsi, on évite d'avoir à stocker l'adresse du code spécialisé trouvé dans une variable, ce qui accélère l'exécution du programme 28. [0094] Dans le pseudo-code représenté dans la figure 5, le symbole « Id » désigne l'identifiant du code générique de la fonction appelée. Le symbole « Value » désigne une variable qui contient les valeurs des différents paramètres de la fonction appelée 25 obtenues lors de l'étape 50. L'instruction « Compare (If, elem0) » compare l'identifiant de la fonction If à l'identifiant Id et les valeurs des paramètres spécialisés contenus dans la constante elem0 aux valeurs correspondantes contenues dans la variable Value. Dans le cas où il y a une différence entre If, elem0 et Id, Value, l'instruction « Compare » se poursuit par l'exécution de l'instruction qui se trouve deux lignes en 30 dessous. Dans le cas contraire, c'est-à-dire si les éléments If et elem0 sont égaux à, respectivement, l'identifiant Id et l'élément Value, alors l'instruction située à la ligne immédiatement en dessous est exécutée. Dans le cas décrit ici, il s'agit de l'instruction « branch @If-elem0 » qui redirige directement l'exécution du programme 28 vers l'adresse @lf-elem0. Par exemple, pour cela, l'adresse @lf-elem0 est placée 35 dans le compteur ordinal associé à l'unité arithmétique et logique 4. Les instructions « Compare » et « branch » situées aux lignes suivantes fonctionnent comme décrit précédemment sauf qu'elles ne comparent pas les valeurs Id et Value aux mêmes éléments de la table 38 et ne redirigent pas l'exécution du programme 28 vers la même adresse de code spécialisé. 3038086 25 [0095] Si la fonction appelée est la fonction f mais qu'elle est appelée avec des valeurs obtenues pour les paramètres qui ne correspondent à aucun de ceux enregistrés dans la table 38, l'instruction « branch @f » est exécutée. L'exécution de cette instruction redirige l'exécution du programme 28 vers une adresse qui 5 déclenche l'interprétation du code générique de la fonction f. Étant donné que le contenu de la table 38 est codé en tant que constante dans le code de la routine 36, à chaque fois que la table 38 est modifiée, la routine 36 doit de nouveau être générée. Toutefois, étant donné que, dans presque tous les cas, le nombre de fois où la routine 36 est appelée est très supérieur au nombre de fois où la table 38 est modifié, le o temps perdu à générer la routine 36 décrite ci-dessus est compensé par le gain de temps dû au fait qu'elle s'exécute plus rapidement que si elle n'avait pas été spécialisée en fonction du contenu de la table 38. [0096] De nombreux autres modes de réalisation du procédé d'exécution décrit ci-dessus sont possibles. Par exemple, le microprocesseur 2 est programmé pour 15 identifier les paramètres implicites et relever leurs valeurs avant ou au cours de l'exécution de l'opération 62. Ensuite, les paramètres implicites ainsi relevés sont traités comme décrit pour les paramètres explicites. En particulier, les étapes 56 et 74 sont également exécutées pour ces paramètres implicites. De plus le générateur 32 est alors adapté pour traiter un paramètre implicite d'une fonction comme une 20 constante et ainsi générer un code spécialisé qui est optimisé en prenant en compte la valeur spécifique de ce paramètre implicite. [0097] En variante, l'interpréteur 30 peut être omis si le programme 28 à exécuter est directement écrit dans le langage machine du microprocesseur 2 et non pas en Bytecode. Dans cette variante, le programme 28 n'est donc plus un code indépendant 25 des spécificités structurelles de l'unité centrale 1. Dans ce cas, le code générique des fonctions f et g est aussi écrit en langage machine et non pas en Bytecode. Toutefois, ces codes génériques, contrairement aux codes spécialisés, comportent pour chaque paramètre des instructions de lecture de la valeur de ce paramètre en dehors de la plage continue d'adresses où est enregistré le code générique de cette fonction. 30 Dans ce cas, le générateur 32 conserve sa fonction d'optimisation du code générique en fonction de la valeur spécifique affecté au paramètre à spécialiser. Ainsi, tout ce qui a été décrit précédemment pour le générateur 32 dans le cas particulier d'un code générique écrit en Bytecode reste inchangé sauf que le générateur 32 compile le code générique écrit en langage machine en un code spécialisé écrit dans le même 35 langage machine. Dans ce cas, le générateur 32 est connu sous le terme anglais de « dynamic optimizer ». [0098] Dans une autre variante, le programme 28 est écrit dans un langage machine d'un autre microprocesseur différent du microprocesseur 2. Dans ce cas, le générateur 32 n'a pas à compiler le programme 28 mais doit traduire les instructions 40 du programme 28 dans le langage machine du microprocesseur 2. Le générateur 32 3038086 26 est alors connu sous l'acronyme DBT (Dynamic binary translator). Comme précédemment, cette variante n'affecte que la fonction de compilateur du générateur 32 mais ne modifie en rien les fonctions d'optimisation qu'il doit réaliser pour générer le code spécialisé. 5 [0099] Ce qui a été décrit précédemment peut être mis en oeuvre avec tout type de langage de programmation. Par exemple, cela peut être mis en oeuvre avec le langage deGoal. En particulier, lors de l'opération 62, le code générique n'est pas nécessairement interprété. Par exemple, en variante, le code générique est un programme obtenu classiquement par un compilateur statique et se trouve dans la 10 mémoire programme 18 avant le démarrage du programme. [00100] Le code spécialisé n'a pas besoin d'être systématiquement généré à la volée lors de l'exécution du programme 28. En variante, lors de l'écriture du programme 28, le programmeur peut repérer des fonctions à spécialiser dans ce programme puis générer, avant même que l'exécution de ce programme commence, les codes 15 spécialisés correspondants à l'aide, par exemple, du générateur 32. Ensuite, lors de l'installation du programme 28 dans l'unité centrale 1, les codes spécialisés générés en avance sont enregistrés dans la mémoire 18 en même temps que le programme 28. Au début de l'exécution du programme 28, le gestionnaire 34 met à jour la table 38 pour y inclure l'adresse des codes spécialisés pré-enregistrés dans la mémoire 18. 20 Ainsi, dès que la fonction est appelée avec une valeur spécifique correspondant à celle utilisée pour générer l'un des codes spécialisés de cette fonction, le générateur 34 déclenche directement l'exécution du code spécialisé pré-enregistré sans qu'il soit nécessaire de faire appel, au moins lors de la première exécution, au générateur 32. [00101] La mémoire 22 n'est pas nécessairement une mémoire volatile. En variante, 25 elle est remplacée par une mémoire non volatile telle qu'une mémoire connue sous l'acronyme NVRAM (Non Volatile Random Access Memory). [00102] L'identifiant d'une fonction dans la table 38 peut aussi être le nom de cette fonction. Dans une autre variante, l'identifiant de la fonction est obtenu en appliquant une fonction de hachage sur le code générique de cette fonction. Par contre, cet 30 identifiant reste le même quelles que soient les valeurs obtenues pour les paramètres de cette fonction. [00103] Si le gestionnaire 34 est programmé pour déclencher la spécialisation d'une seule fonction du programme 28, l'identifiant du code générique dans la table 38 peut être omis et la première colonne supprimée. Par exemple, le gestionnaire est 35 programmé pour autoriser uniquement la spécialisation de la fonction f. [00104] Si le gestionnaire 34 spécialise toujours les n premiers paramètres des fonctions paramétrées, où n est un entier constant supérieur ou égal à un, alors la seconde colonne comportant l'identifiant des paramètres spécialisés de la fonction peut être omise. Ce mode de réalisation simplifie aussi la routine 40 puisqu'il y a alors 40 moins de compteurs à gérer. 3038086 27 [00105] Dans une autre variante, le gestionnaire 34 peut spécialiser n'importe quel paramètre d'une fonction et pas nécessairement dans l'ordre des arguments de cette fonction. Ainsi, par exemple, le générateur 32 peut générer à la fois les codes spécialisés Sf-0,pf2 et Sf-pf1,0. L'identifiant des paramètres spécialisés décrits en 5 référence à la figure 2 ne permet pas de distinguer ces deux codes spécialisés. Ainsi, dans ce cas, par exemple, l'identifiant des paramètres spécialisés est remplacé par un autre identifiant de paramètres spécialisés comportant un masque de 3 bits ou plus. Dans ce masque la position du bit identifie le paramètre de la fonction et la valeur « 1 » du bit indique que ce paramètre a été spécialisé tandis que la valeur 10 « 0 » de ce bit indique au contraire que ce paramètre n'a pas été spécialisé. Ainsi, l'identifiant des paramètres spécialisés des codes Sf-0,pf2 et Sf-pf1,0 sont respectivement [1;0] et [0 ;1]. Dans ce cas, la routine 40 doit aussi être modifiée pour collecter les données statistiques sur les valeurs de chacun de ces paramètres. Par exemple, dans le cas de la fonction f, lors de l'étape 56, un compteur supplémentaire 15 Cf-pf1,Vy est utilisé. Ce compteur Cf-pf1,Vy est uniquement associé à la fonction f et également uniquement associé à la valeur Vy du paramètre pf2. Il est incrémenté à chaque fois que le paramètre pf2 prend la valeur Vy. Si la valeur de ce compteur Cfpf1,Vy dépasse un seuil Nf-pf1,Vy, alors un code spécialisé Sf-pf1,Vy est généré en spécialisant seulement le paramètre pf2 avec la valeur Vy. 20 [00106] Une autre solution consiste à introduire dans la table 38 une colonne par paramètre et à enregistrer la valeur du paramètre utilisé pour générer le code spécialisé d'une fonction dans la seule colonne qui lui est associée. Dans ce cas, l'absence de valeur dans l'une de ces colonnes indique que le paramètre associé à cette colonne n'a pas été spécialisé. 25 [00107] D'autres modes de réalisation de la routine 36 de recherche sont possibles. Par exemple, dans le cas où un code spécialisé est trouvé, la routine 36 renvoie l'adresse de ce code spécialisé plutôt que de rediriger l'exécution du programme directement vers ce code spécialisé. Ensuite, l'adresse renvoyée par la routine 36 est utilisée pour exécuter un branchement vers cette adresse. Si aucun code spécialisé 30 correspondant n'est trouvé dans la table 38, la routine 36 renvoie une valeur par défaut qui indique l'absence de code spécialisé dans la table 38 correspondant à la fonction recherchée. On notera cependant que cette variante suppose l'utilisation d'une variable supplémentaire pour stocker l'adresse, ou la valeur par défaut, renvoyée par la routine 36. Cette variante fonctionne correctement mais s'exécute 35 donc moins rapidement que le mode de réalisation principal précédemment décrit. [00108] Dans un autre mode de réalisation, la routine 36 n'est pas spécialisée en fonction du contenu de la table 38. Ainsi, le générateur 35 peut être omis. En effet, dans ce cas, il n'est pas nécessaire de générer une nouvelle routine 36 en langage machine à chaque fois que le contenu de la table 38 est modifié. 3038086 28 [00109] En variante, la routine 36 est modifiée pour parcourir systématiquement toutes les lignes de la table 38 et sélectionner une ou plusieurs lignes contenant des adresses de codes spécialisés capables de réaliser la fonction appelée lorsqu'ils sont exécutés. Dans ce cas, la routine 36 implémente également une règle de choix 5 automatique du code spécialisé à exécuter parmi les différents codes spécialisés sélectionnés. Par exemple, la routine 36 est programmée pour sélectionner systématiquement l'adresse du code spécifique qui comporte le plus grand nombre de paramètres spécialisés. Dans cette variante, même si le code spécifique Sf-Vx,pf2 a été généré en premier, les compteurs Cf-Vx,Vy ne sont pas supprimés lors de 10 l'étape 56 et l'étape 56 est systématiquement exécutée après l'étape 52 pour continuer à mettre à jour ces compteurs. Ainsi, même si le code spécialisé Sf-Vx,pf2 est généré en premier, il reste possible de générer ultérieurement d'autres codes spécialisés pour la même fonction f tels que le code Sf-Vx,Vy par exemple. [00110] La routine 36 de recherche peut également être générée, en langage 15 machine, par un autre microprocesseur puis, par exemple, être enregistrée dans la mémoire 22 avant le début de l'exécution du programme 28. [00111] D'autres coûts d'exécution peuvent être pris en compte pour décider de déclencher la génération d'un code spécialisé. Par exemple, le coût pris en compte peut être la quantité d'une des grandeurs physiques suivantes ou d'une combinaison 20 de ces grandeurs physiques : la consommation électrique, la puissance électrique consommée, le temps d'exécution, la température, le niveau de bruit électrique ou acoustique. Une combinaison souvent utilisée de ces grandeurs physiques est connue sous l'acronyme EDP (« energy-delay product »). L'EDP est égal au produit du temps d'exécution par l'énergie consommée. 25 [00112] De préférence, quelle que soit la grandeur physique choisie, le microprocesseur est équipé d'un capteur qui permet de mesurer la quantité de cette grandeur physique en temps réel. C'est alors ces quantités mesurées par ces capteurs qui sont utilisées pour actualiser les coûts Kgen, Klib et Kdyn. [00113] La phase 70 peut être mise en oeuvre indépendamment de la méthode 30 décrite pour sélectionner le code spécialisé à exécuter et, en particulier, de la structure de la table 38. Par exemple, la phase 70 peut avantageusement être implantée dans un procédé comme celui décrit dans la demande US 2010/0095284. [00114] De nombreuses autres méthodes sont possibles pour mesurer le temps de génération du code spécialisé et d'exécution de ce code spécialisé. Par exemple, 35 toutes les méthodes décrites au chapitre 3.1 de l'article suivant sont utilisables : - M. Arnold et Al, « Adaptive optimization in the jalapefio JVM », ACM SIGPLAN Notices, vol. 46, n°4, pp 65-83, 2011. [00115] Une autre méthode possible est décrite dans l'article suivant : 3038086 29 - D. Buytaert et Al, « Using HPM-Sampling to drive dynamic compilation », Proceeding of the conference on object-oriented programming systems, languages and applications, OOPSLA, pp 553-567, 2007. [00116] Enfin, une autre méthode pour mesurer le temps de génération du code 5 spécialisé et de réalisation de la fonction à partir du code générique peut être trouvée dans l'article suivant : - S-W. Lee et Al, « Enhanced hot spot detection heuristics for embedded java just-intime compilers », Proceedings of the ACM SIGPLAN Conference on languages, compilers and tools for embedded systems (LCTES), pp 13-22, 2008. 10 [00117] Les seuils précédemment décrits peuvent également être calculés différemment. Par exemple, le seuil Nf-Vx,Vy est calculé à l'aide de la formule suivante : Nf-Vx,Vy = v(Kgen(f-Vx,Vy)/[Klib(f-Vx,Vy-Kdyn(fVx,Vy)], où v(...) est une fonction continûment croissante comme par exemple une fonction exponentielle ou logarithmique ou un simple produit par une constante numérique. 15 [00118] Dans un autre mode de réalisation, tous les compteurs associés à une même fonction f sont également associés au même seuil, noté Nf. Ainsi, quelle que soit la valeur des paramètres spécialisés de la fonction f, le seuil Nf utilisé est le même. Par contre, les compteurs associés aux différentes fonctions n'ont généralement pas les mêmes seuils. Ainsi, généralement, le seuil Nf est différent du seuil Ng associé à la 20 fonction g. Dans ce mode de réalisation, le seuil est donc commun à tous les compteurs qui sont associés à la même fonction mais indépendant des valeurs spécifiques des paramètres de cette fonction. [00119] De préférence, le seuil Nf est calculé à l'aide de la formule Nf = Kgen(f)/ [Klib(f) - Kdyn(f)], où Kgen(f), Klib(f) et Kdyn(f) sont les mêmes coûts que, 25 respectivement, les coûts Kgen(f-Vx,Vy), Klib(f-Vx,Vy) et Kdyn(f-Vx,Vy) mais calculés indépendamment des valeurs des paramètres pf1 et pf2. Par exemple, Kgen(f), Klib(f) et Kdyn(f) sont mesurés à chaque fois que, respectivement : - un code spécialisé de la fonction f est généré, - le code générique de la fonction f est utilisé pour réaliser cette fonction, 30 - un code spécialisé de la fonction f est exécuté. [00120] Dans un autre mode de réalisation, les coûts ne sont pas mis à jour dynamiquement ni mesuré. Dans ce cas, l'étape 72 est exécutée une seule fois par le microprocesseur 2 pour initialiser les valeurs des différents seuils utilisés. [00121] La phase 70 peut aussi être omise. Par exemple, les différents seuils 35 associés aux différents compteurs sont des constantes pré-enregistrées à l'avance dans la mémoire 20. [00122] Dans un autre mode de réalisation, à chaque fois qu'une fonction paramétrée est appelée, un code spécialisé correspondant est généré puis exécuté. Dans ce mode de réalisation, la décision de générer un code spécialisé est systématiquement 40 prise. Le procédé de la figure 3 peut alors être simplifié, en particulier, la phase 70 et 3038086 30 l'opération 62 sont omises et l'opération 60 est simplifiée. La routine 40 de collecte de données statistiques peut être omise dans ce cas. [00123] D'autres méthodes que celles précédemment décrites peuvent être utilisées pour décider s'il faut déclencher ou non la génération d'un code spécialisé. Par 5 exemple, en variante, les méthodes décrites dans les articles suivants sont utilisables: - E. Duesterwald et Al, « Software profiling for hot path prediction : Less is more », International Conference on Architectural Support for Programming Languages and Operating Systems, ASPLOS, pp 202-211, 2000, 10 - D. Buytaert et Al, « Using HPM-sampling to drive dynamic compilation », Proceeding of the conference on Object-Oriented Programming Systems, Languages and Applications, OOPSLA, pp 553-567, 2007, - M. Arnold et Al. « Adaptive optimisation in the jalapefio JVM », ACM SIGPLAN Notices, vol. 46, n°4, pp 65-83, 2011. REVENDICATIONS1. Procédé d'exécution d'un programme d'ordinateur comportant au moins une fonction paramétrée susceptible d'être exécutée une ou plusieurs fois au cours de l'exécution du programme, cette fonction comportant au moins un paramètre dont la valeur est obtenue au moment où la fonction est appelée pour être exécutée par un microprocesseur ou durant son exécution par le microprocesseur, ce procédé comportant : a) la fourniture d'un code générique de la fonction dans lequel chaque paramètre de 10 la fonction est codé comme une variable de sorte que ce code générique ne contient pas en lui-même la valeur de ce paramètre mais contient une opération de lecture de sa valeur à une adresse spécifiée par le code générique, b) l'enregistrement (60) dans une mémoire de plusieurs codes spécialisés de cette fonction, écrits dans le langage machine du microprocesseur, chaque code spécialisé 15 réalisant, lorsqu'il est exécuté par le microprocesseur, la même fonction que le code générique mais dans le cas particulier où au moins un paramètre de la fonction est spécialisé, la spécialisation d'un paramètre de la fonction consistant à affecter une valeur spécifique à ce paramètre puis à traiter ce paramètre non plus comme une variable mais comme une constante de sorte que le code spécialisé ne comporte 20 aucune opération de lecture de sa valeur à une adresse située en dehors de la plage continue d'adresses où est enregistré ce code spécialisé, les codes spécialisés enregistrés différant les uns des autres par la valeur affectée au même paramètre spécialisé ou par le paramètre qui a été spécialisé, c) pour chaque code spécialisé, la mémorisation (60), dans une table, d'une adresse 25 où est enregistré ce code spécialisé dans la mémoire, d) lors de l'exécution du programme, le microprocesseur obtient (50) une valeur numérique pour chaque paramètre de la fonction, puis e) le microprocesseur recherche (52), dans la table, l'adresse d'un code spécialisé apte, lorsqu'il est exécuté par le microprocesseur, à réaliser la fonction paramétrée 30 avec les valeurs obtenues lors de l'étape d), puis f) si une telle adresse existe dans la table, le microprocesseur réalise la fonction en exécutant directement (54) le code spécialisé enregistré dans la mémoire à cette adresse sans utiliser le code générique, et sinon g) le microprocesseur réalise (58) cette fonction en utilisant son code générique, 35 caractérisé en ce que - l'étape c) comporte également la mémorisation (60), associée à chaque adresse d'un code spécialisé, de la valeur de chacun de ses paramètres spécialisés, et - l'étape e) comporte pour une adresse enregistrée dans la table: 3038086 32 el ) la comparaison (52) de la valeur de chaque paramètre spécialisé, associé dans la table à cette adresse, à la valeur du même paramètre obtenue lors de l'étape d) puis, e2) si lors de l'opération el ), pour chaque paramètre spécialisé sa valeur mémorisée dans la table correspond à la valeur de ce paramètre obtenue lors de l'étape d), alors 5 le microprocesseur sélectionne (52) cette adresse en tant qu'adresse du code spécialisé apte à réaliser la fonction paramétrée avec les valeurs obtenues lors de l'étape d) et, sinon, le microprocesseur sélectionne une adresse suivante dans la table pour laquelle les opérations el ) et e2) n'ont pas encore été réalisées puis réitère les opérations el ) et e2) pour cette adresse suivante. 2. Procédé selon la revendication 1, dans lequel : - à chaque fois que l'adresse d'un code spécialisé doit être modifiée, supprimée ou ajoutée dans la table, le microprocesseur génère (60) et enregistre dans la mémoire une routine de recherche écrite dans le langage machine du microprocesseur, cette routine de recherche étant apte, lorsqu'elle est exécutée par le microprocesseur, à réaliser les opérations el ) et e2), cette routine de recherche contenant, codé en tant que constante, chaque adresse et chaque valeur de paramètres spécialisés mémorisés dans la table de sorte que la routine de recherche ne comporte aucune opération de lecture de la valeur d'un paramètre spécialisé ou de l'adresse d'un code spécialisé en dehors de la plage continue d'adresses où est enregistrée cette routine de recherche, et - à chaque fois que l'étape e) est exécutée, le microprocesseur exécute directement cette routine de recherche enregistrée dans sa mémoire. 3. Procédé selon la revendication 2, dans lequel : - la génération (60) de la routine de recherche comporte pour chaque adresse d'un code spécialisé contenue dans la table, la génération d'un jeu d'instructions qui code un branchement conditionnel direct vers cette adresse du code spécialisé, et - lorsque ce branchement conditionnel est exécuté par le microprocesseur, seulement si la valeur de chaque paramètre spécialisé associé dans la table à cette adresse est égale à la valeur du même paramètre obtenue lors de l'étape d), alors le microprocesseur remplace la valeur actuelle d'un compteur ordinal du microprocesseur par cette adresse de sorte que la prochaine instruction exécutée par le microprocesseur est directement la première instruction de ce code spécialisé. 4. Procédé selon l'une quelconque des revendications précédentes, dans lequel : - le procédé comporte l'exécution (56) d'une routine de collecte de données statistiques qui incrémente un compteur, associé à un paramètre de la fonction 3038086 33 paramétrée et à une valeur prédéterminée de ce paramètre, à chaque fois qu'une valeur de ce paramètre de la fonction paramétrée obtenue lors de l'étape d) est égale à cette valeur prédéterminée et, en alternance, l'absence d'incrémentation de ce compteur si la valeur obtenue lors de l'étape d) pour ce paramètre est différente de 5 cette valeur prédéterminée, - en réponse au franchissement d'un seuil pré-calculé par ce compteur, la génération (60), lors d'une étape h), d'un nouveau code spécialisé de la fonction paramétrée en spécialisant le paramètre associé à ce compteur avec la valeur prédéterminée associée à ce compteur, puis l'enregistrement de ce nouveau code spécialisé dans la 10 mémoire et la mise à jour de la table pour y incorporer l'adresse où est enregistré ce nouveau code spécialisé et la valeur du paramètre spécialisé. 5. Procédé selon la revendication 4, dans lequel le procédé comporte le calcul du seuil pré-calculé à partir d'un rapport Kgen/[Klib-Kdyn], où : 15 - Kgen est un coût pour exécuter l'étape h), - Kdyn est un coût pour exécuter l'étape f), - Klib est un coût pour exécuter l'étape g), et les coûts Kgen, Kdyn et Klib sont chacun des quantités respectives d'une même grandeur physique ou d'une même combinaison de grandeurs physiques qui varie 20 selon que le microprocesseur exécute l'étape f) ou l'étape g). 6. Procédé selon la revendication 4 ou 5, dans lequel, lorsque la mémoire est pleine, à chaque fois qu'un nouveau code spécialisé doit être enregistré dans la mémoire, le microprocesseur enregistre ce nouveau code spécialisé à la place du 25 code spécialisé le plus ancien contenu dans cette mémoire. 7. Procédé selon les revendications 3 et 4 prises ensemble, dans lequel seulement si aucun des branchements conditionnels directs de la routine de recherche n'a déclenché l'exécution d'un code spécialisé, alors la routine de collecte de données 30 statistiques est exécutée. 8. Procédé selon l'une quelconque des revendications précédentes, dans lequel : - les étapes a) à g) sont exécutées, en alternance, pour, respectivement, une première puis une seconde fonctions paramétrées dont les codes génériques sont 35 différents, et - l'étape c) comporte en plus la mémorisation (60) dans la table d'un identifiant du code générique de la fonction qui a été spécialisée associé à l'adresse de ce code spécialisé, 3038086 34 - lors de l'étape d), le microprocesseur obtient aussi l'identifiant du code générique de la fonction à exécuter, - lors de l'opération el ), le microprocesseur compare l'identifiant, associé dans la table à l'adresse du code spécialisé, à l'identifiant obtenu lors de l'étape d), et 5 - lors de l'opération e2), seulement si lors de l'opération el ), l'identifiant associé à l'adresse du code spécialisé correspond à l'identifiant obtenu lors de l'étape d) et seulement si la valeur de chaque paramètre spécialisé associé dans la table à cette adresse de code spécialisé correspond à la valeur obtenue lors de l'étape d), alors le microprocesseur sélectionne cette adresse en tant qu'adresse du code spécialisé 10 apte à réaliser la fonction paramétrée avec les valeurs obtenues lors de l'étape d). 9. Procédé selon l'une quelconque des revendications précédentes, dans lequel : - les étapes a) à g) sont exécutées pour une fonction paramétrée comportant au moins un premier et un second paramètres dont les valeurs sont obtenues au 15 moment où cette fonction est appelée pour être exécutée par le microprocesseur ou durant son exécution par le microprocesseur, - l'étape b) comporte : - l'enregistrement d'un premier code spécialisé obtenu en spécialisant le premier paramètre de la fonction avec une première valeur spécifique, et 20 - l'enregistrement d'un second code spécialisé obtenu en spécialisant le second paramètre de la fonction avec une seconde valeur spécifique, - l'étape c) comporte en plus la mémorisation dans la table, associée à chaque adresse d'un code spécialisé de cette table, d'un identifiant du ou des paramètres spécialisés pour obtenir le code spécialisé enregistré à cette adresse, 25 - lors de l'opération el ), le microprocesseur identifie le ou les paramètres de la fonction qui ont été spécialisés pour générer le code spécialisé enregistré à cette adresse à l'aide de l'identifiant du ou des paramètres spécialisés associés, dans la table, à cette adresse, puis le microprocesseur compare seulement les valeurs, obtenues lors de l'étape d), des paramètres de la fonction ainsi identifiés aux valeurs 30 de ces mêmes paramètres associés dans la table à cette adresse. 10. Support d'enregistrement d'informations ou programme d'ordinateur, caractérisé en ce qu'il comporte des instructions pour l'exécution d'un procédé conforme à l'une quelconque des revendications précédentes, lorsque ces instructions sont exécutées 35 par un microprocesseur. 11. Unité centrale électronique pour exécuter un programme d'ordinateur comportant au moins une fonction paramétrée susceptible d'être exécutée une ou plusieurs fois 3038086 35 au cours de l'exécution du programme, cette fonction comportant au moins un paramètre dont la valeur est obtenue au moment où la fonction est appelée pour être exécutée par un microprocesseur ou durant son exécution par le microprocesseur, cette unité centrale comportant : 5 - une mémoire ou un ensemble de mémoires (18, 20, 22) contenant : - un code générique de la fonction dans lequel chaque paramètre de la fonction est codé comme une variable de sorte que ce code générique ne contient pas en lui-même la valeur de ce paramètre mais contient une opération de lecture de sa valeur à une adresse spécifiée par le code générique, 10 - plusieurs codes spécialisés de cette fonction, écrits dans le langage machine du microprocesseur, chaque code spécialisé réalisant, lorsqu'il est exécuté par le microprocesseur, la même fonction que le code générique mais dans le cas particulier où au moins un paramètre de la fonction est spécialisé, la spécialisation d'un paramètre de la fonction consistant à affecter une valeur 15 spécifique à ce paramètre puis à traiter ce paramètre non plus comme une variable mais comme une constante de sorte que le code spécialisé ne comporte aucune opération de lecture de sa valeur à une adresse située en dehors de la plage continue d'adresses où est enregistré ce code spécialisé, les codes spécialisés enregistrés différant les uns des autres par la valeur 20 affectée au même paramètre spécialisé ou par le paramètre qui a été spécialisé, - un microprocesseur (2) programmé pour exécuter les étapes suivantes : c) pour chaque code spécialisé, la mémorisation, dans une table, d'une adresse où est enregistré ce code spécialisé dans la mémoire, 25 d) lors de l'exécution du programme, le microprocesseur obtient une valeur numérique pour chaque paramètre de la fonction, puis e) le microprocesseur recherche, dans la table, l'adresse d'un code spécialisé apte, lorsqu'il est exécuté par le microprocesseur, à réaliser la fonction paramétrée avec les valeurs obtenues lors de l'étape d), puis 30 f) si une telle adresse existe dans la table, le microprocesseur réalise la fonction en exécutant directement le code spécialisé enregistré dans la mémoire à cette adresse sans utiliser le code générique, et sinon g) le microprocesseur réalise cette fonction en utilisant son code générique, caractérisé en ce que le microprocesseur (2) est également programmé de manière à 35 ce que : - l'étape c) comporte également la mémorisation, associée à chaque adresse d'un code spécialisé, de la valeur de chacun de ses paramètres spécialisés, et - l'étape e) comporte pour une adresse enregistrée dans la table: 3038086 36 el) la comparaison de la valeur de chaque paramètre spécialisé, associé dans la table à cette adresse, à la valeur du même paramètre obtenue lors de l'étape d), puis e2) si lors de l'opération el ), pour chaque paramètre spécialisé sa valeur mémorisée dans la table correspond à la valeur de ce paramètre obtenue lors de l'étape d), alors 5 le microprocesseur sélectionne cette adresse en tant qu'adresse du code spécialisé apte à réaliser la fonction paramétrée avec les valeurs obtenues lors de l'étape d) et, sinon, le microprocesseur sélectionne une adresse suivante dans la table pour laquelle les opérations el ) et e2) n'ont pas encore été réalisées puis réitère les opérations el ) et e2) pour cette adresse suivante.