O que significa para o software rodar nativamente?

27

Eu tenho me perguntado o que significa para o software rodar nativamente. O que exatamente é esse software e como ele é diferente do software que não é executado nativamente? Como posso saber se um determinado item de software será executado nativamente no meu computador? É provável que já haja software no meu computador que seja executado nativamente?

    
por Throsby 16.04.2013 / 05:06

5 respostas

43

Um software é nativo a uma plataforma se foi projetado para rodar nessa plataforma.

Uma plataforma geralmente se refere a um sistema operacional, mas também pode ser aplicada a dispositivos como o Nintendo Game Boy.

Usando o Game Boy como exemplo, ele obtém seu software de cartuchos. Esses cartuchos contêm código que é executado nativamente no Game Boy.

Emuladores são uma camada que permite que o software projetado para uma plataforma seja executado em outra. Por exemplo, há emuladores que podem executar imagens de cartuchos do Game Boy e permitir que você jogue jogos do Game Boy no seu computador ou até mesmo no seu celular.

Uma camada de compatibilidade é como um emulador. Quando computadores de 64 bits e sistemas operacionais se tornaram mainstream, eles precisavam ser compatíveis com as tecnologias de 32 bits existentes. Como as arquiteturas de 64 bits e 32 bits são muito diferentes, geralmente é necessária uma camada de compatibilidade para executar o software de 32 bits em máquinas de 64 bits. Para as edições de 64 bits do Microsoft Windows, a Microsoft precisava criar uma camada de compatibilidade para que os programas de 32 bits ainda funcionassem no novo sistema de 64 bits. É por isso que alguns programas geralmente são instalados em uma pasta chamada Program Files (x86) , onde x86 significa "32 bits".

As camadas de compatibilidade tendem a ser mais íntimas do sistema nativo do que os emuladores. VirtualBox emula hardware para sistemas operacionais * , e os sistemas que ele emula não tem muita interação direta com o sistema host. WoW64 é uma camada de compatibilidade porque permite que programas de 32 bits sejam executados no Windows de 64 bits de uma forma mais integrada. O WoW64 ajuda a tornar os programas compatíveis em vez de emulá-los em um ambiente isolado.

Uma biblioteca de tradução é um componente das camadas de compatibilidade. Sempre que o código binário está sendo executado de maneira não nativa, uma biblioteca de tradução ajuda a redirecionar chamadas externas, não nativas, para chamadas nativas que o sistema possa entender. Os programas de montagem escritos para a TI-83 original podem não ser compatíveis com as novas calculadoras TI-83/84 Plus porque algumas chamadas que fazem sentido na arquitetura da TI-83 podem já não ser válidas na TI-83/84 +. Uma biblioteca de tradução (provavelmente incluída em shells como MirageOS ) garante que as chamadas para o TI 83 vá para os novos locais actualizados nas calculadoras TI-83/84 +.

O código independente de plataforma é escrito em uma linguagem que é interpretada por algo que normalmente é executado nativamente. Por exemplo, o PHP é uma linguagem de programação que é interpretada e executada pelo binário do PHP instalado, que já foi compilado nativamente para sistemas operacionais baseados em Windows, Mac e Unix. O código PHP que os web scripters escrevem é independente da plataforma, permitindo que o código funcione em vários sistemas operacionais, desde que o PHP esteja instalado para esses sistemas operacionais.

Diversos

Correções

* Obrigado, Michael Kjörling , por pegando alguns problemas com esta resposta .

Outro

A diferença entre "nativo" e "não nativo" é não preto e branco . (Créditos para afrazier )

    
por 16.04.2013 / 05:16
4

O código nativo é normalmente usado como oposto ao código independente de plataforma. Se você executar um software nativo, estará executando um binário compilado e não, por exemplo, um script independente de plataforma, como o javascript ou o bytecode Java. C compilado ou C ++ compilado são bons exemplos de código nativo.

    
por 16.04.2013 / 05:12
3

Existem surpreendentemente algumas possíveis respostas, mas o padrão geralmente é: código compilado para os opcodes para a CPU, e rodando contra as bibliotecas de programação do sistema operacional que inicializou o computador. Nesse caso, a maioria dos códigos que você executa será código nativo. Talvez alguns contra-exemplos resolvam as coisas.

Java não é um código nativo. É compilado para um bytecode intermediário, que é então executado no chipset específico. Java pode chamar código nativo. O Eclipse é um ótimo exemplo - para velocidade, o Java chama algumas chamadas gráficas nativas da plataforma.

