¿Qué significa que el software se ejecute de forma nativa?

27

Me he estado preguntando qué significa que el software se ejecute de forma nativa. ¿Qué es exactamente ese software y en qué se diferencia del software que no se ejecuta de forma nativa? ¿Cómo puedo saber si una determinada porción de software se ejecutará de forma nativa en mi computadora? ¿Es probable que ya haya software en mi computadora que se ejecute de forma nativa?

Throsby
fuente
2
"native" implica que está diseñado para ejecutarse en cualquier plataforma / os en la que se encuentre
yuritsuki
Yo tampoco ... parece que los moderadores tienen dificultades para leer las preguntas ...
55
@faB ¿Te das cuenta de que ningún moderador estuvo involucrado en cerrar la pregunta?
slhck
Admito que el título de la pregunta me hizo pensar en la diferencia entre ejecutar un "programa" en un "sistema operativo" o en el propio procesador (por ejemplo, acceso directo al hardware).
Avance
No es que la pregunta sea mala per se, pero no es buena para este sitio. Como lo demuestran las respuestas, no es algo que pueda responderse limpiamente y tiene una serie de argumentos que lo rodean, lo que hace que su cierre sea completamente apropiado de acuerdo con las preguntas frecuentes.
Afrazier

Respuestas:

43

Un software es nativo de una plataforma si fue diseñado para ejecutarse en esa plataforma.

Una plataforma generalmente se refiere a un sistema operativo, pero también se puede aplicar a dispositivos como Nintendo Game Boy.

Usando Game Boy como ejemplo, obtiene su software de cartuchos. Estos cartuchos contienen código que se ejecuta de forma nativa en Game Boy.

Los emuladores son una capa que permite que el software diseñado para una plataforma se ejecute en otra. Por ejemplo, hay emuladores que pueden ejecutar imágenes de cartuchos de Game Boy y le permiten jugar juegos de Game Boy en su computadora o incluso en su teléfono móvil.

Una capa de compatibilidad es como un emulador. Cuando las computadoras y los sistemas operativos de 64 bits se volvieron convencionales, debían ser compatibles con las tecnologías existentes de 32 bits. Como las arquitecturas de 64 y 32 bits son muy diferentes, a menudo se necesita una capa de compatibilidad para ejecutar software de 32 bits en máquinas de 64 bits. Para las ediciones de 64 bits de Microsoft Windows, Microsoft necesitaba escribir una capa de compatibilidad para que los programas de 32 bits siguieran funcionando en el nuevo sistema de 64 bits. Es por eso que algunos programas a menudo se instalan en una carpeta llamada Program Files (x86), donde x86significa "32 bits".

Las capas de compatibilidad tienden a ser más íntimas con el sistema nativo que los emuladores. VirtualBox emula hardware para sistemas operativos * , y los sistemas que emula no tienen mucha interacción directa con el sistema host. WoW64 es una capa de compatibilidad, ya que permite que los programas de 32 bits se ejecuten en Windows de 64 bits de una manera más integrada. WoW64 ayuda a hacer que los programas sean compatibles en lugar de emularlos en un entorno aislado.

Una biblioteca de traducción es un componente de las capas de compatibilidad. Cada vez que el código binario se ejecuta de forma no nativa, una biblioteca de traducción ayuda a redirigir las llamadas extranjeras no nativas a las llamadas nativas que el sistema puede entender. Los programas de ensamblaje escritos para la TI-83 original podrían no ser compatibles con las calculadoras TI-83/84 Plus más nuevas porque algunas llamadas que tenían sentido en la arquitectura de la TI-83 ya no son válidas en la TI-83/84 +. Una biblioteca de traducción (probablemente incluida en shells como MirageOS ) asegura que las llamadas para la TI-83 vayan a los lugares nuevos y actualizados en las calculadoras TI-83/84 +.

