¿Habría que saber la architecture de la máquina para escribir código?

Digamos que estoy progtwigndo en Java o Python o C ++ para un problema simple, podría ser construir un servidor de eco TCP / UDP o un cálculo de factorial. ¿Tengo que preocuparme por los detalles de la architecture, es decir, si es de 32 o 64 bits?

En mi humilde opinión, a menos que esté progtwigndo algo para hacer con cosas de un nivel bastante bajo, entonces no tengo que preocuparme si es de 32 o 64 bits. ¿A dónde me voy mal? ¿O estoy en lo cierto?

correcto para la mayoría de las circunstancias

El tiempo de ejecución / idioma / comstackdor abstraerá esos detalles a menos que esté tratando directamente con tamaños de palabra o binarios en un nivel bajo.

Incluso el orden de los bytes es abstraído por la stack NIC / Red en el kernel. Está traducido para usted. Al progtwigr sockets en C, a veces tiene que lidiar con el orden de bytes para la red al enviar datos … pero eso no tiene que ver con diferencias de 32 o 64 bits.

Al tratar con blobs de datos binarios, mapearlos de una architecture a otra (como una superposición a una estructura C, por ejemplo) puede causar problemas, como lo han mencionado otros, pero es por eso que desarrollamos protocolos independientes de la architecture basados ​​en caracteres, etc.

De hecho, cosas como Java se ejecutan en una máquina virtual que abstrae la máquina ¡ otro paso!

Conocer un poco sobre el conjunto de instrucciones de la architecture y cómo se comstack la syntax puede ayudarlo a comprender la plataforma y escribir código más claro y más estricto. ¡Sé que hago una mueca en un viejo código C después de estudiar comstackdores!

Saber cómo funcionan las cosas, ya sea cómo funciona la máquina virtual y cómo funciona en su plataforma, o cómo ciertas construcciones de C ++ se transforman en ensamblados siempre lo convertirá en un mejor progtwigdor, porque comprenderá por qué se deben hacer las cosas de la manera correcta. son.

Necesita comprender cosas como la memoria para saber qué son las faltas de caché y por qué podrían afectar su progtwig. Debe saber cómo se implementan ciertas cosas, aunque solo use una interfaz o una forma de alto nivel para llegar a ella, saber cómo funciona se asegurará de que lo esté haciendo de la mejor manera.

Para el trabajo con paquetes, debe comprender cómo se almacenan los datos en las plataformas y cómo enviarlos a través de la red a una plataforma diferente puede cambiar la forma en que se leen los datos (endian-ness).

Su comstackdor hará un mejor uso de la plataforma en la que está comstackndo, de modo que siempre que se adhiera a los estándares y al código, puede ignorar la mayoría de las cosas y asumir que el comstackdor sacará lo mejor.

Así que en definitiva, no. No necesitas saber las cosas de bajo nivel, pero nunca está de más saber .

La última vez que miré la especificación del lenguaje Java, contenía un ridículo gotcha en la sección de boxeo de enteros.

Integer a = 100; Integer b = 100; System.out.println(a == b); 

Eso está garantizado para imprimir la true .

 Integer a = 300; Integer b = 300; System.out.println(a == b); 

Eso no está garantizado para imprimir la true . Depende del tiempo de ejecución. La especificación lo dejó completamente abierto. Es porque boxear un int entre -128 y 127 devuelve objetos “internados” (de manera análoga a la forma en que se internan los literales de cadenas), pero se recomienda al implementador del tiempo de ejecución del idioma que aumente ese límite si lo desea.

Personalmente, considero que es una decisión insana, y espero que lo hayan solucionado desde entonces (¿escribir una vez, ejecutar en cualquier lugar?)

A veces debes molestarte.

Puedes sorprenderte cuando estos detalles de bajo nivel de repente saltan y te muerden. Por ejemplo, Java estandarizó el double a 64 bit. Sin embargo, Linux JVM utiliza el modo de “precisión extendida”, cuando el doble es de 80 bits, siempre y cuando esté en el registro de la CPU. Esto significa que el siguiente código puede fallar:

 double x = fun1(); double y = x; System.out.println(fun2(x)); assert( y == x ); 

