O que significa para o software ser executado nativamente?


27

Fiquei me perguntando o que significa para o software ser executado nativamente. O que exatamente é esse software e como ele é diferente do software que não é executado nativamente? Como posso saber se um determinado pedaço de software será executado nativamente no meu computador? É provável que já exista um software no meu computador que execute nativamente?


2
"nativo" implica que é projetado para rodar em qualquer plataforma / os é sobre
yuritsuki

Nem eu ... parece que os moderadores têm um tempo difícil de ler perguntas ...

5
@faB Você percebe que nenhum moderador esteve envolvido no fechamento da pergunta?
amigos estão dizendo sobre slhck

Admito que o título da pergunta me fez pensar na diferença entre executar um "programa" em um "sistema operacional" ou no próprio processador (por exemplo, acesso direto ao hardware).
precisa

Não é que a pergunta seja ruim por si só, mas não é boa para este site. Como evidenciado pelas respostas, não é algo que possa ser respondido de maneira limpa e tenha vários argumentos em torno dele, o que torna seu fechamento totalmente apropriado de acordo com as Perguntas frequentes.
afrazier

Respostas:


43

Um software é nativo de uma plataforma se ele foi projetado para ser executado 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.

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

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

As camadas de compatibilidade tendem a ser mais íntimas com o sistema nativo do que os emuladores. O VirtualBox emula hardware para sistemas operacionais * , e os sistemas que ele emula não têm muita interação direta com o sistema host. O WoW64 é uma camada de compatibilidade, pois permite que programas de 32 bits sejam executados no Windows de 64 bits de uma maneira 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 forma não nativa, uma biblioteca de tradução ajuda a redirecionar chamadas estrangeiras e não nativas para chamadas nativas que o sistema pode entender. Os programas de montagem criados para a TI-83 original podem não ser compatíveis com as calculadoras TI-83/84 Plus mais recentes, porque algumas chamadas que faziam sentido na arquitetura da TI-83 podem não ser mais válidas na TI-83/84 +. Uma biblioteca de tradução (provavelmente incluída em shells como o MirageOS ) garante que as chamadas para a TI-83 vão para os novos locais atualizados nas calculadoras TI-83/84 +.

Código independente de plataforma é escrito em um idioma que é interpretado por algo que geralmente é executado de forma nativa. Por exemplo, PHP é uma linguagem de programação que é interpretada e executada pelo binário PHP instalado, que já foi compilado nativamente para sistemas operacionais baseados em Windows, Mac e Unix. O código PHP que os scripts da Web 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 , para apanhar alguns problemas com esta resposta .

De outros

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


3
Nitpick menor: (é o VirtualBox, não o VirualBox e) O VirtualBox não emula o sistema operacional, emula o hardware . Assim, você pode instalar qualquer sistema operacional que você gosta no VirtualBox (sujeito a limitações de virtualização) ou até mesmo criar o seu próprio a partir do zero.
um CVn

1
O Native também geralmente implica que está usando o conjunto de bibliotecas primárias e a API para a plataforma subjacente, o que pode fazer distinções um pouco confusas. Existem muitas pessoas que não consideram os aplicativos .NET "nativos", como os aplicativos da API do Win32 são "nativos" e, da mesma forma, algumas pessoas não consideram um programa do KDE em execução na área de trabalho do Gnome "nativo".
afrazier

@afrazier: Isso porque os aplicativos .NET foram projetados para serem executados no "Common Language Runtime" e precisam de uma camada de compatibilidade para serem executados no Windows. Ou uma camada de compatibilidade diferente para executar no Linux.
precisa

@ Ben Voigt: Ainda é uma API primária, os binários são compilados no código x86 / amd64 nativo (seja em tempo de execução pelo CLR ou com antecedência pela ngen), e a estrutura foi fornecida com versões recentes do Windows. Isso faz parte de um argumento maior, e não é realmente apropriado aqui.
afrazier

O Virtual Box não é tecnicamente um emulador, mas um Virtualizador. Um emulador de tempos passados ​​sempre emulou um hardware completamente diferente. Sob um virtualizador, o sistema operacional e o software são executados nativamente na CPU host. A diferença é que os dispositivos são virtuais ou emulados. É uma pequena diferença técnica que até o site da Virtual Box aponta aqui: virtualbox.org/wiki/Virtualization
Matt H

4

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


3

Surpreendentemente, existem algumas respostas possíveis, mas o padrão geralmente é: código compilado nos códigos de operação da CPU e executando nas bibliotecas de programação do sistema operacional que inicializou o computador. Nesse caso, a maioria dos códigos executados será nativa. Talvez alguns contra-exemplos esclareçam as coisas.

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

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

Scripts não são código nativo. Eles são escritos em uma linguagem de nível superior, que deve ser convertida em tempo de execução para o código que é executado na sua CPU.

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


NET, VBA, XUL , IA-32 (em CPUs AMD64, pelo menos), ...
um CVn

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 criar seus próprios. Isso pode ser aplicado aos recursos da interface do usuário (botões, janelas, caixas de diálogo de seleção de arquivos), bem como aos recursos ocultos (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. que outros aplicativos. Eles se comportam exatamente nos aplicativos do sistema (bloco de notas) e nos aplicativos nativos de terceiros.

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

Outra opção para criar uma GUI é um kit de ferramentas multiplataforma, como "QT". O QT solicitará que o sistema operacional desenhe os controles para que ele pareça muito nativo, independentemente de você estar 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 um tipo de emulação. Você pode notar pequenas diferenças nos detalhes (por exemplo, menu de contexto, métodos de entrada etc.).

Observe que quando as pessoas dizem "nativo", geralmente significam que um programa é compilado no código da máquina, e não em um código intermediário, que é executado em uma máquina virtual (como os programas Java e .NET). Nos exemplos acima, o WinAPI e o aplicativo QT estão usando código de máquina, enquanto o programa Java é compilado no bytecode Java. Atualmente, esse uso é um pouco problemático, porque muitos usuários consideram um aplicativo .NET bem feito nativo para Windows - é apenas um .exe, usa exatamente os mesmos controles e APIs ocultos e é quase indistinguível de um programa compilado para Código da máquina.

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


2

Para colocar em termos mais abstratos, é como deixar outra pessoa confiar em executar um programa em um idioma diferente.

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

    Prós: disponibilidade rápida e grande de idiomas que podem conversar entre si, já que tudo se resume ao metal. Contras: segurança, API complexa, restrita aos recursos do sistema operacional, também é difícil criar compiladores, porque um programa, uma vez compilado, é lançado 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 aderem a essa linguagem específica). Contras: desempenho (geralmente é uma diminuição moderada, raramente pode se tornar um problema), e nem todo mundo realmente usa esse idioma específico; portanto, também pode ser um problema adotar essa tecnologia. A segurança também pode ser um problema, mas é muito mais sob controle. De alguma forma.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.