# Porting

Il porting (termine inglese), in informatica, è un processo di trasposizione, a volte anche con modifiche, di un componente software, volto a consentirne l'uso in una piattaforma diversa da quella originale. Si effettua un porting quando il software viene in qualche modo adattato, non quando il codice sorgente viene completamente riscritto in un altro linguaggio di programmazione.
La portabilità è la caratteristica di un software (detto quindi portabile) di poter essere facilmente sottoposto a porting, con un impegno decisamente inferiore rispetto a quello che costerebbe ricreare da zero le stesse funzionalità nelle nuove piattaforme. A volte con portabilità si indica in maniera più generale possibile l'indipendenza in fase di esecuzione dalla piattaforma utilizzata.
Due attività collegate con il porting, ma distinte da esso, sono l'emulazione e la compilazione incrociata o cross-compilazione.

## Descrizione

Il porting può essere un'attività complessa e costosa; ciò dipende dalla "distanza" tecnologica fra l'ambiente di origine e l'ambiente di destinazione, dal tipo di componente software da "portare" e dagli strumenti con cui esso è stato costruito.
Un componente software si dice portabile se è possibile eseguirne il porting (specialmente se semplice e poco costoso in termini di risorse di lavoro); in questo senso, la portabilità si può considerare un caso particolare di riusabilità del software. Il caso limite è quello in cui un componente software può essere riutilizzato su diverse piattaforme senza che questo comporti alcuna modifica, ed oggi si tende a usare il termine portabilità proprio in quest'ultima accezione, che in ambito hardware o sistemistico è detta anche interoperabilità.
Nello scenario odierno, in cui calcolatori di ogni tipo sono in grado di comunicare e scambiarsi dati e programmi attraverso Internet, la portabilità rappresenta un fattore spesso decisivo nella scelta di tecnologie, metodologie e strumenti per la produzione del software. Allo stesso tempo, l'emergere di standard come quelli promulgati da ISO e ANSI (p.es. riguardo a formati di archiviazione dati o linguaggi di programmazione), e la conseguente convergenza di tecnologie e sistemi informatici rispetto ad almeno alcuni aspetti del loro funzionamento, gioca evidentemente a favore della portabilità del software in generale.
Esiste un gran numero di strumenti che aiutano il porting, come GCC, che permette di compilare diversi linguaggi sotto diverse architetture, e autoconf, che prima della compilazione, automatizza la ricerca di quelle piccole differenze che potrebbero impedire di compilare il sorgente e adatta di conseguenza il programma.

### Cause

L'operazione di porting, cioè la creazione (scrittura) di un port, può essere richiesta a causa delle differenze tra le CPU, dalle diverse interfacce (Application programming interface API) dei sistemi operativi, dalla diversità dell'hardware o per delle sottili incompatibilità dell'implementazione del linguaggio di programmazione sull'ambiente target (quello su cui deve essere compilato il programma). Oltre alle più blasonate cause il porting può essere richiesto quando il programmatore ritiene che il codice di origine non sia stato scelto con attenzione, e di conseguenza non sia adatto allo scopo prefisso.

## Esempio

Benché vi siano numerose sfumature nel significato che si attribuisce al termine "portabilità" in diversi contesti, vale la pena enfatizzarne almeno due: la portabilità dei dati e la portabilità dei programmi.

### Portabilità dei dati

Dipende dal formato in cui i dati sono archiviati su file. Per esempio, un file di testo memorizzato come sequenza di codici ASCII si considera generalmente portabile, in quanto questo tipo di codifica è oggi (quasi) universalmente adottata dai costruttori di calcolatori.

### Portabilità dei programmi

La portabilità dei programmi dipende essenzialmente dal linguaggio di programmazione usato. Alcuni linguaggi non si possono considerare portabili (ovvero non consentono la scrittura di programmi portabili) per il semplice motivo che per alcuni ambienti non esiste un interprete o compilatore del linguaggio; oppure perché i compilatori o interpreti disponibili in diversi ambienti presentano alcune differenze più o meno sottili relativamente alla sintassi che accettano o alla semantica che attribuiscono ad alcuni costrutti; cosicché, un programma che funziona correttamente su una macchina potrebbe esibire dei malfunzionamenti più o meno gravi, o addirittura non compilare, su un'altra.
Quest'ultimo problema può essere risolto pubblicando uno standard del linguaggio, ovvero una sua descrizione il più possibile precisa e non ambigua, eventualmente gestita da un ente "autorevole" che abbia il compito di certificare l'aderenza di compilatori e interpreti a tale descrizione. Un esempio celebre in questo senso è data dal linguaggio C, di cui hanno fornito uno standard prima ANSI e poi ISO. Di conseguenza, i programmi C sono portabili nel senso che possono essere compilati in un qualsiasi ambiente (grazie all'API comune), ottenendo programmi in linguaggio macchina diversi ma che esibiscono un comportamento semanticamente equivalente.
Si osservi che nonostante il C e il C++ siano linguaggi portabili, la diversità dei compilatori dei due linguaggi di programmazione pone una serie di problemi alla portabilità. Il solo fatto di avere un programma in C oppure in C++ non garantisce la portabilità del medesimo e quindi spesso bisogna fare uno sforzo aggiuntivo per superare le differenze tra i due sistemi e tra i compilatori.
Una forma più radicale di portabilità viene fornita dai linguaggi interpretati, sotto la condizione che esistano interpreti per i diversi ambienti di interesse, e che questi interpreti esibiscano un comportamento equivalente (p.es. conforme a uno standard). In questo caso, il "porting" di un programma non richiede neppure ricompilazione. È per esempio il caso di Java; il software Java può essere eseguito in qualunque ambiente in cui sia installata la cosiddetta macchina virtuale Java (più precisamente il JRE, Java Runtime Environment, scaricabile gratuitamente dal sito internet della Oracle). Altro aspetto della portabilità Java è quello che rende possibile l'inserimento di piccoli programmi Java (applet) all'interno di pagine Web destinate a essere visualizzate da diversi browser in esecuzione su macchine completamente diverse.