El código independiente de la plataforma está escrito en un lenguaje interpretado por algo que generalmente se ejecuta de forma nativa. Por ejemplo, PHP es un lenguaje de programación que es interpretado y ejecutado por el binario PHP instalado, que ya ha sido compilado de forma nativa para Windows, Mac y sistemas operativos basados ​​en Unix. El código PHP que escriben los guionistas web es independiente de la plataforma, lo que permite que el código funcione en múltiples sistemas operativos siempre que PHP esté instalado para esos sistemas operativos.


Diverso

Correcciones

* Gracias, Michael Kjörling , por detectar algunos problemas con esta respuesta .

Otro

La diferencia entre "nativo" y "no nativo" no es en blanco y negro . (Créditos a un afrazier )

Deltik
fuente
3
Nitpick menor: (es VirtualBox, no VirualBox, y) VirtualBox no emula el sistema operativo, emula el hardware . Por lo tanto, puede instalar cualquier sistema operativo que desee en VirtualBox (sujeto a limitaciones de virtualización), o incluso escribir el suyo desde cero.
un CVn
1
Native también a menudo implica que está utilizando el conjunto de la biblioteca primaria y la API para la plataforma subyacente, lo que puede hacer que las distinciones sean un poco confusas. Hay bastantes personas que no consideran que las aplicaciones .NET sean "nativas" como las aplicaciones API Win32 son "nativas", y de manera similar algunas personas no consideran que un programa KDE que se ejecuta en un escritorio Gnome sea "nativo".
Afrazier
@afrazier: Esto se debe a que las aplicaciones .NET están diseñadas para ejecutarse en el "Common Language Runtime" y necesitan una capa de compatibilidad para ejecutarse en Windows. O una capa de compatibilidad diferente para ejecutar en Linux.
Ben Voigt
@Ben Voigt: sigue siendo una API propia, los binarios se compilan en código nativo x86 / amd64 (ya sea en tiempo de ejecución por el CLR o por adelantado con ngen), y el marco se ha enviado con versiones recientes de Windows. Sin embargo, esto es parte de un argumento más amplio, y no es realmente apropiado aquí.
Afrazier
Virtual Box no es técnicamente un emulador sino un virtualizador. Un emulador de tiempos pasados ​​siempre ha emulado hardware completamente diferente. Bajo un virtualizador, el sistema operativo y el software realmente se ejecutan de forma nativa en la CPU del host. La diferencia es que los dispositivos son virtuales o emulados. Es una pequeña diferencia técnica que incluso el sitio web de Virtual Box señala aquí: virtualbox.org/wiki/Virtualization
Matt H
4

El código nativo generalmente se usa como opuesto al código independiente de la plataforma. Si ejecuta software nativo, está ejecutando un binario compilado y no, por ejemplo, una secuencia de comandos independiente de la plataforma, como JavaScript o Java bytecode. C compilado o C ++ compilado son buenos ejemplos de código nativo.

Niklas Rosencrantz
fuente
3

Sorprendentemente, hay un par de posibles respuestas, pero el estándar generalmente es: código compilado en los códigos de operación para la CPU y que se ejecuta contra las bibliotecas de programación del sistema operativo que arrancó la computadora. En este caso, la mayoría del código que ejecute será código nativo. Quizás algunos contraejemplos aclaren las cosas.

Java no es código nativo. Se compila en un bytecode intermedio, que luego se ejecuta en el conjunto de chips específico. Java puede llamar a código nativo. Eclipse es un gran ejemplo: para la velocidad, Java llama a algunas llamadas de gráficos nativos de la plataforma.

Si ejecuta WINE , un emulador de API de MS Windows, ese no es el código nativo. Aunque está ejecutando código diseñado para ese conjunto de chips (x86), no está ejecutando el código para el sistema operativo que lo inició, sino bibliotecas de reemplazo. MAME ejecuta binarios para diferentes CPU y sistemas operativos.

Las secuencias de comandos no son código nativo. Están escritos en un lenguaje de nivel superior que luego debe convertirse en tiempo de ejecución a código que se ejecuta en su CPU.

