Pregunta

La mayoría de las personas sugiere que aprender a ensamblar es esencial, es importante conocer el funcionamiento subyacente de la computadora, etc. Pero lo que estoy buscando son algunas sugerencias prácticas que harán que el esfuerzo de aprender Asamblea valga la pena.

¿Cuáles son tus sugerencias? ¿Qué me estoy perdiendo al no aprender Ensamblaje y punteros / administración de memoria en general?

¿Fue útil?

Solución

Creo que la principal ventaja práctica de aprender cosas de bajo nivel, como lenguaje de ensamblador, punteros y administración de memoria, es que cuando escribe o revisa código de alto nivel es más capaz de detectar instintivamente o inconscientemente problemas de rendimiento o otras trampas.

Un desarrollador promedio, podría escribir un bucle simple y pensar, " Este código se repite en un conjunto de enteros y escribe cada uno en la consola. "

Un desarrollador experto podría escribir el mismo bucle y pensar, " Este código itera sobre un conjunto de enteros, y tiene que marcar cada elemento para llamar al método ToString y ToString tiene que formatear la cadena en la base 10, que es algo no común -trivial, y luego tanto el entero en caja como la cadena con formato pronto serán elegibles para la recolección de basura ya que no quedarán referencias, y la primera vez que se ejecute este método, deberá ser JIT'ed ... " y así sucesivamente.

9 de cada 10 veces, puede que no importe. Pero esa vez de 10, es probable que el desarrollador experto note un problema en el código que el desarrollador promedio nunca consideraría tener en cuenta.

Otros consejos

Necesitas aprender a leer el ensamblaje para poder descubrir qué es lo que no funciona cuando se produce una explosión en una declaración compleja. La ventana de depuración de la CPU no debería ser un lugar misterioso.

Los punteros / administración de memoria son más generales que el lenguaje ensamblador. También debe comprenderlos para C y C ++, lo que podría necesitar si tiene que mantener el código escrito en C.

Para el lenguaje ensamblador, a veces es útil leer el código del ensamblador que genera el compilador de C, para saber si genera el código correcto y eficiente.

Creo que es genial aprender nuevos idiomas. Me abre la mente. Algunos idiomas son más abiertos que otros. Yo diría que ensamblador es uno de esos. Te obliga a pensar en cosas como la pila de llamadas y el indicador de instrucción. Y te hará apreciar idiomas de nivel superior aún más. Otro lenguaje divertido para aprender es PostScript.

No creo que necesite aprender a ensamblar para nada práctico. Sin embargo, se asegurará de que entienda las raíces reales de lo que está haciendo como desarrollador. . En esencia, la programación de ensamblajes es una disciplina para el aprendizaje de lógica y arquitectura de chips. No he programado el ensamblaje en más de dos décadas, pero sigue informando los tipos de elecciones que hago cuando programo C #.

Esta es una de esas preguntas que siempre se harán: "¿Por qué debería saber algo?" Bueno, quizás podrías conseguir un trabajo haciendo algo además de crear la próxima aplicación genérica de CRUD o algo así. Si desea realizar cualquier tipo de desarrollo de sistemas, tener un conocimiento práctico del montaje es muy útil, si no vital. En cuanto a lo que estás " perdiendo " tal vez te estás perdiendo saber realmente cómo funcionan las computadoras. Algunas personas piensan que esto es deseable. Algunas personas no lo hacen. Algunas personas construyen procesadores. Algunas personas cavan zanjas. Todo es una cuestión de preferencia personal :)

  

Pero lo que estoy buscando son algunas sugerencias prácticas que harán que el esfuerzo de aprender a la Asamblea valga la pena.

Aprende qué es el ensamblaje. Aprende realmente a leer (y entender) pequeños fragmentos de él: cómo caminar / atravesarlo en tu mente. Quizás también, pase un poco sobre él con un depurador (que incluye ver la memoria y los registros cambiados). Lo ideal es encontrar un ensamblaje anotado.

Pero, no se moleste en aprender a escribir ensamblados: en lugar de eso, aprender a escribir C o C ++ es probablemente lo suficientemente bajo para la mayoría de los propósitos prácticos.

Los punteros y la administración de la memoria son realmente una pregunta diferente al ensamblaje. Si desea hacer C / C ++, entonces necesita aprender punteros y administración de memoria, porque son parte del lenguaje. Pero, incluso si planea usar nada más que (digamos) Java toda su vida, debe aprender algo acerca de la administración de la memoria para evitar escribir una pérdida de memoria a pesar del GC, y los punteros son solo la diferencia entre los tipos atómicos y las referencias de objetos. ¡Necesitas los conceptos o escribirás programas que no funcionan!

