# File eseguibile

Un file eseguibile (o semplicemente un eseguibile), in informatica, indica un file che contiene un programma eseguibile per un computer, ovvero un programma scritto in linguaggio macchina direttamente eseguibile dal processore: 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 interprete o trasformandolo prima in eseguibile (codice oggetto + librerie) tramite un compilatore, o con una combinazione di questi due strumenti.

## Descrizione

In generale, gli eseguibili sono dipendenti dalla piattaforma: per esempio, un file eseguibile per un sistema Microsoft Windows non è direttamente utilizzabile in sistemi Unix o Mac OS (a meno di non usare un software di emulazione).
Questa restrizione è dovuta a tre motivi:
* processori diversi supportano linguaggi macchina generalmente diversi e incompatibili tra di loro;
* sistemi operativi diversi usano generalmente formati diversi per i file eseguibili: ad esempio nei sistemi Unix e Unix-like è comune il formato ELF, mentre in altri sistemi si usa COFF o suoi derivati, o anche Mach-O;
* per effettuare operazioni di base (per esempio l'input/output) i programmi eseguibili devono avvalersi delle primitive fornite dal sistema operativo del computer su cui sono eseguiti, il cui utilizzo è specifico per sistema operativo. Di conseguenza, anche a parità di processore, un file eseguibile per un particolare sistema operativo è in generale inutilizzabile su altre piattaforme ovvero non è portabile. Ad esempio, i file eseguibili per i sistemi Microsoft Windows su architettura x86 non possono essere utilizzati direttamente su sistemi Linux su architettura x86, anche se queste entrambi 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 specifiche estensioni (per esempio ".exe" in MS-DOS e Microsoft Windows); altri fanno riferimento a speciali attributi del file indicati nei suoi permessi (come il permesso "x" di esecuzione dei sistemi Unix e Unix-like) 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, ovvero uno o più byte con valori prestabiliti collocati all'inizio del file che ne identificano il tipo, come nel caso dello shabang (questa idea è stata estesa ad altri sistemi operativi tra cui AmigaOS dove il magic number viene chiamato "magic cookie" o biscottino magico).
Normalmente, durante l'upload 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.

## Utilizzo

Viene realizzato in un dato formato, ed ha principalmente due scopi:
* ad essere caricato dal sistema operativo, quindi pronto per l'esecuzione;
* all'architettura hardware del processore che lo esegue.
Il termine eseguibile viene talvolta utilizzato in senso esteso per riferirsi anche a tutti quei programmi che possono essere eseguiti senza una previa traduzione esplicita (compilazione) in linguaggio macchina.
In questo caso esso potrebbe essere applicato anche a:
* script scritti nel linguaggio della shell testuale del sistema operativo, per esempio Bash o la Korn shell per i sistemi Unix e Unix-like, o i cosiddetti file batch per MS-DOS e Microsoft Windows;
* programmi sorgenti di linguaggi interpretati come BASIC, Perl, Python o ancora Ruby;
* 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 separato, 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 macchina virtuale 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.