¿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?
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.Respuestas:
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:
fuente
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.
fuente
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).
fuente
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.
fuente
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í?").
fuente
Si realmente quieres saber por qué aprender ensamblaje es la mejor opción. Aquí hay razones.
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.
fuente