2010-11-20 21 views
15

Se dice que al usar C/C++, uno puede escribir programas 'nativos', que se ejecutan en la plataforma. Estoy confundido acerca de lo que se considera nativo: ¿la arquitectura del procesador o la versión del sistema operativo?¿Estoy codificando para un sistema operativo o el procesador?

Por ejemplo:

tengo un procesador de 32 bits y Windows 7 (32 bits), y compilo y generar y archivo .exe. ¿Está garantizado para ejecutarse en cualquier Windows 7 32 Bit? (Win 7 32 bit en máquinas de 32/64 bits)

Edit1: No pretendía solo el sistema operativo Windows aquí. Mi ejemplo también se puede extender a Linux. Por ejemplo, generar un archivo ejecutable (de manera predeterminada a.out) en un sistema operativo Linux de 32 bits que se ejecuta en un procesador de 32 bits y luego ejecutarlo en un Linux de 32 bits en un procesador de 64 bits.

Edit2: Gracias por las respuestas, pero también tenía la intención de utilizar las bibliotecas y funciones estándar, nada específico del sistema operativo. Solo una vez especificado por el estándar ANSI o ISO C++. No hay referencias a sistemas de ventanas específicos del sistema operativo u otras bibliotecas. Gracias

Respuesta

20

Ambos; mas o menos.

Las instrucciones reales no difieren realmente en Windows y Linux, ya que están compiladas para una única arquitectura de CPU (x86).

Sin embargo, un código binario es más que solo código que se ejecuta en hardware desnudo. Por ejemplo, también contiene información que le dice al sistema operativo cómo cargar el ejecutable y sus dependencias. El binario está empaquetado en un formato específico. Este formato puede ser diferente en diferentes sistemas operativos.

Además de eso, el sistema operativo proporciona algunos servicios a las aplicaciones (a través de llamadas al sistema y API). Los servicios que proporcionan los sistemas operativos y la forma en que se pueden usar varían de un sistema operativo a otro.

Estas razones contribuyen al hecho de que la mayoría de las veces un binario nativo depende de la arquitectura del sistema operativo y la CPU para la que está compilado.


respuesta a la pregunta de actualización:

C++ estándar no requiere nada sobre la naturaleza del objetivo compilado. Simplemente especifica los requisitos de compatibilidad en el nivel de origen. En consecuencia, si se apega a las bibliotecas estándar, podrá utilizar el mismo código fuente para compilar en plataformas que ofrecen una implementación conforme a C++. El estándar no dice nada sobre la portabilidad binaria.Como mencioné anteriormente, las llamadas primitivas al sistema que proporcionan los sistemas operativos pueden variar y la implementación real de la biblioteca estándar depende de la forma en que el sistema operativo proporcione esas llamadas al sistema.

Para ejecutar un binario de Windows en Linux, necesita usar algún tipo de emulación como Wine que entienda el formato binario de Windows y simule la API de Windows para las aplicaciones.

+3

+1 para explicar la diferencia entre * codificación * y * compilación para * una plataforma. –

+0

+1 para referirse a la "compatibilidad binaria". Pero no me refiero a la compatibilidad binaria multiplataforma: me refería a los binarios de Windows en los binarios de Windows y Linux en Linux (aunque en arquitecturas diferentes, como el sistema operativo de 32 bits en 32/64 y otras arquitecturas) – Sekhar

+0

@ user331225: para dos arquitecturas distintas , el código generado será diferente. Tenga en cuenta que x86-64 es solo una extensión de x86 y no es una arquitectura fundamentalmente diferente. Es por eso que las aplicaciones de 32 bits x86 se pueden ejecutar en x86-64. Está diseñado para ser compatible con x86. Para dejar en claro el punto, no puede ejecutar binarios Linux/ARM de 32 bits en Linux/x86 de 32 bits. –

2

1) la arquitectura del procesador (además de las bibliotecas dirigidas estáticas o dinámicas)

2) Sí

una aplicación de Windows de 32 bits se ejecutará en una plataforma de 64 bits de Windows como WOW.

1

Si su arquitectura de destino del compilador (Windows) es x86 (32 bits), puede ejecutarse en cualquier Windows 7 de 32 bits y 64 bits. Pero si es x86-64, solo se ejecutará en Windows 7 de 64 bits.

+0

¿Windows no se ejecuta en otra cosa que no sea x86/x86-64? – tobyodavies

+0

@tobyodavies más bien depende de si incluye Windows NT (DEC Alpha), Windows Phone 7 (ARM Cortex 7), Windows Embedded (x86, ARM, SuperH (que nunca antes había escuchado)) –

+0

... y Windows CE funciona en MIPS también. –

1

Para responder específicamente al título, codifica ambos.

El archivo ejecutable contiene código de máquina, que es específico del procesador, y una gran cantidad de metadatos para el sistema operativo sobre cómo cargar/ejecutar el programa, que es específico para el sistema operativo.

El código también puede (y normalmente lo hace) contener llamadas en funciones definidas por el sistema operativo. Y entonces, si bien es un código de máquina perfectamente normal que cualquier CPU compatible entenderá, intenta llamar al código que solo existe en Windows.

Así que "nativo" realmente significa ambos. Usted codifica para el sistema operativo específico (y todos los sistemas operativos compatibles) y esa CPU específica (y todas las CPU compatibles).

En el caso de Windows, normalmente se dirige a una versión específica de Windows, y el programa entonces trabajará en eso y en las versiones futuras de Windows.

para el procesador en el que funciona con Windows (y su programa), el ejecutable contiene el código máquina x86, que se puede ejecutar en cualquier CPU x 86, si se trata de Intel, AMD, Vía o cualquier otro que se han hecho compatibles procesadores a lo largo de los años.

0

Sin poder ver su código, solo usted puede decirnos si está codificando para una plataforma de 32 bits o de 64 bits; por ejemplo, si reinterpreta un puntero a 32 bits int y luego a un puntero , está codificando para 32 bits, mientras que si usa un tipo como int_ptr, está seguro si su código está compilado para máquinas de 32 o 64 bits. Del mismo modo, la codificación de los escritorios de Windows su codificación puede asumir endianes de la máquina.

Si, como en su ejemplo, compila que codifica para Windows 7 de 32 bits, entonces también se ejecutará en Windows 7 de 64 bits. Si utiliza las características de Windows 7, no se ejecutará en versiones anteriores . Microsoft es muy bueno en compatibilidad con versiones anteriores, por lo que probablemente se ejecutará en versiones posteriores.

0

Respuesta corta: No.

más larga: Cuando se compila "código nativo", se compila para una arquitectura de procesador específico; MIPS, ARM, x86, 68k, Sparc, etc. Estas arquitecturas pueden tener una longitud de palabra de 8, 16, 32 y 64 (hay excepciones). También estas arquitecturas pueden tener extensiones de generación en generación como MMX, SSE, SSE2, Neon y demás.

También debe tener en cuenta el sistema operativo y las bibliotecas que puede usar, y las diferentes convenciones de llamadas.

Por lo tanto, no hay ninguna garantía. Pero si compila con MSVC en Windows 7 es casi garantizado para ejecutarse en Windows 7. Creo que solo existe para x86 en este momento.

Cuestiones relacionadas