Se você executar o WINE , um emulador de API do MS Windows, isso não é código nativo. Embora você esteja executando um código projetado para esse chipset (x86), você não está executando o código para o sistema operacional que o inicializou, mas para as bibliotecas de substituição. MAME executa binários para diferentes CPUs e sistemas operacionais.

Scripts não são códigos nativos. Eles são escritos em uma linguagem de nível mais alto que então tem que ser convertida em tempo de execução para o código que roda na sua CPU.

Existem algumas linhas borradas. Seu navegador da Web é executado como código nativo, mas também pode executar Java (compilado para bytecode) ou Javascript (uma linguagem interpretada por script).

    
por 16.04.2013 / 05:33
3

Depende muito do contexto. Para mim, "nativo" significa que um aplicativo usa os recursos e mecanismos que o sistema operacional fornece, em vez de rolar os seus próprios. Isso pode ser aplicado a recursos da interface do usuário (botões, janelas, caixas de diálogo de seleção de arquivos), bem como a recursos internos (por exemplo, integração com "Abrir com ...").

Por exemplo, no Windows, um aplicativo nativo usaria "WinAPI" para obter os mesmos botões, barras de rolagem etc. como outros aplicativos. Eles se comportam exatamente da mesma forma em aplicativos do sistema (bloco de notas) e em aplicativos nativos de terceiros.

Os aplicativos Java costumam usar o "Swing" e parecem completamente diferentes, porque eles mesmos desenham seus controles, em vez de usar os controles do sistema. O benefício é que o programa parece o mesmo em todos os sistemas operacionais.

Outra opção para criar uma GUI é um kit de ferramentas de plataforma cruzada, como "QT". O QT pedirá ao SO para desenhar os controles para ele, então eles devem parecer muito nativos, não importa se você está executando o Windows, OSX ou Linux. Uma caixa de texto QT será semelhante a uma caixa de texto do Windows, no entanto, não é exatamente uma nativa, mas sim uma espécie de emulação. Você pode notar pequenas diferenças nos detalhes (por exemplo, o menu de contexto, métodos de entrada, etc.).

Note que quando as pessoas dizem "nativo", elas geralmente significam que um programa é compilado em código de máquina em vez de em um código intermediário, que é executado em uma máquina virtual (como programas Java e .NET). Nos exemplos acima, o WinAPI e o aplicativo QT estão usando o código da máquina, enquanto o programa Java é compilado para o bytecode do Java. Esse uso é um pouco problemático hoje em dia, porque muitos usuários considerariam um aplicativo .NET bem feito nativo para Windows - é apenas um .exe, usa exatamente os mesmos controles e APIs sob o capô, e é quase indistinguível de um programa compilado para código de máquina.

Da mesma forma, eu consideraria um programa que usa o GTK, conhece a estrutura do sistema de arquivos Unix e talvez venha em um pacote .deb nativo para o Ubuntu ou o Gnome. Há até mesmo aplicativos Gnome de primeira parte escritos em javascript que se pode chamar de nativo! O mesmo se aplica aos aplicativos do Windows 8 "Metro", que podem ser escritos em uma variedade de idiomas, alguns compilados, outros não.

    
por 16.04.2013 / 15:50
2

Para colocar termos mais abstratos, é como permitir que outra pessoa confie em um programa em um idioma diferente.

  • Nativo significa que o SO usará o dialeto mais rápido e simples que ele conhece, binário.

    Prós: disponibilidade rápida e ampla de idiomas que podem se comunicar entre si desde o começo até o metal. Contras: segurança, API complexa, restrita a capacidades do SO, também compiladores são difíceis de fazer, porque um programa, uma vez compilado, é liberado na natureza.

  • Não nativo, significa que seu código não será executado diretamente pelo sistema operacional. Ele pode ser executado de muitas maneiras diferentes, sendo as principais interpretadas e executando uma versão de bytecode do seu programa em uma máquina virtual.

    Prós: a API quase sempre muda, por isso é muito mais fácil para os programadores trabalharem (pelo menos quando se atêm a esse idioma em particular). Desvantagens: desempenho (geralmente é uma diminuição moderada, raramente pode se tornar um problema), e nem todos usarão essa linguagem em particular, então também pode ser um problema adotar essa tecnologia. A segurança também pode ser um problema, mas é muito mais sub-controle. De alguma forma.

por 16.04.2013 / 14:54