# Portabilité (informatique)

La portabilité d'un programme informatique est sa capacité à pouvoir être adapté plus ou moins facilement en vue de fonctionner dans différents environnements d'exécution. Les différences peuvent porter sur l'environnement matériel (processeur) comme sur l'environnement logiciel (système d'exploitation). La différence d'environnement peut également porter sur une combinaison des deux éléments. C'est le cas par exemple dans les domaines de l'informatique embarquée, des super calculateurs et des machines virtuelles.
L'action de modifier un programme pour qu'il puisse s'exécuter sur un autre environnement est le portage.

## Environnement d'exécution

La notion d'environnement d'exécution désigne l'ensemble (physique ou logiciel) qui exécutera les instructions du programme. Cet environnement a différents aspects suivant le langage de programmation utilisé et le type de programme.
Ainsi, l'environnement d'exécution est :
* le système d'exploitation pour les langages compilés ;
* l'interpréteur pour les langages interprétés ;
* la machine virtuelle pour des langages qui peuvent être pseudo-compilés comme le Java et le C# ;
* le navigateur web pour les applications web ;
* l'architecture matérielle pour les systèmes d'exploitation.

## Plus petit dénominateur commun

Le niveau de portabilité d'un programme se mesure au fait qu'il utilise le plus petit dénominateur commun à plusieurs environnements. Ainsi, si une bibliothèque logicielle est disponible sur plusieurs environnements et que ce programme ne fait qu'utiliser cette dernière et non certaines fonctions spécifiques à un environnement particulier, on dit que ce programme est portable partout où cette bibliothèque est disponible.
Les bibliothèques logicielles les plus courantes sont celles livrées avec les langages de programmation, que l'on appelle bibliothèques standards. C'est ainsi que si un programme utilise le langage C et uniquement sa bibliothèque standard, il pourra être porté sans difficulté, simplement en le recompilant pour tous les environnements disposant d'un compilateur C (ce qui est le cas sur la quasi-totalité des systèmes d'exploitation existants).

### POSIX

La portabilité d'un programme est une bonne chose de par le fait qu'elle permet à ce dernier de toucher une audience plus large. L'inconvénient est qu'il faut se limiter à des bibliothèques communes, qui sont bien souvent pauvres comparées à ce qui est fourni par un environnement d'exécution particulier. Ainsi, les bibliothèques standards du C et du C++ ne connaissent pas le réseau, les processus légers ou encore les interfaces graphiques.
C'est en partie pour cela qu'a été créée la norme POSIX, qui définit plusieurs fonctionnalités que doit fournir un système UNIX, comme ses commandes de base et son interface de programmation. POSIX permet de faire des choses bien plus évoluées qu'en utilisant simplement les bibliothèques standard du C et C++. Ainsi, POSIX connaît le réseau, les processus légers et a des fonctionnalités de système temps réel.

### Qt, GTK+, wxWidgets, etc.

Bien que POSIX offre des fonctionnalités évoluées, il en manque toujours une qui est largement utilisée de nos jours, l'interface graphique. C'est pour cette raison que des bibliothèques telles que Qt, GTK+ ou encore wxWidgets ont vu le jour. Mais ces dernières ne se limitent pas à l'interface graphique et offrent également une interface de programmation pour le réseau, l'accès aux fichiers ou encore la manipulation de chaîne de caractères.

## Niveaux de portabilité

La portabilité d'un programme peut se faire à plusieurs niveaux. Pour l'instant, les bibliothèques logicielles telle que POSIX ou Qt se limitent à la portabilité au niveau du code source. Mais il existe d'autres niveaux, comme celui du bytecode ou encore, mais plus rare, celui de l'exécutable.

### Du code source

La portabilité au niveau du code source nécessite la disponibilité de l'interface de programmation sur tous les environnements d'exécution cibles. À partir de cela, il suffit de recompiler le code source avec les bonnes bibliothèques.
La portabilité au niveau du code source est également valable avec les langages interprétés, où cette fois-ci, c'est la disponibilité de l'interpréteur et de sa bibliothèque standard qui est nécessaire.

### Du bytecode

Le bytecode est une sorte de code intermédiaire, que l'on peut considérer comme « à moitié compilé » ou « pseudo-compilé ». Ce code n'est pas destiné à être exécuté directement par le système d'exploitation comme tout programme compilé. C'est une machine virtuelle qui est chargée de cela. Son but est de servir de couche entre le programme et le système d'exploitation, rendant ainsi parfaitement portable tout programme, à condition qu'il existe une machine virtuelle sur le système cible.
Aujourd'hui, le principal représentant est Java, dont la machine virtuelle est disponible, sur les principaux systèmes d'exploitation (Windows, Linux, Mac OS, FreeBSD ou encore Solaris). Le langage de programmation de Microsoft, C# dispose également d'une machine virtuelle.

### De l'exécutable

Ce niveau de portabilité est notamment offert par le format d'exécutable Universal binaries d'Apple, où des applications s'exécutent indifféremment sur architecture PowerPC et x86, mais uniquement sur Mac OS X

## Système d'exploitation

L'environnement d'exécution d'un système d'exploitation est l'architecture matérielle sur laquelle il s'exécute. Le niveau de portabilité d'un système dépend donc de sa capacité à s'abstraire des spécificités du matériel en ayant un minimum de code dépendant du matériel. À ce niveau, la grande difficulté est d'avoir une collection de pilotes de périphériques assez étendue pour que l'utilisation du système d'exploitation soit intéressante.
Un système très portable est NetBSD, disponible sur plus de cinquante architectures matérielles (allant du superordinateur au grille-pain).

## Note

* ↑ ce n'est pas toujours vrai car le développeur peut avoir supposé certaines choses lors du développement de l'application, qui ne sont plus vraies lors du changement de système d'exploitation. Un des cas qui peut survenir est celui du caractère séparateur dans les chemins de fichiers, qui est '/' (pour les systèmes UNIX) et '\' (pour Windows).
* ↑ de manière plus ou moins optimisée
* ↑ (en) Technologic Systems Designs NetBSD Controlled Toaster