Você acabou de baixar uma atualização repleta de recursos para o seu aplicativo de código aberto favorito. Tudo está funcionando bem e você o usa em seus outros dispositivos - por isso é hora de usá-lo também.
Exceto que seu novo e brilhante laptop Linux não é compatível com o seu pacote de instalação do Windows. Como sobre o seu tablet Android? Iphone? PS4? Por que você não pode simplesmente pegar esse software e usá-lo onde quiser? Vamos explorar algumas barreiras diferentes para o sonho de "comprar uma vez, correr para qualquer lugar".
Desenvolvimento de Software e Arquitetura do SO
Entender por que o software não funciona em sistemas operacionais requer um pouco (apenas um pouco, eu prometo) conhecimento de como o software é feito.
O processo de desenvolvimento de software
Em um fluxo de desenvolvimento de software muito básico para desktop, servidor e móvel (ou seja, não Web Programação versus Desenvolvimento Web: Qual é a diferença? Programação versus Desenvolvimento Web: Qual é a diferença? Você pode pensar que programadores de aplicativos e desenvolvedores web fazem o mesmo trabalho, mas isso está longe da verdade.Aqui estão as principais diferenças entre programadores e desenvolvedores da Web. Leia mais), um programador irá:
- Digite algum código em um ou mais arquivos.
- Compile o código em algo que o computador possa executar.
- Teste para garantir que o programa funcione conforme o esperado.
- Empacote e distribua / implemente o software.
É uma combinação dos primeiros e segundos passos que nos interessam aqui. O processo de compilação de software, ou de transformá-lo de código em uns e zeros que um computador entende (linguagem de máquina) é complexo. Não vamos entrar em detalhes, mas é útil entender em alto nível o que acontece.
Arquitetura do SO
Um ponto importante a entender é que um sistema operacional não é uma entidade única. Pelo contrário, é composto de camadas de software.
Kernels do Sistema Operacional
O kernel de um sistema operacional é responsável pela comunicação com o hardware do computador. O software comunica seus comandos ao kernel, que, por sua vez, emite comandos para o hardware (por exemplo) para ler um arquivo do disco rígido ou para desenhar uma janela na tela. Ele basicamente coordena todas as informações (sejam dados armazenados, cálculos ou entradas do usuário) entre hardware e vários softwares. O kernel disponibiliza toda essa funcionalidade para o software por meio de chamadas do sistema .
O kernel de cada sistema operacional implementará as chamadas do sistema de maneira diferente, em termos de quais delas estão disponíveis, do que são chamadas ou de quais opções elas executam. Como resultado, o software precisa levar em conta as chamadas do sistema suportadas pelo kernel de cada sistema operacional que ele atinge. A chamada do sistema que você usa para enviar dados para a GPU no Linux pode ter um nome diferente, uma lista de informações que você precisa fornecer ou ambas no Windows. Essa chamada exata pode nem estar lá.
Bibliotecas do sistema
Em muitos casos, o software não liga diretamente para o kernel. Em vez disso, ele chama as bibliotecas do sistema ou coleções de funções básicas. Bibliotecas existem assim (por exemplo) todo e qualquer programa que salva arquivos no disco rígido não precisa escrever uma função para fazer isso. Em vez disso, ele simplesmente se vincula a uma biblioteca do sistema e usa uma função existente. A biblioteca GLibC para Linux é um excelente exemplo, assim como os arquivos .DLL na API do Win32 ou o conteúdo de um diretório Mac / System / Library. Como acessar a pasta OS X Library e por que ela é útil Como acessar a biblioteca OS X Pasta e Por que É Útil A maioria das pastas do OS X Library são deixadas sozinhas, mas é útil conhecer o seu caminho dentro e ao redor da Biblioteca do Usuário. Consulte Mais informação .
As bibliotecas de sistema funcionam como um tipo de tradutor entre aplicativos e o kernel para tarefas de rotina. Os aplicativos fazem chamadas de função para essas bibliotecas, que lidam com muitos detalhes de baixo nível. Eles também podem fazer chamadas do sistema para o kernel por conveniência. Como você deve ter adivinhado, isso significa que essas bibliotecas são escritas para um kernel específico e, portanto, não podem ser usadas em sistemas operacionais com kernels diferentes.
Cabeçalhos de Execução do Sistema Operacional
O último obstáculo para o software universal é o formato dos arquivos executáveis dos sistemas operacionais. Um sistema operacional espera que os arquivos executados sigam um formato de arquivo binário específico Tudo o que você precisa saber sobre os formatos de arquivo e suas propriedades Tudo o que você precisa saber Sobre os formatos de arquivo e suas propriedades Usamos o arquivo alternativo: música, imagem, planilha, slideshow, e assim por diante. Mas o que torna um arquivo um "arquivo", afinal? Vamos tentar entender essa parte fundamental da computação. Consulte Mais informação . Por exemplo, os arquivos Executable and Linkable Format (ELF) que são executados em sistemas operacionais como Linux e FreeBSD devem especificar certas propriedades do arquivo em certos bytes, como mostrado na imagem abaixo.
A interface binária do aplicativo (ABI) mostrada é de particular importância. Uma combinação das chamadas disponíveis do processador, kernel e libararies do sistema, uma ABI é semelhante a uma interface de programação de aplicativo (API) na medida em que define como dois programas se comunicam entre si. Mas a API é algo usado por programadores (humanos) no código-fonte para indicar que duas partes de software devem se comunicar entre si. A ABI é o que realmente permite que eles o façam quando o software é compilado e executado. Cada sistema operacional implementa uma ABI específica, que pode ou não mudar entre versões do mesmo sistema operacional.
Em geral, os sistemas operacionais implementam sua própria ABI, determinada por uma combinação do tipo de processador, do kernel e de qualquer biblioteca de sistema padrão. Mas às vezes um sistema operacional implementará mais de um. O FreeBSD tem suporte para binários do Linux, por exemplo, porque ele fornece uma ABI do Linux como um complemento do kernel do FreeBSD (em vez do kernel do Linux). Isso é diferente dos programas de virtualização O que é uma máquina virtual? O que é uma máquina virtual? As máquinas virtuais permitem que você execute outros sistemas operacionais em seu sistema operacional atual, mas por que isso importa? Quais são os prós e contras? Leia mais, como VMWare ou VirtualBox, que usam software para simular uma máquina inteira (hardware e tudo). Como resultado, esse tipo de compatibilidade com ABI é mais rápido, mas muito mais esforço para manter. É por isso que é raro, embora a Microsoft recentemente tenha visto o valor O Ubuntu está agora disponível na Windows Store O Ubuntu já está disponível na Windows Store Windows Insiders agora pode baixar e instalar o Ubuntu no Windows 10. Isso une o Linux e o Windows em uma união profana poucos imaginaram que viveriam tempo suficiente para testemunhar. Leia mais ao fazê-lo.
Exceção: Software Interpretado
Com base no acima, aprendemos que os desenvolvedores escrevem software para um, e apenas um, tipo de sistema de destino. Exceto quando eles não. Existem muitos aplicativos que você pode baixar e executar em um Mac, depois copiar e executar no Windows e talvez até mesmo copiar novamente e rodar no Linux sem problemas. Como isso é possível?
Eu estava deitada até agora?
Como se constata, há uma categoria de software que parece na superfície como se "fosse executado em todos os lugares". Você pode fazer o download e executá-lo em qualquer plataforma suportada - sendo a palavra-chave "suportada". código-fonte para o aplicativo, enquanto outro aplicativo (o interpretador ) está executando o código-fonte diretamente em tempo real. Isso é algo simplista, então vamos ver exatamente como isso funciona em alguns idiomas.
Java
Quando o Java foi lançado pela primeira vez, sua promessa era (literalmente) “gravar uma vez, rodar em qualquer lugar”. A ideia era criar aplicativos usando funções Java para salvar arquivos, fazer cálculos ou criar uma janela de aplicativo. Em seguida, um Java Runtime Enviornment (JRE) para cada plataforma de computador suportada executaria o código e os converteria em funções nativas do sistema operacional. O truque para o Java, então, é que ele não é executado “diretamente” no sistema operacional. Ele é executado em uma parte do JRE chamada Java Virtual Machine e é isso que é executado no sistema operacional.
Ao inserir essa camada de software adicional entre o aplicativo e o sistema operacional, o Java permite que você se concentre em um conjunto de funções que seja o mesmo em todos os sistemas operacionais. Você diz ao Java o que você quer fazer e deixa a JVM para o seu sistema se preocupar sobre como realmente fazer isso. A figura abaixo mostra isso em ação, onde o Java Desktop Application Framework da JIDE Software exibe o mesmo aplicativo para Mac (superior), Windows (meio esquerdo), “puro Java” (meio direito) e Linux (inferior).
Os programas Java não se “compilam” precisamente em tempo real. Em vez disso, o compilador Java os renderizará em “bytecode”. Você pode pensar no bytecode como um programa incompleto. Quando o desenvolvedor libera o aplicativo, ele é compilado o máximo possível sem saber em qual sistema operacional ele será executado. Quando você realmente lança-lo, a JVM irá “assar o resto do caminho” para ajustar as funções específicas do sistema operacional host.
Python
Uma linguagem popular interpretada é Python 5 razões pelas quais a programação em Python não é inútil 5 razões pelas quais a programação em Python não é inútil Python - Você ama ou odeia. Você pode até balançar de um lado para o outro como um pêndulo. Independentemente disso, o Python é uma linguagem difícil de ser ambivalente. Consulte Mais informação . Quando você executa um script Python, o interpretador Python traduz o código em instruções para o sistema operacional. Ele também pode funcionar de forma semelhante ao Java: quando você “importa” o código de fora do seu aplicativo, ele é compilado para o bytecode na primeira vez em que é executado. Em seguida, o intérprete saberá se, nas execuções subseqüentes, o código original foi alterado e, nesse ponto, ele será compilado novamente para o novo código de bytes.
Um subproduto interessante dessa execução "sob demanda" é que você pode usar o intérprete para desenvolver seus scripts de forma interativa. Simplesmente digitando “python” na linha de comando, você iniciará o interpretador e poderá executar o código e ver os resultados imediatamente.
Isso significa que os desenvolvedores podem brincar e ajustar as coisas “ao vivo”. Então, quando uma linha de código faz o que eles querem, copie e cole em um arquivo de script (que é muito mais eficiente do que o ciclo de teste de compilação de código). programadores de linguagem não interpretados têm que fazer).
Mesmo quando o software é o mesmo, provavelmente não é
Infelizmente para os usuários, a indústria de tecnologia não desenvolveu um formato verdadeiramente "universal". E isso pode nunca acontecer. A introdução desses tipos de padrões geralmente resulta em uma solução de “mínimo denominador comum”, com concessões no interesse de obter a aprovação de todos.
O que você acha? Você prefere ter um software compatível universalmente, mesmo que isso signifique que não seja tão bom? Ou você está bem com o sistema operacional que está usando e não tem interesse nos aplicativos de outras plataformas? Deixe-nos saber abaixo nos comentários!
Créditos da Imagem: Masterchief_Productions / Shutterstock