¿Sigue siendo relevante la Asamblea? [cerrado]

18

¿Existen diferencias importantes entre el lenguaje ensamblador y los lenguajes de nivel superior cuando se trata de codificar y / o administrar proyectos? Obviamente, se necesitan más declaraciones en lenguaje ensamblador para llevar a cabo una operación en particular que en la mayoría de los otros idiomas, pero existen diferencias que afectan la forma en que un proyecto necesita (o debería) ejecutarse según el lenguaje ensamblador de orientación (específicamente el lenguaje ensamblador x86 / x64) ?

En la medida en que existen diferencias entre el lenguaje ensamblador y otros idiomas, parece razonable suponer que al menos algunos de estos son ventajas para los otros idiomas. ¿Alguien puede señalar desventajas específicas del lenguaje ensamblador y formas de mitigar esas desventajas?

Un ejemplo específico sería la disponibilidad de personal. ¿Alguien ha tenido problemas para encontrar programadores experimentados en lenguaje ensamblador, y si es así, qué pasos se pueden tomar para mitigar este problema?


fuente
¿Por qué alguien escribiría un proyecto completo únicamente en lenguaje ensamblador hoy? ¿O está preguntando acerca de un entorno de lenguaje mixto, que es cómo se usa el ensamblaje en la actualidad?
Martin Vilcans
66
Tenga en cuenta que hay áreas de non-[PC|web|enterprise]programación, donde el ensamblaje es predominante o muy popular. Estoy hablando de microcontroladores, automatización industrial o robótica. Claro, también hay idiomas de alto nivel en estas áreas, pero ves mucho el ensamblaje.
Mchl
1
@Mchl: ¿No se realizan estos proyectos en C (o incluso en C ++) y posiblemente en ensamblaje? Habría adivinado que es muy raro usar el ensamblaje exclusivamente.
Martin Vilcans
1
En realidad, en la automatización industrial puede encontrar una rama completa de idiomas que simplemente no existen fuera de ese campo. Parte de eso proviene de las diferencias en el hardware (arquitectura de Harvard en oposición a la arquitectura von Neumann a la que estamos tan acostumbrados). así como de la historia de hacer que estos controladores sean accesibles para electricistas, que estaban acostumbrados a trabajar con interruptores y relés. Así es como LD ( en.wikipedia.org/wiki/Ladder_logic ) entra en existencia, que en realidad es una interpretación gráfica del ensamblaje. Consulte el artículo vinculado para ver algunos idiomas más utilizados en la automatización.
Mchl
2
Tengo un pequeño instalador que soporto ahora que está en ensamblaje. Era tan fácil escribir en ensamblador (con la API de Windows) como cualquier otra cosa, entonces ¿por qué no? También tengo una interfaz de tarjeta de crédito escrita en ensamblador. Comencé en lenguajes de alto nivel, pero tuve tantas dificultades para que funcionara que reescribí en ensamblador para tener un mejor control de todos los bits que fluyen ...
Brian Knoblauch

Respuestas:

25

Sí, pero no con frecuencia.

En cierto sentido, el ensamblaje es realmente solo un proxy para el lenguaje de máquina, por lo que, por supuesto, puede hacer cualquier cosa en ensamblador que podría hacer con un lenguaje de nivel superior.

Lo contrario no siempre es el caso. Por ejemplo, hace unos años, trabajé en una CPU ARM que tenía algunos códigos de operación para cambiar los estados gráficos que solo podían usarse desde el modo kernel. No tendrían un equivalente directo en un lenguaje de nivel superior, y estoy seguro de que la función en el controlador del kernel de Linux para cambiar esos estados incluía algún ensamblaje.

En los microprocesadores de los años 80 y principios de mediados de los 90, si tuviera algún código que necesitara para ejecutarse realmente rápido, a menudo lo escribiría en ensamblado, porque un humano experto podría escribir fácilmente un ensamblaje más optimizado que la mayoría de los C los compiladores podrían generar. Algunos de los primeros programas de Mac fueron escritos completamente en ensamblador, y fueron sorprendentemente rápidos para la época. Incluso sin escribir todo el programa en el ensamblaje, ciertamente hice mi parte de optimizar los bucles internos en C a través del ensamblaje incorporado.

Pero las cosas comenzaron a cambiar a mediados de la década de 1990. Las CPU comenzaron a incluir características como la canalización y la predicción de ramificaciones, por lo que el pedido de instrucciones más eficiente no siempre era obvio para un humano. Peor que eso, el orden más eficiente varió entre las CPU de la misma familia; por ejemplo, los compiladores PowerPC generalmente ofrecían interruptores de destino para las series G3, G4 y G5. El mismo código de objeto se ejecutaría en todos ellos, pero se ejecutaría en una de esas series de manera más eficiente.