Razones prácticas para aprender a ensamblar: depuración y optimización. Incluso si no escribe ningún ensamblaje, es posible que uno de estos días necesite optimizar el código C / C ++ para el rendimiento. En ese caso, deberá poder leer el ensamblaje de su bucle interno, incluso si nunca necesita escribir otra línea de él.

En última instancia, creo que su distinción entre " conocer el funcionamiento subyacente de su computadora " y "sugerencias prácticas que harán que el esfuerzo de aprender a ensamblar valga la pena" es una falsa La ignorancia no paga. Aprender cómo funciona su computadora es una sugerencia práctica que vale la pena.

Tengo una profecía: algún día pronto, su programa se ejecutará demasiado lento para ser práctico, y se bloqueará de forma intermitente con una excepción de memoria insuficiente. En ese día, la pura ansiedad de no saber qué diablos está pasando o dónde empezar a buscar para solucionarlo reembolsará su deuda de karma, con intereses ...

En estos días, muchos lenguajes de ensamblaje son en realidad bastante altos.

Y siempre ha sido cierto que si aprendes 'C', eso es lo suficientemente cercano al ensamblaje para obtener la mayoría de los beneficios de aprendizaje.

edit: pensando un poco más en esto, en los libros de Knuth él describe un lenguaje ensamblador idealizado. No se equivocará al aprender eso y leer esos libros.

Otra razón práctica que se me ocurre es el código de aplicación de ingeniería inversa para modificarlo SOLAMENTE con fines educativos, ya que los crackers lo utilizan ampliamente para evitar las protecciones de aplicaciones shareware como el límite de tiempo o los números de serie.

Una aplicación como win32Dasm puede convertir archivos ejecutables en código de ensamblaje que luego se puede modificar con un editor Hex como hiew. Puedes aprender mucho sobre el flujo del programa.

Bueno, en un nivel práctico, hice una clase en el ensamblador 6502 cuando estaba aprendiendo a codificar los primeros años 80. También hice un ensamblador 8088. Ha sido un uso ocasional de los años desde entonces, pero no puedo decir que alguna vez realmente haya salido de un agujero en más de una o dos ocasiones en 25 años. Groking C a un nivel bastante fundamental es de mucho más uso. YMMV y es ciertamente útil como fondo, pero como un beneficio práctico directo? Realmente marginal.

Perversamente, aunque una cosa que ha demostrado ser útil es a un nivel aún más bajo. Hice una clase sobre diseño de chips (puertas NAND y similares) y como parte de eso se enseñó lógica booleana formal con cierta profundidad. Desde entonces, ha sido muy útil, es sorprendente la cantidad de programadores que realmente no saben lo que están haciendo con ands, ors y nots :-)

Creo que aprender acerca de la arquitectura de la computadora, en conjunto con el ensamblaje, abriría tu mente un poco.

Ayudaría a explicar muchos problemas de rendimiento, por ejemplo, el analizador es lento porque hay muchas sucursales, y la tubería se enjuaga muy fácilmente, el predictor de la rama no puede compensar todo.

Además, diferentes arquitecturas tienen sus peculiaridades. Alguien habló sobre un truco de ensamblaje para intercambiar 2 registros en su lugar, involucrando a xor. Funciona, y funcionaría bien para el núcleo de ejecución en orden (el ejemplo más reciente sería el Intel Atom y la Via C7 en las netbooks), pero no tan bueno en los núcleos fuera de orden.

Saber que eso puede ayudarlo a detectar código mal compilado al inspeccionarlo en el ensamblaje, y posiblemente pueda escribir código en un lenguaje de nivel superior para evitar la imperfección de los optimizadores del compilador. No estoy tratando de disuadirlos, pero simplemente no pueden estar perfectamente sintonizados.

La mayor ventaja práctica para aprender ensamblaje es el rendimiento. Puede optimizar hasta casi la perfección cuando sea necesario.

Tengo algunos ejemplos prácticos de por qué necesitas saber qué hay debajo del capó. Algunos enlaces útiles que puede encontrar útiles en este contexto son: -

Assembly And The Art Of Debugging

Depuración y # 8211; Modificar código en tiempo de ejecución

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top