¿Por qué el aprendizaje del ‘lenguaje ensamblador y máquina’ se enfatiza menos en las universidades en comparación con el aprendizaje de lenguajes de programación generales?

Las universidades enseñan absolutamente lenguaje ensamblador y máquina, simplemente no se llama programación. La programación es el arte de crear cosas con una computadora y, como tal, se basa en herramientas cercanas al meollo del poder y la abstracción.

Hoy en día esto significa lenguajes en el ámbito Java / python / C ++, que se alinea con las prioridades de la gran mayoría de las universidades.

Aprender hoy no es una habilidad productiva para producir piezas productivas de una computadora. El lenguaje ensamblador / máquina se trata de jugar con una optimización de muy bajo nivel y comprender los beneficios de las diferentes arquitecturas de conjuntos de instrucciones. Esta es una habilidad valiosa, pero según las definiciones actuales, sería una locura considerarla “programación”.

En cambio, este tipo de educación está mucho más relegado al lado ECE del espectro. En realidad, las computadoras de ingeniería de un nivel muy bajo. Yo diría que los detalles profundos sobre estos temas generalmente se relegan a los programas universitarios, pero no siempre, ya que la educación de pregrado generalmente se enfoca en dar a sus estudiantes habilidades empleables.

Hoy, para contribuir significativamente al campo de la ingeniería informática, se requiere una gran cantidad de experiencia y una educación de pregrado probablemente sería insuficiente incluso si una escuela pusiera gran énfasis en enseñar diferentes sabores de ensamblaje.

Después de todo, hay muy pocos lugares en el mundo donde uno puede poner en práctica la investigación sobre arquitecturas de conjuntos de instrucciones. Hay tal vez 10 empresas en el mundo que trabajan en estos problemas, y probablemente solo alrededor de mil personas en el mundo que realizan este trabajo fuera de la academia.

Cuando hay tan pocos lugares disponibles para trabajar productivamente en un campo, la barrera de entrada aumenta naturalmente, por lo que cualquier persona sin un nivel de educación superior se verá en apuros para encontrar un entorno en el que estas habilidades sean de valor para ellos. Si este es realmente el camino para usted, cualquier programa de pregrado ofrecerá al menos una clase de ensamblaje, que puede usar para evaluar su deseo de profundizar.

La informática al final del día es un campo demasiado tremendo para permitirnos aprender todo, por lo que tenemos que tomar este tipo de decisiones. Podría hacer preguntas similares sobre por qué la educación de pregrado suele pasar por alto la programación funcional, la teoría de la computabilidad y los dispositivos semiconductores y obtendrían la misma respuesta.

Hay un par de cosas en mi humilde opinión.

En primer lugar, las universidades están ahí para capacitarte para comenzar tu carrera. Y generalmente es un desarrollo de alto nivel, porque paga las facturas 😉 . Los lenguajes de alto nivel (HLL) son su portal hacia el mundo de los negocios de desarrollo.

Pero dejemos eso de lado. Cuando asistía a la universidad, tuvimos muchas clases de programación en C ++ y Java, luego C #. Pero a la gran mayoría de los estudiantes no les gustó o no entendieron la programación, incluso si todos estos, excepto C ++, son HLL.

El ensamblaje, generalmente combinado con C, se usa principalmente en optimizaciones de compiladores, núcleos, sistemas integrados y juegos. Hay personas que hacen eso, pero la mayoría de los programadores que conozco trabajan en aplicaciones web + para teléfonos inteligentes en estos días. Y todos trabajan en HLL y VHLL.

Cuando trabajas en HLL, puedes terminar tu producto en un par de meses.

Llevar a cabo el mismo proyecto en lenguaje ensamblador o de máquina le llevaría años. Y sin mencionar un conjunto de habilidades especiales, experiencia de programación y lógica de programadores de bajo nivel.

No piensan en clases, objetos, polimorfismos y herencias. Se preocupan por los registros, las señales, la mnemotecnia y las operaciones básicas que ejecutarían un código de misión crítica rápidamente. En otras palabras, piensan como una máquina.

Si lee el lenguaje ensamblador de Jeff Duntemann paso a paso, puede leer que el lenguaje ensamblador generalmente se conoce como el “hijo huérfano del mundo UNIX” .

Por eso creo que las universidades no ponen demasiado énfasis en el lenguaje ensamblador. Porque saben que si estás dispuesto a tomar este camino, eres un loco o sabes lo que estás haciendo.

