Dans l'ensemble, je dois dire qu'il n'y a aucune garantie que la même source produira le même bytecode lorsqu'elle sera compilée par le même compilateur mais sur une plate-forme différente.
J'examinerais des scénarios impliquant différentes langues (pages de codes), par exemple Windows avec le support de la langue japonaise. Pensez aux caractères multi-octets; sauf si le compilateur suppose toujours qu'il doit prendre en charge tous les langages qu'il peut optimiser pour l'ASCII 8 bits.
Dans le cadre de la compatibilité binaire Release-to-Release dans SOM (Forman, Conner, Danforth et Raper, Proceedings of OOPSLA '95), les binaires du langage de programmation Java sont compatibles binaires sous toutes les transformations pertinentes identifiées par les auteurs (avec quelques mises en garde avec par rapport à l'ajout de variables d'instance). En utilisant leur schéma, voici une liste de quelques modifications importantes compatibles binaires prises en charge par le langage de programmation Java:
• Réimplémentation des méthodes, constructeurs et initialiseurs existants pour améliorer les performances.
• Modification des méthodes ou des constructeurs pour renvoyer des valeurs sur les entrées pour lesquelles ils levaient auparavant des exceptions qui normalement ne devraient pas se produire ou échouaient en entrant dans une boucle infinie ou en provoquant un blocage.
• Ajout de nouveaux champs, méthodes ou constructeurs à une classe ou une interface existante.
• Suppression des champs privés, des méthodes ou des constructeurs d'une classe.
• Lorsqu'un package entier est mis à jour, suppression des champs d'accès par défaut (package uniquement), des méthodes ou des constructeurs de classes et d'interfaces dans le package.
• Réorganiser les champs, méthodes ou constructeurs dans une déclaration de type existante.
• Déplacement d'une méthode vers le haut dans la hiérarchie des classes.
• Réorganiser la liste des super-interfaces directes d'une classe ou d'une interface.
• Insertion de nouveaux types de classe ou d'interface dans la hiérarchie des types.
Ce chapitre spécifie les normes minimales de compatibilité binaire garanties par toutes les implémentations. Le langage de programmation Java garantit la compatibilité lorsque des binaires de classes et d'interfaces sont mélangés qui ne sont pas connus pour provenir de sources compatibles, mais dont les sources ont été modifiées de la manière compatible décrite ici. Notez que nous discutons de la compatibilité entre les versions d'une application. Une discussion sur la compatibilité entre les versions de la plate-forme Java SE dépasse le cadre de ce chapitre.