Actualmente estoy estudiando ingeniería en Telecomunicaciones y Electrónica y hemos migrado de ensamblador a C en programación de microprocesadores. Tengo dudas de que sea una buena idea. ¿Cuáles son algunas de las ventajas y desventajas de C en comparación con el ensamblaje?
Las ventajas / desventajas que veo son:
Ventajas:
- Puedo decir que la sintaxis de C es mucho más fácil de aprender que la sintaxis de Assembler.
- C es más fácil de usar para hacer programas más complejos.
- Aprender C es de alguna manera más productivo que aprender ensamblador porque hay más cosas en desarrollo alrededor de C que Ensamblador.
Desventajas
- Assembler es un lenguaje de programación de nivel inferior que C, por lo que es bueno para programar directamente en hardware.
- Es mucho más flexible aludiendo a trabajar con memoria, interrupciones, micro registros, etc.
Respuestas:
Aquí hay algunas respuestas de desbordamiento de pila que pueden ayudarlo (estas son la respuesta principal, las respuestas aceptadas):
Ventajas
/programming/143561/is-there-a-need-to-use-assembly-these-days (solo para usuarios de 10K), o Archive
Desventajas
/programming/2684364/why-arent-programs-written-in-assembly-more-often
Ejemplo
La última publicación a continuación es una publicación de desbordamiento de pila que describe un escenario que mostrará un ejemplo de ensamblaje que es más rápido que C (cuando se realiza la misma función).
/programming/577554/when-is-assembler-faster-than-c
fuente
C es más fácil de programar en comparación con la Asamblea. Hay razones obvias que no vale la pena repetir.
Al ser más fácil de usar, C le permite escribir programas más rápido. En general, estos programas también son más fáciles de depurar y más fáciles de mantener. Además, es más fácil administrar programas grandes y complejos en C.
Muchas veces, el código generado por un compilador es igual de bueno (en términos de velocidad y eficiencia) que el ensamblador escrito a mano, si no mejor.
C es bastante bajo, y es raro que quieras bajar mucho más. Tener una capa adicional de abstracción rara vez es algo malo.
Cuando necesite bajar, puede usar Ensamblaje, de lo contrario puede usar C.
Puede escribir Assembly en código C, pero no C en código Assembly.
fuente
El programa de CA puede compilarse en diferentes arquitecturas de microprocesador.
fuente
No temas, ya nadie desarrolla nuevos programas en ensamblador 100%. Hoy en día, C se puede utilizar incluso para las arquitecturas más pequeñas y más asquerosas de 8 bits. Sin embargo , conocer a algún ensamblador lo convierte en un programador en C significativamente mejor. Además, siempre hay algún pequeño detalle o dos en un programa que deben escribirse en ensamblador.
Sí, la sintaxis es más fácil, sin duda. Sin embargo, aprender todo el lenguaje C con todos los detalles molestos es mucho más complejo que aprender todos los detalles de un ensamblador en particular. C es un lenguaje mucho más grande y amplio. Pero, de nuevo, es posible que no necesite aprender todos los detalles.
De hecho, C proporciona mecanismos para el diseño de programas modulares, como encapsulación y ámbitos locales / variables locales. Y C tiene una biblioteca estándar, además de una enorme cantidad de recursos escritos durante los últimos 30 años. Y lo más importante, C es portátil.
C tiene muchas funciones, bibliotecas y recursos prefabricados, por lo que habrá menos reinvención de la rueda. Pero aparte de eso, su declaración es subjetiva. Creo que es una cuestión de preferencia personal.
Por ejemplo, soy un programador de C experimentado, ocasionalmente programando C ++. Me encuentro mucho menos productivo en C ++, porque no conozco ese lenguaje tan bien como sé C. Pero solo porque me siento así, no necesariamente significa que programar en C sea más productivo que programar en C ++. Un programador experimentado de C ++ seguramente tendría la opinión opuesta.
Y hay muchos aspectos para "productivo". Un aspecto muy importante es el tiempo de mantenimiento, y especialmente el tiempo que lleva corregir los errores inducidos por el mantenimiento. C es mucho más fácil de mantener que el ensamblador.
La programación de hardware se puede hacer directamente en cualquier idioma. Lo único que no puede hacer en C es acceder a punteros de pila y registros de condición, etc., del núcleo de la CPU. Entonces, si por programación de hardware te refieres a hablar con tu propia CPU, entonces sí, el ensamblador permite un poco más que C. Si te refieres a acceder a hardware externo, entonces el ensamblador no tiene ningún beneficio sobre C. Pero quizás desventajas, ya que a menudo es más difícil de escribir código genérico de ensamblador para un dispositivo externo en particular, que el código genérico C.
Esto no es correcto. C también le permite hacer todo eso, aunque es posible que deba confiar en el código C específico del compilador, como la palabra clave interrupt.
Al final, necesita saber ambos idiomas para programar MCU, con énfasis en C.
fuente
a = b[i] + c;
es mucho menos complicado que las instrucciones para cargarb[i]
(que requiere cálculo) yc
en registros (que deben estar disponibles), agregar y almacenar.Dependiendo de qué tan incrustado deba ir, C producirá programas grandes y lentos. Lo que aumentará notablemente el costo de esa porción del producto. Puede ser una gota en el océano para el producto en general o puede cambiar radicalmente el producto. Sí, algunos podrían decir que los esfuerzos de desarrollo y mantenimiento de software son más baratos, de nuevo, eso puede ser verdadero o falso, si eso está profundamente integrado y apunta a una parte tan baja, pequeña y económica que no está hablando de mucho código. Ese código es principalmente específico para ese proveedor o ese chip específico, por lo que estar en C tiene cero beneficios de portabilidad, de todos modos debe reescribir para cada objetivo. Con la serie cortex-m de ARM, ahora estamos comenzando a hacer que C compita con asm, no que la gente no haya estado usando C u otros lenguajes de nivel superior en sus productos integrados,
El debate C vs ASM, profesionalmente, siempre se reduce a escribirlo en C y usar ASM donde pueda justificarlo. Y puedes justificarlo. En el mundo integrado hay rendimiento y tamaño.
Tienes que incluir el objetivo en esta discusión. Aunque muchos han usado C con Microchip (las fotos más antiguas, no el pic32 que es mips) a un costo enorme, es un conjunto de instrucciones espantoso para compiladores, un conjunto de instrucciones muy educativo e interesante pero poco compilador. msp430, avr, arm, thumb, mips, todo bien para compiladores. 8051 también malo.
Incluso más que el lenguaje de las herramientas. Especialmente en aquellos casos donde preocuparse por el desarrollo y la administración del código son un argumento, necesita herramientas para estar allí hoy y mañana. Tener una única herramienta de origen, incluso un mod de gcc único, administrado por un grupo, es riesgoso desde una perspectiva comercial. Es probable que encuentre más de un ensamblador, y cualquiera que sea digno de estar en ese equipo podría preparar un ensamblador en un fin de semana (siempre y cuando la asamblea que escriba no sea una directiva ghee whiz y macro feliz). Tanto para asm como para C, desearía utilizar herramientas de código abierto (o sus propias herramientas internas) donde tenga una mejor oportunidad, incluso si eso significa usar una máquina virtual para ejecutar una distribución Linux de 10 años, de tener herramientas disponibles para La vida del producto.
La conclusión, una vez más, use / learn / teach tanto C como asm, comience con C y use asm donde pueda justificarlo.
fuente
Para el ensamblaje existe un compromiso inevitable entre la capacidad de mantenimiento y el rendimiento del código. Puede escribir un ensamblaje fácil de leer / mantener, o puede escribir código altamente optimizado; pero no puedes hacer las dos cosas.
Para C, el compromiso no desaparece del todo, pero es mucho menos notable: puede escribir C fácil de leer / mantener que esté razonablemente bien optimizado.
Un excelente programador de lenguaje ensamblador será capaz de vencer al compilador casi todo el tiempo, pero la mayoría de las veces elegirá deliberadamente escribir código fácil de leer / mantener; y por lo tanto, un excelente programador de lenguaje ensamblador será golpeado por un compilador la mayor parte del tiempo.
La forma inteligente es usar tanto ensamblado como C (en lugar de solo ensamblaje o solo C), por ejemplo, usar C para partes del código donde un excelente programador de lenguaje ensamblador hubiera elegido escribir código mantenible / lento, y usar ensamblado para resto (donde "altamente optimizado y difícil de mantener" en realidad está justificado).
fuente
fuente