2010-09-02 20 views
6

¿Cuáles son todos los aspectos que deben tenerse en cuenta al diseñar su software en un entorno de 64 bits, y por qué el mismo código no funcionaría como 32 bits y 64 bits (cuando se habla de aplicaciones)?¿Por qué es tan difícil hacer versiones de software de 64 bits?

Los controladores obviamente son una bestia diferente, los controladores de 64 bits que faltan son un problema infame para casi todo el hardware. ¿Qué hay de diferente en ese dominio que es casi imposible encontrar controladores?

¿Por qué es tan difícil hacer versiones de 64 bits del software?

Editar: Olvidemos los defectos básicos del viejo software con errores con números mágicos, etc. y creo que creará el software usted mismo, para ser compatible con ambos. ¿Qué aspectos necesita tener en cuenta, y hay cosas que simplemente no puede superar con el diseño actual del compilador? ¡Todo el software de 64 bits que falta no puede ser simplemente porque a la gente le gusta el código con números mágicos! :)

Conclusión: Parece ser todo sobre la pereza humana y razones históricas, en lugar de razones técnicas.

+1

Debe ser más específico si quiere una buena respuesta. Por ejemplo, es insensato hacer versiones de 64 bits de aplicaciones .NET - configurarlo para compilar como Cualquier CPU o x64. Entonces, obviamente, no estás hablando de aplicaciones .NET, pero ¿de qué estás hablando? :) –

+0

Pregunto en general cuál es el motivo técnico que aparentemente imposibilita el uso de la misma base de código exacta para compilar aplicaciones de 32 bits y de 64 bits. Dado que si fuera solo una recompilación, todas las bibliotecas también estarían disponibles como de 64 bits, etc., y todas las aplicaciones podrían volver a compilarse a 64 bits, es decir. No hay problema. – Tuminoid

+1

"Todo el software de 64 bits que falta no puede ser simplemente porque a la gente le gusta el código con números mágicos?" - podría faltar mucho software de 64 bits porque no es necesario. Alguien por favor corrígeme si me equivoco, pero la regla de oro que he escuchado es que, a menos que esté abordando potencialmente más de 4 GB de memoria, debe compilar como 32 bits. –

Respuesta

14

Una razón específica por la que esto puede ser difícil es que los tamaños de los punteros serán diferentes. En lugar de un puntero ocupando 32 bits, un puntero ahora ocuparía 64 bits.

eso es un problema si el software en algún lugar calzadores un puntero en un int a través de un reinterpret_cast en C++ (que puede ocurrir en algún código de nivel muy bajo), y pasó a trabajar debido a que el tamaño de un int y un puntero fuera el mismo tamaño. Básicamente, el código asumió un cierto tamaño para un puntero.

Otra forma en que puede tragarse es si el código está llena de números mágicos como 4 en lugar de sizeof(void*), o en lugar de 0xffffffffINT_MAX o algo similar.

Puede que no haya una versión de 64 bits de un software si depende de una biblioteca o una función que no está disponible en 64 bits. No puede tener una aplicación que sea parte 32 bits y 64 bits. Por ejemplo, en Windows, hay una función llamada SetWindowLong que solo acepta 32 bits de datos, por lo que no es muy útil para los programas de 64 bits si es necesario pasar un puntero a la función. Es por eso que hay una función llamada SetWindowLongPtr que puede manejar hasta 64 bits en programas de 64 bits y 32 bits en programas de 32 bits.

Tenga en cuenta que Internet Explorer se ejecuta en 32 bits de manera predeterminada, incluso en ventanas de 64 bits, porque una gran mayoría de los complementos están disponibles solo en 32 bits. Un gran ejemplo de esto es the Adobe Flash Player, que está disponible solo en 32 bits. Entonces, aparentemente, incluso para una gran compañía como Adobe, la migración a 64 bits puede no ser siempre trivial.

Operaciones de cambio de posición pueden verse afectadas. Por ejemplo, el cambio de bit 0x80000 dejado 10 veces en 32 bits le da 0x0, pero el cambio de bit 0x80000 queda 10 veces en 64 bits, lo que le da 0x200000000.

Dicho todo esto, no hay una razón técnica real por la que es demasiado difícil portar una aplicación a 64-bits si el código fue escrito bien. El mejor de los casos es que una reconfiguración simple del proyecto y una reconstrucción completa es todo lo que se necesita.

El lado cínico de mi parte dice que las empresas usan esto como una forma de implementar la obsolescencia planificada: ¡forzar o alentar a las personas a actualizar o comprar los productos más nuevos!

+0

¿Pero por qué es eso un problema? ¿No debería saber el compilador mejor? – Tuminoid

+1

Sí lo hace, pero si el código usa 'reinterpret_cast', el compilador no emitirá un diagnóstico (razón por la cual el encasillado debe hacerse con cuidado). –

+0

Y estoy hablando de un software de calidad razonable que no está lleno de números mágicos, etc. Si es útil, piense en crear software para ser compatible en ambos mundos. – Tuminoid

3

El software razonablemente escrito suele ser muy fácil de trasladar a otra arquitectura. Basta con mirar NetBSD, Debian u otros grandes sistemas operativos gratuitos ... un montón de software de código abierto funciona en más de dos arquitecturas.

El problema es que muchísimos programas están escritos sin tener en cuenta las buenas prácticas. Hacer que "eso" funcione suele ser lo único que piensa el programador típico, sin tener en cuenta otros problemas. La explicación típica es: ¿por qué molestarse con las buenas prácticas si el cliente no ve el código y funciona? ¿Por qué dedicar más tiempo a algo que ya funciona?

Los controladores son ligeramente diferentes aquí. Diferentes arquitecturas pueden manejar cosas de bajo nivel de diferentes maneras. x86 y amd64 en Windows tienen otro problema: Microsoft establece estándares más estrictos para los controladores amd64 - las empresas de hardware no se molestan en producir controladores para hardware antiguo que cumple con requisitos más estrictos (una vez más: ¿por qué preocuparse ?, el cliente ya compra hardware nuevo con su nuevo Cajas de 64 bits, y si no lo hace, lo haremos hacer de todos modos al no proporcionar controladores). De nuevo, los controladores de fuente abierta a menudo funcionan tanto en amd64 como en x86.

Tengo una tarjeta de sonido que funciona bastante bien en los sistemas x86 y amd64 en Linux, pero no funciona con Windows amd64 exactamente debido a este problema. Por lo tanto, no fue imposible escribir un controlador para amd64; la compañía de hardware simplemente no quería.

Entonces, la mejor respuesta a su pregunta es: dinero.

+0

Tengo una impresora láser color Canon de 6 meses de antigüedad y no me proporcionaron drivers de 64 bits, un gran dolor en el ***. Entonces, comprar nuevo hardware no proporciona felicidad ... – Tuminoid

4

La versión de cáscara de nuez: en la familia más popular de idiomas - C y sus hijos - el tamaño y la estructura de los tipos de datos es muy importante y implementación definida. De hecho, C tiene muchas funciones dependientes de la implementación. Esto significa que es fácil escribir código no portátil. No es imposible escribir código que no haga suposiciones sobre la arquitectura subyacente, pero es muy fácil depender de comportamientos específicos de x86 sin darse cuenta de lo que has hecho hasta que intentes ejecutar el código en un entorno diferente.

Son principalmente estas características de bajo nivel las que dificultan la independencia de la arquitectura. En lenguajes de nivel superior como Python y C#, es mucho más fácil.

Cuestiones relacionadas