Hay algunas líneas borrosas. Su navegador web se ejecuta como código nativo, pero también puede ejecutar Java (compilado en bytecode) o Javascript (un lenguaje interpretado por script).

Rich Homolka
fuente
.NET, VBA, XUL , IA-32 (en CPU AMD64, al menos), ...
un CVn
3

Depende mucho del contexto. Para mí, "nativo" significa que una aplicación utiliza las características y los mecanismos que proporciona el sistema operativo, en lugar de implementar las suyas propias. Esto puede aplicarse a las funciones de la interfaz de usuario (botones, ventanas, cuadros de diálogo de selección de archivos), así como a las funciones ocultas (por ejemplo, integración con "Abrir con ...").

Por ejemplo, en Windows, una aplicación nativa usaría "WinAPI" para obtener los mismos botones, barras de desplazamiento, etc. que otras aplicaciones. Se comportan exactamente igual en las aplicaciones del sistema (bloc de notas) que en las aplicaciones de terceros nativas.

Las aplicaciones Java a menudo usan "Swing" y se ven completamente diferentes, porque dibujan sus controles ellos mismos, en lugar de usar los del sistema. El beneficio es que el programa se ve igual en todos los sistemas operativos.

Otra opción para construir una GUI es un juego de herramientas multiplataforma como "QT". QT le pedirá al sistema operativo que dibuje los controles para él, por lo que deberían verse muy nativos, sin importar si está ejecutando Windows, OSX o Linux. Un cuadro de texto QT se verá como un cuadro de texto de Windows, sin embargo, no es exageradamente nativo, sino una especie de emulación. Puede notar pequeñas diferencias en los detalles (por ejemplo, el menú contextual, los métodos de entrada, etc.).

Tenga en cuenta que cuando las personas dicen "nativo", a menudo significan que un programa se compila en código máquina en lugar de en un código intermedio, que se ejecuta en una máquina virtual (como los programas Java y .NET). En los ejemplos anteriores, la aplicación WinAPI y QT están usando código de máquina, mientras que el programa Java está compilado en código de bytes Java. Este uso es un poco problemático hoy en día, porque muchos usuarios considerarían una aplicación .NET nativa bien hecha para Windows: es solo un archivo .exe, usa exactamente los mismos controles y API bajo el capó, y es casi indistinguible de un programa compilado para codigo de maquina.

Del mismo modo, consideraría un programa que usa GTK, conoce la estructura del sistema de archivos Unix y tal vez viene en un paquete .deb nativo para Ubuntu o Gnome. ¡Incluso hay aplicaciones Gnome de primera mano escritas en javascript que uno podría llamar nativas! Lo mismo se aplica a las aplicaciones "Metro" de Windows 8, que se pueden escribir en una variedad de idiomas, algunos compilados, otros no.

jdm
fuente
2

Para ponerlo en términos más abstractos, es como dejar que otra persona de su confianza ejecute un programa en un idioma diferente.

  • Native significa que el sistema operativo utilizará el dialecto más rápido y simple que conoce, binario.

    Pros: disponibilidad rápida y amplia de lenguaje que puede comunicarse entre sí, ya que todo se reduce al metal. Contras: seguridad, API compleja, restringida a las capacidades del sistema operativo, también los compiladores son difíciles de hacer, porque un programa, una vez compilado, se libera en la naturaleza.

  • No nativo, significa que su código no será ejecutado directamente por el sistema operativo. Se puede ejecutar de muchas maneras diferentes, interpretando las principales y ejecutando una versión de bytecode de su programa en una máquina virtual.

    Pros: la API casi siempre cambia, por lo que es mucho más fácil para los programadores trabajar (al menos cuando se apegan a este lenguaje en particular). Contras: rendimiento (a menudo es una disminución leve, rara vez puede convertirse en un problema), y no todos usarán este lenguaje en particular, por lo que también puede ser un problema adoptar esta tecnología. La seguridad también puede ser un problema, pero está mucho más bajo control. De alguna manera.

jokoon
fuente