Vous venez de télécharger une mise à jour riche en fonctionnalités pour votre application open source préférée. Tout fonctionne parfaitement sur vos appareils habituels. Il est temps de la déployer sur les autres.
Mais votre nouvel ordinateur portable sous Linux n'accepte pas le package d'installation Windows. Et votre tablette Android ? Votre iPhone ? Votre PS4 ? Pourquoi ne peut-on pas simplement utiliser un logiciel partout ? Explorons les obstacles au rêve d'un « acheter une fois, exécuter partout ».
Pour comprendre pourquoi les logiciels ne fonctionnent pas sur tous les OS, il faut se pencher sur leur création (promis, c'est simple).
Dans un flux de développement basique pour ordinateurs de bureau, serveurs ou mobiles (hors web), un programmeur :
La compilation, qui transforme le code en langage machine, est clé. Sans entrer dans les détails techniques, voici un aperçu essentiel.
Un OS n'est pas une entité unique, mais un empilement de couches logicielles.
Le noyau gère la communication avec le matériel. Les logiciels lui transmettent des commandes via des appels système, qui exécutent des tâches comme lire un fichier ou afficher une fenêtre. Il orchestre les flux entre matériel, données et applications.
Chaque noyau implémente différemment ses appels système (noms, paramètres). Un logiciel doit donc s'adapter à chaque OS cible. L'appel pour envoyer des données au GPU sous Linux diffère sous Windows, ou peut même absenter.
Souvent, les logiciels n'appellent pas directement le noyau, mais des bibliothèques système : collections de fonctions réutilisables. Exemples : GLibC sous Linux, DLL Win32 sous Windows, ou /System/Library sous macOS.
Ces bibliothèques traduisent les appels de fonction des apps vers le noyau. Écrites pour un noyau spécifique, elles ne sont pas interopérables entre OS.
Autre frein : les formats de fichiers exécutables. Chaque OS exige un format binaire précis, comme ELF pour Linux/FreeBSD.
L'interface binaire d'application (ABI) est cruciale : elle définit la communication compilée entre logiciels, processeur, noyau et bibliothèques. Similaire à une API (source), mais pour le binaire exécuté. Chaque OS a son ABI, parfois multiple (ex. : FreeBSD supporte les binaires Linux via module noyau, plus efficace que la virtualisation).
Certains logiciels s'exécutent partout... grâce à l'interprétation. Vous téléchargez du code source, exécuté en temps réel par un interpréteur.
Java promettait « Write Once, Run Anywhere ». Le code Java s'exécute dans une Java Virtual Machine (JVM) du JRE, qui traduit en instructions natives.
Le code compile en bytecode intermédiaire, finalisé par la JVM à l'exécution.
Python traduit le code en instructions OS via son interpréteur, compilant en bytecode à la volée pour les imports. Idéal pour le développement interactif.
Les développeurs testent en direct, plus fluide que le cycle traditionnel.
L'industrie n'a pas de format universel. Les normes risquent le « plus petit dénominateur commun ».
Que pensez-vous ? Préférez-vous une compatibilité universelle au prix de fonctionnalités réduites, ou restez-vous fidèle à votre OS ? Dites-le en commentaires !
Crédits images : Masterchief_Productions/Shutterstock