Desde entonces, el orden de las instrucciones se ha vuelto cada vez más complicado, especialmente en las CPU más arquitectónicamente complejas como x86, PowerPC y SPARC. (Creo que ARM sigue siendo bastante simple de esa manera.) Un factor adicional importante es el tamaño del código: el código que usa más ciclos de CPU pero puede permanecer en el caché de la CPU a menudo se ejecutará mucho más rápido que el código que usa menos ciclos de CPU pero desencadena la recuperación lenta de la memoria . Los principales compiladores modernos pueden hacer un trabajo mucho mejor para optimizar el código en esas CPU que un ser humano razonablemente puede hacer.

No he encontrado una buena razón para escribir ensamblaje en al menos 15 años. Creo que en 2011, los principales usos para el ensamblaje serían:

  • Para leer los volcados de desmontaje al depurar, lo que ocasionalmente hago incluso hoy.
  • Tratar con características de CPU no estándar, como ese modo de gráficos funky.
  • Escritura del compilador: proporciona un formato intermedio legible para humanos para traducir idiomas de nivel superior.
Bob Murphy
fuente
1
E incluso su razón # 3 está comenzando a desaparecer con compiladores que apuntan a un marco de compilación de alto nivel como LLVM, nanojit o libjit o algo así como JVM, CIL, Parrot, Rubinius o Neko bytecode.
Jörg W Mittag
A veces todavía es necesario hacer un poco de SSE2 en el trabajo de gráficos / video. Aunque el punto de referencia contra TBB / OMP primero!
Martin Beckett
@ Martin: OMP es ortogonal a SSE2. (suponiendo buenas prácticas de diseño de datos)
rwong
@rwong, pero el proceso sigue siendo, 1, descubre que es demasiado lento. 2, espero que OMP / TBB lo acelere lo suficiente. 3, recurra a la versión SSE2 de escritura a mano. (en orden de dolor)
Martin Beckett
2
Como ejemplo, la totalidad de Roller Coaster Tycoon se escribió en conjunto (menos los gráficos que se hicieron en c) y fue increíblemente potente para su tiempo. Cientos de IA individuales que actúan de forma independiente, casi sin problemas, cuando la mayoría del juego tenía unos sprites de 16x16 píxeles que realizaban movimientos predefinidos. Siempre me gusta usar eso para mostrar el poder de la asamblea.
Ampt
19

Intente programar un microcontrolador para un "pequeño integrado": un control remoto de alarma de automóvil, un monitor de batería del teléfono, un controlador de teclado, un regulador de velocidad del ventilador, sin usar el ensamblaje.

Mientras se mueve el borde, siempre hay espacio para el montaje.

Hace 15 años, su cuentakilómetros de bicicleta era mecánico, un horno de microondas estaba en un circuito analógico, el control remoto del televisor estaba en un circuito digital, el sintonizador de TV por satélite estaba escrito en conjunto, el firmware de un teléfono estaba en C y un applet de computadora estaba en Java.

Hace 7 años, un horno de microondas estaba en un circuito digital, un control remoto de TV estaba escrito en conjunto, el decodificador de TV estaba escrito en C, su teléfono ejecutaba una interfaz de usuario basada en Java.

Hoy en día, un cuentakilómetros de bicicleta está en un circuito digital, un horno de microondas tiene el firmware ensamblado, un control remoto de TV tiene firmware en C, el decodificador de TV ejecuta Java, su teléfono tiene Linux.

¿Quieres apostar los próximos 7 años? A medida que más tecnología obtiene lenguajes de control más avanzados, el ensamblaje adquiere nuevas bases y seguirá obteniéndolos. Mira lo que se hace hoy con circuitos mecánicos o analógicos. Puedes apostar allí en unos pocos años. ¿Tu interruptor de luz? ¿Tu grifo de agua? Tu tetera? Tu cepillo de dientes?

Siempre habrá un nuevo dispositivo, aparato, juguete, artículo de la vida común que se programará en el ensamblaje.

