In informatica, un file eseguibile, o semplicemente un eseguibile, è un file che contiene un programma eseguibile per un computer, ovvero un programma scritto in linguaggio macchina e quindi pronto per l'esecuzione. Si distingue da un file sorgente, che contiene un programma scritto in un linguaggio di programmazione ad alto livello, il quale può essere eseguito solo utilizzando un compilatore, un interprete, o una combinazione di questi due strumenti.
In generale, gli eseguibili dipendenti dalla piattaforma: per esempio, un file eseguibile per Windows non sarà utilizzabile su computer Unix o Macintosh (a meno di non usare un software di emulazione). Questa restrizione è dovuta a due motivazioni. Innanzitutto, a diversi processori sono spesso associati linguaggi macchina differenti. In secondo luogo, i programmi eseguibili devono far riferimento, per alcuni tipi di operazioni (per esempio l'input/output) a primitive fornite dal sistema operativo del computer su cui sono eseguiti. Di conseguenza, anche a parità di processore, un programma eseguibile sviluppato per un dato sistema operativo è in genere inutilizzabile su altre piattaforme. Per questo motivo, per esempio, gli eseguibili per i sistemi Windows non possono essere utilizzati in ambiente Linux, anche se queste due famiglie di sistemi operativi utilizzano la stessa classe di processori.
Ogni sistema operativo ha una propria convenzione per distinguere i file eseguibili dai file che contengono dati. Alcuni sistemi utilizzano una specifica estensione (per esempio ".exe" in MS-DOS/Windows); altri fanno riferimento a speciali attributi del file indicati nel suo descrittore (come il bit "x" di Unix) o richiedono uno speciale marcatore in una posizione prestabilita all'interno del file stesso: ancora su Unix, per esempio, congiuntamente al bit "x", viene utilizzato anche il cosiddetto magic number, un numero esadecimale posto all'inizio del file che ne indica esplicitamente il tipo (questa idea è stata estesa ad altri sistemi operativi).
Normalmente, durante il caricamento di un file eseguibile in memoria, il codice macchina viene sottoposto a un processo di rilocazione. In altre parole, tutti i riferimenti a indirizzi di memoria presenti nel codice vengono opportunamente traslati in funzione dell'indirizzo di base in cui il programma viene effettivamente caricato. Questo problema è mitigato dall’uso della memoria virtuale; può tuttavia essere necessaria la rilocazione delle librerie dinamiche.
Altri usi
Il termine eseguibile viene talvolta utilizzato in senso esteso per riferirsi a tutti quei programmi che possono essere eseguiti senza una previa traduzione esplicita (compilazione). In questo caso esso potrebbe essere applicato anche a:
script scritti nel linguaggio dell'interprete dei comandi del sistema operativo, per esempio shell script per Unix/Linux o i cosiddetti comandi batch per MS-DOS/Windows
programmi sorgenti di linguaggi interpretati come Basic
programmi semi- (o pseudo-)compilati, ovvero tradotti dal compilatore in un codice di livello intermedio (non ancora linguaggio macchina) che deve essere eseguito attraverso un interprete, come avviene per esempio per Java, Visual Basic e .NET:
Il compilatore Java produce, a partire dal codice sorgente Java, una serie di file in un linguaggio intermedio detto bytecode. La macchina virtuale di Java esegue il bytecode occupandosi sia dell'interpretazione delle istruzioni che del link.
Il compilatore Visual Basic produce un eseguibile che contiene una piccola porzione di codice macchina eseguibile, con il solo compito di caricare la macchina virtuale Visual Basic, detta Visual Basic Runtime. Il resto del file contiene dati in codice intermedio che vengono interpretati dal Visual Basic Runtime.
Nella piattaforma Microsoft .NET, molto simile a Java, gli eseguibili sono compilati in un bytecode detto Microsoft Intermediate Language (MSIL), eseguito da una virtual machine detta Common Language Runtime. Gli ambienti di sviluppo moderni sono in grado di tradurre in MSIL numerosi linguaggi, tra cui C#, Visual Basic, Delphi e persino COBOL.