¿Por qué los programadores de computadoras deben estudiar la organización y arquitectura de computadoras?

Depende de qué nivel de ordenador sea usted. No necesitas dominar estos temas en el nivel de entrada. Por otro lado, soy un arquitecto con 25 años de experiencia, por lo que aprovecho el conocimiento profundo de estos temas todos los días. Necesito conocerlos por la misma razón que un médico entiende anatomía y fisiología.

A medida que adquiera más experiencia como programador informático, será promovido a desarrollador senior y luego a arquitecto de software. Los nombres de las posiciones son diferentes por organización, pero se entiende la idea.

Si solo desea que la lógica de un programa de computadora funcione, no hay necesidad de dominar estos temas. Sin embargo, una vez que tenga que agregar seguridad a un programa, compensar el rendimiento y la funcionalidad y, de otro modo, evitar las restricciones y limitaciones impuestas por una computadora, debe saber esto. Eso es lo que hacen los desarrolladores senior.

Cuando diseñe grandes sistemas informáticos o adapte sistemas existentes para satisfacer nuevas necesidades, tendrá que hacer todo tipo de concesiones. Al comprender la organización y la arquitectura de la computadora, podrá visualizar los modelos resultantes de tales compromisos con menos esfuerzo y más precisión de lo que lo haría de otra manera.

Considere una comparación con un médico que tiene que tomar una decisión tal vez para amputar la pierna de un soldado. Sin duda, tiene las habilidades para cortar la pierna, pero querrá evaluar el impacto en otros sistemas corporales antes de continuar y puede intentar salvar la pierna, aplicar un torniquete o rehidratar al paciente primero. Sin las habilidades técnicas profundas, usted es como el tipo que acaba de amputar y no consideró el resultado de fuerzas externas.

Debido a que habrá tiempo en que para depurar un problema, tendrá que entender el hardware.

Déjame dar un ejemplo. Una vez portaba software de las máquinas Sun Sparc a Linux basado en Intel. Una de nuestras pruebas estaba fallando en Linux. Hubo un código que básicamente probó algunos cálculos y se aseguró de que el resultado fuera correcto. Parecía algo como esto:

doble r = some_function (fixed_set_of_arguments)
si (r == 0.12345) {
printf (“pases de prueba”)
}

La función siempre devolvió el mismo valor, por lo que la prueba siempre pasó a los Suns. En Linux falló.

Cuando agregué algo de println para intentar depurarlo, la prueba funcionó.

Cuando deshabilité la prueba de optimización del compilador funcionó.

Entonces, ¿cuál fue el error? Bueno, resulta que cuando el compilador optimizó este código, mantuvo valores temporales en los registros de punto flotante y en los chips de Intel los registros de punto flotante tienen más de 64 bits (tamaño normal de un doble) para permitir una mayor precisión. Entonces, cuando la función calculó el valor, lo mantuvo en un registro y cuando se comparó con la constante, no fueron iguales. Cuando se desactivó la optimización, el registro se almacenó primero en la memoria y los bits adicionales se desecharon dando la respuesta esperada.

Ahora, si no entiende cómo funcionan las computadoras debajo del capó, ¿cómo resolvería este tipo de problema?