# Portabilidad

La portabilidad es uno de los conceptos clave en la programación de alto nivel. Se define como la característica que posee un software para ejecutarse en diferentes plataformas, es decir, la portabilidad se refiere exclusivamente a la propiedad que posee un software que le permite ser ejecutado en diferentes plataformas y/o sistemas operativos. De este modo, si un determinado software compilado pudiere ser ejecutado en cualquier sistema operativo, diríamos que ese software es 100% portable. Este es el núcleo del concepto de portabilidad. En este sentido, la afirmación precedente: «El código fuente del software es capaz de reutilizarse en vez de crearse un nuevo código cuando el software pasa de una plataforma a otra»", tiene como supuesto erróneo que tenemos acceso al código fuente, el cual podría reutilizarse (como es la meta que buscan los diseñadores de los lenguajes cuyos códigos corren sobre máquinas virtuales, como es el caso de Java y la familia DOT NET). Esto es incorrecto: la portabilidad es un concepto que se refiere exclusivamente a la relación software <-> plataforma.
El prerrequisito para la portabilidad es la abstracción generalizada entre la aplicación lógica y las interfaces del sistema. Cuando un software se puede compilar en diversas plataformas (x86, IA64, amd64, etc.), se dice que este es multiplataforma. Esta característica es importante para el desarrollo de reducción de costos cuando se quiere hacer una misma aplicación.
En algunos casos el software es «independiente» de la plataforma y puede ejecutarse en plataformas diversas sin necesidad de ser compilado específicamente para cada una de ellas, a este tipo de software se le llama interpretado, donde un intérprete traduce (propiamente interpreta) las instrucciones en tiempo de ejecución para que sean entendidas por diferentes plataformas.

## Estrategias de Portabilidad

La portabilidad del software puede implicar:
* Transferir archivos de programas instalados a otro ordenador de básicamente la misma arquitectura.
* Reinstalar un programa a partir de archivos de distribución en otro ordenador de básicamente la misma arquitectura.
* Construir programas ejecutables para diferentes plataformas a partir del código fuente; esto es lo que se suele entender por "portar".

### Sistemas similares

Cuando se instalan sistemas operativos de la misma familia en dos ordenadores con procesadores con juegos de instrucciones similares, a menudo es posible transferir entre ellos los archivos de ejecución de los programas.
En el caso más sencillo, el archivo o archivos pueden simplemente copiarse de una máquina a la otra. Sin embargo, en muchos casos, el software se instala en un ordenador de una forma que depende de su hardware, software y configuración detallados, con controladores de dispositivo para dispositivos concretos, utilizando componentes instalados del sistema operativo y del software de apoyo, y utilizando diferentes unidades o directorios.
En algunos casos, el software, normalmente descrito como "software portátil", está específicamente diseñado para funcionar en diferentes ordenadores con sistemas operativos y procesadores compatibles, sin ninguna instalación dependiente de la máquina. La portabilidad no es más que la transferencia de directorios específicos y sus contenidos. El software instalado en dispositivos portátiles de almacenamiento masivo, como las memorias USB, puede utilizarse en cualquier ordenador compatible con sólo conectar el dispositivo de almacenamiento, y almacena toda la información de configuración en el dispositivo extraíble. La información específica de hardware y software suele almacenarse en archivos de configuración en ubicaciones específicas (por ejemplo, el registro en máquinas con Microsoft Windows).
El software que no sea portátil en este sentido tendrá que transferirse con modificaciones para adaptarse al entorno de la máquina de destino.

### Diferentes procesadores

En 2011, la mayoría de los ordenadores de sobremesa y portátiles utilizaban microprocesadores compatibles con los conjuntos de instrucciones x86 de 32 y 64 bits. Los dispositivos portátiles más pequeños utilizan procesadores con conjuntos de instrucciones diferentes e incompatibles, como ARM. La diferencia entre dispositivos grandes y pequeños es tal que el funcionamiento detallado del software es distinto; una aplicación diseñada para visualizarse adecuadamente en una pantalla grande no puede trasladarse sin más a un teléfono inteligente de bolsillo con una pantalla diminuta aunque la funcionalidad sea similar.
Las aplicaciones web deben ser independientes del procesador, por lo que la portabilidad puede lograrse utilizando técnicas de programación web, escribiendo en JavaScript. Un programa de este tipo puede ejecutarse en un navegador web común. Por motivos de seguridad, estas aplicaciones web deben tener un control limitado sobre el ordenador anfitrión, especialmente en lo que respecta a la lectura y escritura de archivos. Los programas no web, instalados en un ordenador de la forma habitual, pueden tener más control y, sin embargo, lograr la portabilidad del sistema enlazando con bibliotecas portátiles que proporcionen la misma interfaz en diferentes sistemas.

## Portabilidad del código fuente

El software puede compilarse y enlazarse a partir del código fuente para distintos sistemas operativos y procesadores si está escrito en un lenguaje de programación compatible con la compilación para las plataformas. Esto suele ser tarea de los desarrolladores del programa; los usuarios típicos no tienen ni acceso al código fuente ni los conocimientos necesarios.
En entornos de código abierto como Linux, el código fuente está disponible para todos. Antes, el código fuente solía distribuirse en un formato estandarizado y, si no se producían errores durante la compilación, los usuarios con conocimientos moderados podían convertirlo en código ejecutable con una herramienta Make estándar para cualquier sistema. Algunas distribuciones de Linux distribuyen software a los usuarios en formato fuente. En estos casos, no suele ser necesaria una adaptación detallada del software para el sistema; se distribuye de forma que se modifica el proceso de compilación para adaptarlo al sistema.

### Esfuerzo para portar el código fuente

Incluso con lenguajes aparentemente portables como C y C++, el esfuerzo para portar el código fuente puede variar considerablemente. Los autores de UNIX/32V (1979) informaron de que "[e]l intérprete de comandos (Bourne) [...] requirió con diferencia el mayor esfuerzo de conversión de cualquier programa supuestamente portable, por la sencilla razón de que no es portable".
A veces, el esfuerzo consiste en recompilar el código fuente, pero otras es necesario reescribir partes importantes del software. Muchas especificaciones del lenguaje describen un comportamiento definido por la implementación (por ejemplo, el desplazamiento a la derecha de un entero con signo en C puede hacer un desplazamiento lógico o aritmético). Las funciones del sistema operativo o las bibliotecas de terceros pueden no estar disponibles en el sistema de destino. Algunas funciones pueden estar disponibles en un sistema de destino, pero mostrar un comportamiento ligeramente diferente (Por ejemplo: utime falla en Windows con EACCES, cuando se llama para un directorio). El propio código del programa también puede contener cosas no portables, como las rutas de los archivos de inclusión. Las letras de unidad y la barra invertida como delimitador de ruta no se aceptan en todos los sistemas operativos. Las cosas definidas por la implementación, como el orden de los bytes y el tamaño de un int, también pueden aumentar el esfuerzo de portabilidad. En la práctica, la afirmación de lenguajes como C y C++ de tener WOCA (escribir una vez, compilar en cualquier parte) es discutible.