Pero si decidiste convertirte en un desarrollador de cualquier tipo, estás loco por defecto 😉

No sé si esto ayuda, o no, pero así es como lo veo.

Por la misma razón que no te enseñan sobre la sabiduría popular de la agricultura: los tiempos cambian.

La programación es el acto de construir automatización sobre las soluciones existentes. Algunos programadores (generalmente jóvenes) creen que la programación se trata de cambiar el código existente, pero eso no es todo lo que hay que hacer para programar. Peor aún, algunos programadores jóvenes creen que escribir código realmente significa el acto de escribir código nuevo.

Por lo general, la mejor solución se basa en una combinación creativa de las soluciones existentes.

Todos los seres humanos buscan formas de ahorrar energía, lo que se logra mediante una mejor comprensión de las reglas, lo que nos permite construir mejores autómatas para hacer el trabajo por usted.

Cuando los autómatas existentes son lo suficientemente buenos para el 80% de las tareas, ya no tiene que cambiarlos, sino que utiliza su interfaz de programación de aplicaciones expuesta para dar instrucciones (configuración), por las cuales opera sobre el lote de parámetros proporcionados (datos).

Con el ensamblaje, puede crear un nivel muy detallado de instrucciones, sin embargo, el código de la aplicación construido sobre el ensamblaje (por ejemplo, sistemas operativos, controladores, etc.) sigue ciertas reglas de casos de uso, que tienden a funcionar muy bien el 80% del tiempo, y el 20 El% del tiempo no causa problemas, solo el uso subóptimo de los recursos.

Si necesita optimizar a nivel de caché de la CPU, probablemente tenga que escribir el ensamblado. Si desea optimizar a nivel de RAM u otros problemas a nivel de dispositivo, debe usar C. Si solo desea optimizar el código, puede usar Java (máquina virtual) o lenguajes compilados en tiempo de ejecución (que utilizan precompiladores para el rendimiento )

Si necesita optimizar las solicitudes HTTP contra una API RESTful, deberá programar un middleware, que creará una cola de los datos que se enviarán dentro de una solicitud HTTP a la API como un lote en lugar de entidades individuales.

Esto sucede porque el hardware en todos los niveles es el mismo: en el caché de la CPU, los algoritmos de reemplazo tienen que poder reemplazar fragmentos óptimos de datos para reducir el uso de ancho de banda entre la CPU y el caché de la CPU; Lo mismo es cierto con la RAM.

Lo mismo también es cierto con los discos duros, las conexiones de red y los recursos cargados en la RAM de un servidor. Si la velocidad de negociación de HTTP es mucho mayor que el lote que está escribiendo en la base de datos, la mejor manera de optimizarlo es escribir lotes más grandes. Es decir, dónde está el dinero en este momento.

Construimos sobre los hombros de los gigantes y para crear una cantidad óptima de valor, es mejor centrarse en los problemas, que no requieren que reemplacemos a los gigantes; generalmente los gigantes lo hicieron bien después de todo.

Se trata de paginación y tamaño de página de los datos dentro de cierta restricción de ancho de banda hacia el hardware debajo.

He codificado en lenguaje de máquina con números hexadecimales e incluso octales. He escrito una cantidad moderada de ensamblaje y para lo que estaba haciendo funcionó bien.

Assembly es un lenguaje de muy bajo nivel y está dedicado a un único procesador. Es difícil hacerlo bien, pero proporciona un control exacto de la máquina. Es difícil o imposible portar a una nueva máquina. También es difícil trabajar con un alto nivel de concepto. Simplemente no puede escapar de esa CPU en particular y resolver problemas para múltiples máquinas y entornos. El código que puede llevar un día en ensamblador probablemente se puede hacer en una hora de dos con C. Ni siquiera piense en intentar escribir algo orientado a objetos en ensamblador, o cualquier código interactivo humano intensivo.

El lenguaje de máquina lleva eso a un nivel completamente nuevo de dificultad. Es un orden de magnitud más difícil y más lento de lograr. Si vas a diseñar una computadora, entonces necesitas saberlo. Si no, realmente no hay necesidad. El montaje es mucho mejor.

La gran mayoría de los programadores nunca obtendrá un beneficio de la codificación en el ensamblaje y mucho menos el código de máquina. Dicho esto, creo que todo programador serio se beneficia de un curso a nivel de ensamblador y de escribir algunos proyectos en ensamblador.