SF.
fuente
3
buena respuesta. ¿Cuántas personas preferirían pagar el doble por algo que las baterías duran la mitad del tiempo solo porque se usó Java o algo así como la plataforma de desarrollo? Miren a groupon y todas las otras formas en que las personas buscan ahorrar dinero, miren el movimiento verde que ahorra recursos. ¿Por qué aumentar el costo y potenciar todos los productos integrados solo para evitar el ensamblaje?
old_timer
1
Olvidó agregar que ahora las computadoras ejecutan Javascript (Chromebooks). Para mí esa progresión es bastante triste pero cierta.
Hawken
A partir de 2017, la CIA ingresa a su televisor con Linux, las señales de Java que se ejecutan en las llaves del automóvil pueden ser falsificadas, cualquiera puede conectarse a través de WIFI al firmware C ++ de una cámara de consolador , un cepillo de dientes obtuvo una vulnerabilidad remota en 2013, pero afortunadamente aún los auriculares con cancelación de ruido creada en trabajos de montaje. Aunque el ensamblaje pierde la posición como controlador de nivel superior de cualquier cosa , en su lugar se mueve a los subcomponentes. Las persianas de su ventana ya ejecutan Java, pero esa placa de control de Java habla con el controlador de motor de persianas que se ejecuta con el ensamblaje.
SF.
8

Estoy basando esto principalmente en los ensambladores que he usado, principalmente MASM, NASM y (en menor medida) TASM. Algunas de las versiones posteriores de TASM tenían (¿tienen?) Algunas características para admitir OO, pero no las he usado mucho y no estoy tratando de comentarlas.

Primero: la mayoría de los lenguajes se han movido hacia una estructura que es al menos algo similar a un árbol. Ya sea orientado a objetos, o basado en objetos, o exactamente qué, hay un poco definido sobre las relaciones entre las diferentes partes de un sistema. También hay bastante para "proteger" una parte de un sistema de "intromisiones" accidentales, pero otras partes (aunque la protección generalmente se puede omitir si lo desea). Por el contrario, el lenguaje ensamblador es relativamente "plano": la mayoría de las relaciones entre el código (y los datos) en diferentes partes del sistema se establecen principalmente por documentación y, en menor medida, por convenciones de nombres.

El resultado de esto es que a menudo es mucho más fácil acoplar el código mucho más estrictamente de lo que sería ideal. Los requisitos que impulsaron la elección del lenguaje ensamblador para comenzar (mayor rendimiento, menor tamaño, etc.) a menudo también recompensan esto: al pasar por alto las interfaces aprobadas, puede obtener un código más pequeño y más rápido (aunque generalmente no mucho). mejor en cualquier dimensión). El lenguaje y las herramientas en sí hacen mucho menos para restringir lo que haces (bueno o malo), lo que supone una carga mucho mayor para los gerentes para evitar problemas. No diría que es cualitativamente diferente, pero cuantitativamente lo es, es decir, la administración tiene que trabajar para evitar problemas de cualquier manera, pero en el caso del lenguaje ensamblador, generalmente se necesitan más (y a menudo más estrictas) pautas sobre lo que es o no es t aceptable.

Mitigar esto es en gran medida una cuestión de pautas más cuidadosas, más orientación de personal más experimentado y convenciones de nomenclatura más específicas y cuidadosamente aplicadas.

La dotación de personal es un problema. Sin embargo, los problemas que he encontrado no eran principalmente los que esperaba. Encontrar muchachos con un poco de personalidad de "deportista de combate" que estaban felices de saltar al código del lenguaje ensamblador fue bastante fácil. La mayoría hizo un trabajo bastante razonable, a pesar de una falta casi total de experiencia previa en el uso del lenguaje ensamblador.

La dificultad que encontré fue encontrar más personal de alto nivel: personas que pudieran mantener el proyecto bajo al menos una apariencia de control y que no estuvieran completamente acostumbrados a los idiomas que proporcionarían (y en gran medida impondrían) las pautas necesarias para mantener el código razonablemente Mantenible y comprensible.

Mirando hacia atrás, es posible que haya sido / causado el mayor problema a ese respecto. Puedo ver dos fuentes de problemas de mi parte. Primero, para el momento del proyecto en el que estoy pensando, había estado codificando principalmente en lenguajes de nivel superior durante bastante tiempo, y usando solo lenguaje ensambladorcomo último recurso. Como tal, cuando lo usé, casi todos los trucos posibles para ganar rendimiento no solo fueron un juego justo, sino que se esperaban. En segundo lugar, cuando había trabajado en algunos sistemas escritos completamente (o principalmente) en lenguaje ensamblador, estaba bajo algunos gerentes de proyecto bastante forzados. En ese momento yo era relativamente joven y, francamente, me molestaba la forma en que manejaban las cosas, por lo que tendía a hacer lo contrario. En retrospectiva, lo que estaban haciendo realmente era importante, y no solo porque eran viejos e inflexibles (lo cual, estoy bastante seguro, fue cómo vi las cosas en ese momento).

