¿Es prudente que un desarrollador de alto nivel pase tiempo estudiando ensamblaje? [cerrado]

33

Está claro que el conocimiento de cosas de bajo nivel es muy importante en nuestro trabajo.

Pero en una situación en la que ya está desarrollando software comercial a un alto nivel, y cuando ya tiene una dirección elegida pero no tiene ninguna habilidad de ensamblaje, ¿no es más razonable concentrarse en estudiar cosas relacionadas con su dirección? ¿O hay alguna razón por la que debería dedicar algo de tiempo a aprender los conceptos básicos de bajo nivel de todos modos?

¿Cuándo es demasiado tarde y cuándo no? Y si lo es , no demasiado tarde, entonces ¿cómo uno va sobre el aprendizaje de manera óptima (en el sentido de no gastar tiempo excesivo para conseguir algo de profundidad y comprensión)?

zkaje
fuente
Muchas preguntas en una publicación :)
Shamim Hafiz
Disfruté el lenguaje ensamblador paso a paso. Al principio mucha programación noobie-ish, pero el autor es muy entretenido. Descubrí que tener una idea general es útil y principalmente escribo JavaScript.
Erik Reppen
Mi primer idioma (enseñado) fue un dialecto de asamblea. Puedo ver cómo sería útil (en la gran cantidad de formas que otros han señalado), y te ayuda a proporcionar diferentes aportes para el resto del equipo.
Jamie Taylor

Respuestas:

43

No puedo creer que nadie haya mencionado la depuración ...

No he escrito una línea de código de ensamblaje en muchos años. Pero lo leo con bastante frecuencia. La depuración de alto nivel es excelente cuando tiene la fuente y la información de los símbolos, pero cuando su elegante biblioteca arroja una excepción no controlada en las máquinas de los clientes, es demasiado tarde para exigir que se incluya en la licencia ...

Pero aún puedo abrir el desensamblador y ver qué terminó haciendo su lógica de alto nivel , rastrear los datos incorrectos hasta su origen, averiguar quién cambió el registro de control de la FPU ...

Esto me ha salvado el tocino más de lo que me gustaría pensar. Y nunca es demasiado tarde para aprender: hay muchas excelentes referencias y tutoriales en la red, y casi cualquier programa que se ejecute en su máquina puede proporcionar un entorno práctico.

Shog9
fuente
10
+1, y lo votaría más si pudiera. Todo desarrollador serio necesita poder leer ASM para esto si no hay otra razón.
Mason Wheeler
3
El corolario de esto es la optimización. ¡Saber cómo el compilador traduce su código en ensamblado puede ayudarlo a hacerlo dramáticamente más rápido!
lambacck
3
+1 Assembly es uno de los únicos lenguajes que te obligan a comprender cómo funciona realmente un procesador. Le ayuda en su desarrollo con lenguaje de alto nivel. Debe leer: blogs.msdn.com/b/ericlippert/archive/2010/09/30/…
Conocer la computadora subyacente es INSANELAMENTE útil, ya sea para la depuración, la optimización o la pura curiosidad. En serio, aprenda a leer al menos una o dos familias de lenguaje ensamblador. Incluso si nunca lo lees o escribes después de aprenderlo, afectará la forma en que entiendes las cosas en el futuro. Ahora, si prefieres escribir en ningún otro idioma, eso podría ser demasiado ...
Michael Trausch
1
@Mason: No sé si "todo desarrollador serio" necesita poder leer ASM. Si está escribiendo JavaScript o está utilizando un lenguaje de programación creado sobre un marco grueso (como .NET o Java), no consideraría que leer ASM sea esencial para ser un desarrollador serio. Dicho esto, tener una comprensión de cómo la computadora ejecuta las instrucciones en un nivel muy bajo puede ser bastante útil, incluso en entornos y lenguajes de programación de orden superior.
Scott Mitchell
15

No necesita aprender lenguaje ensamblador, solo necesita entender cómo funciona. Necesita saber qué es XOR y contar en binario mientras duerme, etc. Pero nunca he necesitado código de ensamblaje en mi trabajo.

Entonces, como usted dice, el conocimiento de cosas de bajo nivel es importante, pero el conocimiento práctico en el montaje no lo es.

