# Fichier exécutable

En informatique et en technologies de l'information, un fichier exécutable, parfois (par métonymie) un programme, ou simplement un exécutable est un fichier contenant un programme et identifié par le système d'exploitation en tant que tel. Le chargement d'un tel fichier entraîne la création d'un processus dans le système, et l'exécution du programme, par opposition au fichier de données qui doit d'abord être interprété par un programme pour prendre sens.
Traditionnellement, le programme contenu dans un fichier exécutable contient lui-même des instructions codées dans un langage compréhensible par un processeur. Cependant, dans une acception plus générale, n'importe quel fichier contenant des instructions destinée à un interpréteur ou une machine virtuelle, comme des scripts ou du bytecode, peut aussi être considéré comme un exécutable.

## Formats de fichiers exécutables

Au sens large, un fichier exécutable peut prendre deux formes :
* un fichier binaire, c'est le cas pour :
** les programmes en langage machine, compilés (ou assemblés) pour un type de système donné, et dont les instructions sont exécutées directement par le processeur,
** les programmes en bytecode, compilés pour une architecture générique et devant être soit interprétés dans le cadre d'une machine virtuelle, soit « sur-compilés » vers un langage machine au moment de l'exécution ;
* un fichier texte, c'est le cas pour les scripts, dont l'exécution est réalisée par un interpréteur (shell, perl, etc.).

## Propriétés

Les fichiers exécutables sont des fichiers contenant un programme ou un script qui peut être exécuté par un ordinateur. Ils ont plusieurs propriétés importantes, parmi lesquelles :
* Extension du fichier : Les fichiers exécutables sous Windows ont généralement l'extension .exe, .bat, ou .msi (ou plus rarement .com). Sur les systèmes Unix/Linux, les fichiers exécutables ont rarement une extension, ce sont les permission individuelles qui déterminent si un fichier est exécutable – pour les scripts, en revanche, il peut, sans aucune obligation, y avoir une extension afin de connaître d'emblée le langage ciblé (e.g. .sh pour le langage shell, .py pour le langage Python, etc.).
* Permissions : Sur les systèmes Unix/Linux, un fichier doit avoir les permissions d'exécution définies pour être exécuté. Cela signifie que le bit d'exécution doit être réglé pour l'utilisateur, le groupe ou tous les utilisateurs (chmod +x fichier).
* Headers : Les fichiers exécutables contiennent des en-têtes qui décrivent leur format, le point d'entrée du programme, et d'autres informations nécessaires pour le charger en mémoire.
* Code machine : Le corps du fichier exécutable contient le code machine que le processeur exécute.
* Portabilité : Les fichiers exécutables sont souvent spécifiques à un système d'exploitation et à une architecture de processeur. Par exemple, un fichier .exe pour Windows ne fonctionnera pas sur un système Linux sans émulateur ou couche de compatibilité comme Wine.

### Macintosh

Sous les versions de Mac OS antérieures à Mac OS X, les différents types de fichiers (y compris les exécutables) sont identifiés par des informations stockées dans le fichier : le type et le créateur.
* Le type indique la nature du fichier par un code alphanumérique à quatre positions (par exemple : 'APPL' pour une application, 'INIT' pour une extension système — sorte de patch désactivable au démarrage —, ou 'cDEV' pour un tableau de bord — application utilitaire utilisable depuis n'importe quel contexte applicatif).
* Le créateur est un code de même format permettant, pour une application, de l'identifier de manière unique, et pour un fichier, de retrouver l'application permettant de l'ouvrir. Ces informations ont donc la même fonction que les extensions de noms de fichiers, tout en étant transparentes à l'utilisateur.
Dans Mac OS X, Apple a repris le même mode d'identification des catégories de fichiers, mais ajoute de manière systématique une gestion des extensions de noms de fichiers à la Unix, ce système d'exploitation étant basé sur un Unix.

### UNIX

Sous Unix, l'utilisateur doit avoir la permission pour pouvoir exécuter un fichier binaire exécutable. Aucune extension particulière n'est nécessaire pour qu'un fichier binaire exécutable puisse être lancé. Les programmes exécutables sont au format a.out, COFF ou ELF.
Un langage de script indique généralement au système sa nature grâce à un en-tête appelé Shebang, suivi de l'interpréteur permettant de l'exécuter.

### DOS/Windows

Les fichiers exécutables sous DOS/Windows doivent porter un suffixe (extension) spécifique. En ligne de commande, cette extension est implicite pour lancer le programme (s'il y a plusieurs possibilités, le premier fichier trouvé est utilisé).
Les programmes précompilés possèdent l'extension .exe ou .com. Depuis Windows NT, ils sont au format PE ; auparavant ils étaient au format NE — New Executable File Format, « new » faisant référence à CP/M, et aux fichiers .com —).
Il existe aussi des exécutables comprenant l'extension .APP utilisés par GEM.
Les scripts possèdent le suffixe .bat ou .cmd et sont interprétés par le programme COMMAND.COM (MS-DOS) ou cmd.exe (Windows NT et dérivés).

### Cygwin

Cygwin permet l'exécution de programmes MS-DOS/Windows et Unix de façon transparente pour l'utilisateur (pas de distinction visible au niveau de l'appel).
Cela pose parfois quelques problèmes lorsque des programmes « de même nom » sont disponibles à la fois au format MS-DOS/Windows et Unix : par exemple appeler more en ligne de commande, peut (selon la configuration) appeler soit more (Unix), soit more.com (MS-DOS, à cause de l'ajout automatique de l'extension .com, .exe ou .bat).

## Génération d'un fichier exécutable

Les scripts sont éditables avec un simple éditeur de texte, mais peuvent aussi être générés automatiquement par d'autres programmes.
Les binaires sont issus d'un procédé de compilation (mettant généralement en jeu un compilateur, un assembleur, un éditeur de liens…) à partir de codes sources (modifiables par un éditeur de texte ou un environnement de développement intégré).