Jerry Coffin
fuente
Tengo buenos recuerdos de TASM y ensambladores de Orca / M =)
Patrick Hughes
0

En mi opinión, el ensamblaje como plataforma de desarrollo puede no ser relevante para el uso diario. La razón principal de esta opinión puede deberse a que la cantidad de potencia computacional que se elimina de un proceso dado versus la cantidad de tiempo de desarrollo necesario para optimizar el mismo proceso dado generalmente no vale el tiempo y la energía (hay un término específico para esto ... suena a hombre / hora o algo ... edite si sabe de lo que hablo ...) existen las obvias excepciones mencionadas anteriormente, pero en lo que respecta a la programación convencional, el ensamblaje no se usa a menudo.

Dicho esto ... el ensamblaje sigue siendo relevante hoy en día cuando se aprende programación en el contexto de los estudios de ingeniería de software, enseña cómo se siente y se comporta un lenguaje de programación de bajo nivel. Seguiré y daré el ejemplo de lo que usamos en clase en estos días. utilizamos el ensamblaje pep / 8 desarrollado por Stanley Warford (Pepperdine University USA) y el software de código abierto que se proporciona aquí . se usa principalmente porque virtualiza la CPU y muestra el contenido de la memoria mientras recorre el código mientras se está ejecutando (bastante útil para aprender, depurar).

Entonces, dependiendo de su uso, el ensamblaje puede o no ser relevante en mi opinión.

marc-andre benoit
fuente
0

Creo que te estás preguntando "¿siguen siendo relevantes los camiones si tenemos autos?". Quiero decir, el ensamblaje tiene una amplia gama de aplicaciones, pero no tan amplia como la programación de alto nivel, de la misma manera que hay muchos menos camiones que automóviles.

En campos como la optimización de algoritmos, puede usar directamente registros del procesador para mejorar los algoritmos de procesamiento de imágenes / video.

En campos como la criptografía, puede usarla de la misma manera.

En los procesadores nuevos con arquitecturas nuevas (recuerde cuando se lanzó el microprocesador Cell), seguramente tuvieron que escribir cargadores de arranque y demás en el ensamblaje (y también con procesadores antiguos, pero los procesadores usados ​​desde hace mucho tiempo tienen una base muy estable y es difícil de mejorar eso).

Y se podrían dar muchos más ejemplos, por lo que depende del campo en el que se concentre su empresa, si su empresa se dedica al desarrollo web / móvil, es muy probable que no lo necesite, pero si su empresa se centra en microcontroladores, sistemas embebidos, etc. es bastante probable que lo necesite.

Y la disponibilidad del personal, depende de, supongo que si pregunta en Intel, Qualcomm, ... deben tener una gran lista de programadores de ensamblaje (es como si preguntara en su lugar de trabajo "¿cuántos conductores de camiones hay por aquí?" no piense mucho, pero eso no significa que no haya en otros lugares. ¿Qué sucede si pregunta "cuántos conductores de automóviles hay por aquí?").

periket2000
fuente
-3

Si realmente quieres saber por qué aprender ensamblaje es la mejor opción. Aquí hay razones.

  1. No necesita aprender ensamblaje, si va a hacer programación en Visual Basic y esas cosas de MS.
  2. No es necesario aprender a ensamblar, si no tiene que hacer dispositivos serios de microcontroladores.
  3. No es necesario aprender a ensamblar, si tiene un espacio de memoria a su disposición mientras trabaja en un microcontrolador (Dios lo ayuda mientras conecta la memoria con el microcontrolador)
  4. No es necesario aprender a ensamblar, si no quiere que Dios le dé poder a su microcontrolador / microprocesador.
  5. No conocer la asamblea es como conocer el iceberg. Puedes ver el 25% de lo que es tuyo y tu capacidad de micros y el 75% que nunca sabrás ni entenderás
  6. ¡Intenta ejecutar Kolibris OS completamente escrito en ensamblador! ¿Has visto un sistema operativo que se inicia en menos de 5 segundos y la aplicación comienza a ejecutarse con 1 segundo de clic del mouse?
  7. Los compiladores modernos tienen funciones de propósito general en el backend y, por lo tanto, el código final generado sería pesado en comparación con el ensamblado.

La asamblea es como la Natasha Romanoff de Avengers. Es un encanto y magia. Primero, te morderá, pero créeme, nunca olvidarás el sabor.

cyberspider789
fuente
1
Esto no parece ofrecer nada sustancial sobre los puntos hechos y explicados en las 5 respuestas anteriores
mosquito