Simplemente porque y se fuerza fuera del registro en la memoria y se trunca de 80 a 64 bits.

En Java y Python, los detalles de la architecture se extraen para que de hecho sea más o menos imposible escribir código dependiente de la architecture.

Con C ++, este es un asunto completamente diferente: ciertamente puede escribir código que no dependa de los detalles de la architecture, pero debe tener cuidado para evitar escollos, específicamente en relación con los tipos de datos básicos que dependen de la architecture, como int .

Mientras haga las cosas correctamente, casi nunca necesita saber para la mayoría de los idiomas. En muchos casos, nunca necesita saberlo, ya que el comportamiento del idioma no varía (Java, por ejemplo, especifica el comportamiento del tiempo de ejecución con precisión).

En C ++ y C, hacer las cosas correctamente incluye no hacer suposiciones sobre int. No coloque punteros en int, y cuando esté haciendo algo con tamaños de memoria o direcciones use size_t y ptrdiff_t. No cuente con el tamaño de los tipos de datos: int debe tener al menos 16 bits, casi siempre es de 32 y puede ser de 64 en algunas architectures. No asum que la aritmética de punto flotante se realizará exactamente de la misma manera en diferentes máquinas (los estándares IEEE tienen cierto margen de maniobra).

Casi todos los sistemas operativos que admiten redes te darán alguna forma de lidiar con posibles problemas de endianness. Usalos, usalos a ellos. Use las instalaciones del lenguaje como isalpha () para clasificar los caracteres, en lugar de operaciones aritméticas en los caracteres (lo que podría ser algo extraño como EBCDIC). (Por supuesto, ahora es más habitual usar wchar_t como tipo de carácter y usar Unicode internamente).

Si está progtwigndo en Python o en Java, el intérprete y la máquina virtual, respectivamente, abstraen esta capa de la architecture. Entonces no debe preocuparse si se está ejecutando en una architecture de 32 o 64 bits.

No se puede decir lo mismo para C ++, en el que tendrá que preguntarse a veces si está ejecutando en una máquina de 32 o 64 bits.

Tendrá que preocuparse por la “endiancia” solo si envía y recibe estructuras C en bruto a través del cable como

 ret = enviar (socket, & myStruct, sizeof (myStruct));

Sin embargo, esto no es una práctica recomendada.

Se recomienda que defina un protocolo entre las partes, ya que no importa la architecture de la máquina de las partes.

En C ++, debe tener mucho cuidado si desea escribir código que funcione indistintamente en 32 o 64 bits. Muchas personas asumen erróneamente que int puede almacenar un puntero, por ejemplo.

Con java y .net, realmente no tienes que preocuparte por ello a menos que estés haciendo cosas de muy bajo nivel, como los bits de twiddling. Si estás usando c, c ++, fortran, podrías arreglártelas, pero te recomendaría usar cosas como “stdint.h” donde usas declaraciones definitivas como uint64_t y uint32_t para que sean explícitas. Además, tendrá que comstackr con bibliotecas en particular, dependiendo de cómo se vincule, por ejemplo, un sistema de 64 bits puede usar gcc en un modo de comstackción predeterminado de 64 bits.

Una máquina de 32 bits le permitirá tener un máximo de 4 GB de memoria virtual direccionable. (En la práctica, es incluso menos que eso, generalmente 2 GB o 3 GB según el sistema operativo y las distintas opciones de enlace). En una máquina de 64 bits, puede tener un GRAN espacio de direcciones virtuales (en el sentido práctico, limitado solo por disco). ) y una memoria RAM bastante grande.

Entonces, si está esperando conjuntos de datos de 6 GB para algunos cálculos (digamos algo que necesita un acceso incoherente y no se puede transmitir un poco a la vez), en una architecture de 64 bits, simplemente puede leerlos en la memoria RAM y hacer sus cosas. mientras que en una architecture de 32 bits necesita una forma fundamentalmente diferente de abordarla, ya que simplemente no tiene la opción de mantener el conjunto de datos completo como residente.