Lennart Regebro
fuente
1
Yo segundo. Puede ganarse una buena programación de vida y nunca tener que leer / escribir ASM. Hay algunas posiciones que lo requieren. Leer un volcado después de una condición de carrera en su código eliminó el proceso. O si escribe programas muy intensivos en rendimiento (como GPU paralelización / OpenCL). El porcentaje de trabajos de desarrollo donde se le pedirá que realice estas tareas es muy pequeño.
yzorg
11

Si realmente no tiene conocimientos de programación de bajo nivel, me altamente recomiendo aprender un poco en su tiempo libre. No necesitas convertirte en un experto en eso; solo alcanza cierto nivel de competencia. Tienes que hacer mucho trabajo matemático por ti mismo, en lugar de depender del compilador o las bibliotecas para hacerlo por ti. Le ayudará a comprender la legibilidad en la programación, ya que la mayoría de las instrucciones de ensamblaje corresponden a una instrucción de procesador. Tienes que gestionar la complejidad en programas un poco más grandes, sin el beneficio de cosas como if...else. Esto lo ayudará a escribir programas de alto nivel más simples, porque la experiencia de ensamblaje le habría enseñado lo fácil que es leer.

Además, recuerde que la asamblea no es un idioma. Es un término genérico, que básicamente significa el conjunto de instrucciones de un procesador que se ha abstraído a un lenguaje simbólico. Los diferentes procesadores tienen diferentes conjuntos de instrucciones y, por lo tanto, diferentes lenguajes de ensamblaje. Cuando aprendes 'ensamblaje', aprendes un proceso, no un lenguaje.

Michael K
fuente
8

Siempre se beneficiará de alcanzar su punto máximo bajo las sábanas y comprender un poco más sobre lo que se encuentra debajo de la abstracción sobre la que está parado. Como un profesor universitario mío dijo una vez: "Todos los buenos programadores entienden el hardware": no es necesario que pueda crear y manipular circuitos, pero debe tener alguna idea de lo que está sucediendo allí, solo hará tu mejor.

Pruebe la organización y diseño de computadoras

Watson
fuente
1

, el aprendizaje continuo de por vida es un componente esencial de una carrera en el desarrollo de software. Si está interesado en continuar aprendiendo acerca de la programación y cómo mejorar su oficio, entonces sí, en algún momento debe aprender el ensamblaje, ya que lo expondrá a un lenguaje y una forma de escribir código completamente nuevos. Por la misma razón, recomiendo experimentar con muchos lenguajes / estilos de programación, incluidos Ruby / Python (lenguaje dinámico), Haskell / F # (lenguaje funcional puro), Lisp / Scheme (lenguaje funcional), etc.

Diría que es demasiado tarde si ya no está interesado en aprender más sobre el oficio de programación. Por ejemplo, si ha llegado al punto de su carrera en el que pronto pasará de la programación a otra área, como Administración, Ingeniería de sistemas, Ventas / Marketing, etc. Si cree que puede querer mudarse a una nueva área en En los próximos años, me centraría más en las habilidades necesarias para desarrollar en esa área, en lugar de en la programación.

Justin Ethier
fuente
1

Debe saber qué es y qué está haciendo la computadora. Aprender algo como Knuth's MIX te ayudará. Principalmente poder juzgar la eficiencia de su código. Ve a buscar el arte de la programación de computadoras y léelo. Te convertirá en un programador más inteligente.

Theo Belaire
fuente
1

¿No es más razonable concentrarse en estudiar cosas relacionadas con su dirección? ¿O hay alguna razón por la que debería dedicar algo de tiempo a aprender los conceptos básicos de bajo nivel de todos modos?

Responder:

  1. Si no planea cambiar su dirección para programar un sistema integrado, no hay razón para aprender asalto. Incluso si piensa que el ensamblaje depende de la CPU, puede aprender algunos conceptos básicos, pero su conocimiento se basará en la arquitectura de la CPU y el conjunto de instrucciones para esa CPU.
  2. Digamos que codificas para Windows. Si desea aprender un nivel más bajo que un lenguaje de alto nivel que pueda beneficiar su dirección actual, le recomendaría que aprenda Windows I profundo, API de Windows, administración de memoria de Windows, etc. Simplemente aprenda el SO / Plataforma que está codificando.
  3. Mejore sus habilidades en su lenguaje actual de alto nivel, como gestión de memoria, recolección de basura, etc. Si desea ir a un nivel bajo.
