On nous dit souvent que le matériel ne tient pas compte de la langue dans laquelle un programme est écrit, car il ne voit que le code binaire compilé, mais ce n'est pas toute la vérité. Par exemple, considérons l'humble Z80; ses extensions du jeu d'instructions 8080 incluent des instructions telles que CPIR, ce qui est utile pour balayer des chaînes de style C (terminées par NULL), par exemple pour les effectuer strlen()
. Les concepteurs doivent avoir identifié le fait que l'exécution de programmes en C (par opposition à Pascal, où la longueur d'une chaîne de caractères est dans l'en-tête) était susceptible de servir à leur conception. Un autre exemple classique est la machine Lisp .
Quels autres exemples y a-t-il? Par exemple, les instructions, le nombre et le type de registres , les modes d'adressage, qui permettent à un processeur particulier de préférer les conventions d'un langage particulier? Je suis particulièrement intéressé par les révisions de la même famille.
sizeof(int)
égal à 1 doit obliger ce type à char
être signé (car il int
doit pouvoir contenir toutes les valeurs de type char
). J'ai écrit du code pour une machine où char
et int
sont tous deux des entiers signés 16 bits; Les plus grandes difficultés sont qu’il est impossible d’utiliser des unions pour la conversion de types et que, pour stocker efficacement un grand nombre d’octets, il est nécessaire d’emballer et de décompresser manuellement. Ces problèmes sont mineurs comparés à la possibilité en C que sizeof (int) == sizeof (long), depuis ...
unsigned int
valeurs. C99 a amélioré cette situation, mais avant C99, il n'existait aucune méthode sécurisée en une étape pour comparer une valeur potentiellement négative à une valeur de type unsigned int
(il faudrait vérifier si le nombre était négatif avant de faire la comparaison).