# Portabilidade de software

Portabilidade na linguagem de programação de alto nível é a usabilidade do mesmo software em ambientes diferentes. O pré-requisito para portabilidade é a abstração generalizada entre a lógica do aplicativo e as interfaces do sistema. Quando software com a mesma funcionalidade é produzido para várias plataformas de computação, a portabilidade é a principal questão para a redução de custos de desenvolvimento.

## Estratégias para portabilidade

A portabilidade de software pode envolver:
* Transferindo arquivos de programa instalados para outro computador basicamente da mesma arquitetura.
* Reinstalar um programa a partir de arquivos de distribuição em outro computador basicamente da mesma arquitetura.
* Construindo programas executáveis para diferentes plataformas a partir do código fonte; isso é o que geralmente se entende por "portar".

### Sistemas similares

Quando sistemas operacionais de mesma família são instalados em dois computadores com processadores com conjuntos de instruções semelhantes, geralmente é possível transferir os arquivos, implementando arquivos de programa entre eles.
No caso mais simples, o arquivo ou arquivos podem ser simplesmente copiados de uma máquina para outra. No entanto, em muitos casos, o software é instalado em um computador de maneira que depende do hardware, software e configuração detalhadas, com drivers de dispositivo para dispositivos específicos, usando o sistema operacional instalado e dando suporte a componentes de software e usando partições ou diretórios diferentes .
Em alguns casos, o software, geralmente descrito como "software portátil", é projetado especificamente para ser executado em computadores diferentes com sistemas operacionais e processadores compatíveis, sem nenhuma instalação dependente da máquina. Portar nada mais é do que transferir diretórios especificados e seu conteúdo. O software instalado em dispositivos portáteis de armazenamento em massa, como pen drives, pode ser usado em qualquer computador compatível, basta conectar o dispositivo de armazenamento e armazenar todas as informações de configuração no dispositivo removível. As informações específicas de hardware e software geralmente são armazenadas em arquivos de configuração em locais especificados (por exemplo, o registro em máquinas executando o Microsoft Windows ).
O software que não é portátil nesse sentido terá que ser transferido com modificações para dar suporte ao ambiente na máquina de destino.

### Processadores diferentes

Desde 2011 a maioria dos computadores desktop e laptop usava microprocessadores compatíveis com os conjuntos de instruções de 32 e 64 bits x86. Dispositivos portáteis menores usam processadores com conjuntos de instruções diferentes e incompatíveis, como o ARM. A diferença entre dispositivos maiores e menores é tal que a operação detalhada do software é diferente; um aplicativo projetado para exibição adequada em uma tela grande não pode simplesmente ser portado para um smartphone de bolso com uma tela minúscula, mesmo que a funcionalidade seja semelhante.
Os aplicativos da Web precisam ser independentes do processador, para que a portabilidade possa ser alcançada usando técnicas de programação da Web, escrevendo em JavaScript. Esse programa pode ser executado em um navegador da web comum. Esses aplicativos da web devem, por razões de segurança, ter controle limitado sobre o computador host, principalmente em relação à leitura e gravação de arquivos. Programas que não são da Web, instalados em um computador da maneira normal, podem ter mais controle e, ainda assim, alcançar a portabilidade do sistema, vinculando-se a bibliotecas portáteis que fornecem a mesma interface em sistemas diferentes.

## Portabilidade do código fonte

Software pode ser compilado e ligado a partir do código-fonte para diferentes sistemas operacionais e processadores, se escritos em uma linguagem de programação que suporte a compilação para as plataformas. Isso geralmente é uma tarefa para os desenvolvedores do programa; usuários comuns não têm acesso ao código-fonte nem as habilidades necessárias.
Em ambientes de código aberto, como o Linux, o código fonte está disponível para todos. Anteriormente, o código fonte era frequentemente distribuído em um formato padronizado e podia ser incorporado ao código executável com uma ferramenta Make padrão para qualquer sistema em particular por usuários com conhecimento moderado, se nenhum erro ocorresse durante a compilação. Algumas distribuições Linux distribuem software para usuários na forma de código fonte. Nesses casos, geralmente não há necessidade de adaptação detalhada do software para o sistema; é distribuído de uma maneira que modifica o processo de compilação para corresponder ao sistema.

### Esforço para portar o código fonte

Mesmo com linguagens aparentemente portáteis como C e C ++, o esforço para portar o código-fonte pode variar consideravelmente. Os autores do UNIX / 32V (1979) relataram que "[o] shell (Bourne) [...] exigia de longe o maior esforço de conversão de qualquer programa supostamente portátil, pela simples razão de que ele não é portátil".
Às vezes, o esforço consiste em recompilar o código-fonte, mas às vezes é necessário reescrever as principais partes do software. Muitas especificações de linguagem descrevem o comportamento definido pela implementação (por exemplo, deslocamento (shifting) para a direita de um número inteiro com sinal em C pode fazer uma mudança lógica ou aritmética). As funções do sistema operacional ou bibliotecas de terceiros podem não estar disponíveis no sistema de destino. Algumas funções podem estar disponíveis em um sistema de destino, mas exibem um comportamento ligeiramente diferente (por exemplo: utime falha no Windows com o EACCES, quando é chamado para um diretório). O próprio código do programa também pode conter itens não portáveis, como os caminhos dos arquivos de inclusão. Letras de unidade e a barra invertida como delimitador de caminho não são aceitas em todos os sistemas operacionais. A implementação definiu coisas como ordem de bytes e o tamanho de um inteiro também pode aumentar o esforço de portabilidade. Na prática, é discutível a reivindicação de que linguagens como C e C ++ apresentem-se como "escrever uma vez, compilar em qualquer lugar".

## Veja também

* Software multiplataforma
* Software dependente de hardware
* C (linguagem de programação)
* Interoperabilidade de idiomas
* Teste de portabilidade
* Compilador fonte a fonte