Amir Rezaei
fuente
0

Creo que alcanzas un punto de rendimientos decrecientes a medida que avanza tu carrera. Es decir, debe aprender el lenguaje ensamblador temprano, ya que conduce a una mejor comprensión fundamental de todo lo que viene después. Sin embargo, si ya está en la fuerza laboral y tiene algunos años de experiencia, ya tendrá una idea de cómo funcionan las cosas, por lo que aprender los detalles reales puede que no le brinde tanta información .

TMN
fuente
0

No sé cuánto uso sería estudiar ensamblaje. Pero al menos hacer algo de programación en un lenguaje como C sería beneficioso. Recientemente tuve que hacer algo de programación en C y me pareció bastante esclarecedor. C elimina gran parte de la abstracción que está presente en los lenguajes de nivel superior. Esas abstracciones no vienen sin costo. Debe administrar más detalles de nivel inferior en C, donde, como en un lenguaje de nivel superior, esos detalles se administran por usted. Al realizar alguna programación en C, deberá conocer esos detalles. Entonces, cuando vuelva a su idioma cotidiano, todavía tendrá esa conciencia y apreciará mejor lo que realmente está sucediendo. Eso debería ayudarte a convertirte en un mejor programador.

Ross Goddard
fuente
0

En la profesión docente, al menos aquí en el Reino Unido, los maestros tienen que estar calificados muy por encima de lo que enseñan. Se espera que un maestro de secundaria (secundaria) tenga un título en la materia que enseñó, y que los maestros de primaria (primaria) también tengan títulos y que tengan dominio en todas las materias principales hasta un buen grado GCSE (escuela secundaria ¿Exámenes de salida ?, no hay un equivalente real en los Estados Unidos).

¿Por qué? Porque para enseñar algo bien, o de hecho usar algo bien, tienes que entenderlo. Esto requiere comprender la estructura subyacente, la cadena de decisiones antes de aquella con la que está trabajando que la condujo. Para comprender correctamente el código de alto nivel, debe comprender la capa sobre la que está construido, cómo funciona, dónde residen sus puntos fuertes y débiles. Esto es recursivo, para comprender la capa debajo, también debes entender la capa debajo de eso.

Al final, esta es la razón por la cual los cursos decentes de la universidad / universidad en Computación piden una buena habilidad matemática antes que todo lo demás, ya que ese es efectivamente el peldaño inferior.

Maths -> Physics                ->
      -> Chemistry -> Materials -> Hardware Design -> Microcode      -> Assembler
                                                   -> Bus Interfaces -> Peripherals

... Assembler    -> Low Level      -> High Level   ->
... OS / Drivers -> API Level      -> Applications -> User

Si carece de conocimiento en estas áreas, su comprensión se ve comprometida debajo de ella. Cuanto más cerca esté del nivel de operación de otra capa, más importante es tener una conexión a tierra.

Entonces: ¿Necesitas saber ensamblador como un codificador de alto nivel?  Ayudará.

Orbling
fuente
0

Había sido muy importante en mi vida anterior como gurú supercompilador. En aquel entonces sentí que no entendías una máquina hasta que escribiste al menos varios cientos de líneas de ensamblador, y trabajaste con ella tratando de exprimir el rendimiento. Como muy pocos programadores querían profundizar tanto, me hizo realmente indispensable. Y todavía tengo un lenguaje común cuando hablo con los tipos de diseñadores HW.

Pero, realmente la necesidad / beneficio de esto es principalmente un par de décadas pasadas. Entre los avances del compilador y la ejecución avanzada fuera de orden HW, hay muy poco margen para poder jugar al héroe escribiendo ensamblador. Aunque creo que es útil entender cómo funcionan las cosas. Planeo enseñar a mis hijos (estudiantes de primer año de CS) a programar en un ensamblador muy simplificado en una máquina virtual simple, solo para que tengan una idea de lo que sucede. Esperemos que podamos jugar con cosas como desenrollar, canalizar software, cachés y captura previa, carga de fondo, etc. Así que al menos sabrán que en algún nivel esto está sucediendo.

Omega Centauri
fuente