¿Cuáles son algunas ventajas / desventajas de usar C sobre el ensamblaje? [cerrado]

15

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.
Daniel Conde Marin
fuente
17
Uhm ... bienvenido al nuevo siglo. Te gustará aquí. Tenemos microcontroladores que ejecutan .NET , Java , Linux e incluso personas que usan python para programar PIC .
ZJR
@ZJR ¿Cómo se usa Python para programar un PIC? ¿Cual foto?
desviarse el
2
@detly No es una pitón completa, solo un subconjunto del núcleo. Una capa de sintaxis de Python sobre la funcionalidad del controlador , si lo desea. pyastra es el primer ejemplo que busqué en Google, pero recuerdo haber leído documentos de otro, que también hizo ATMEL.
ZJR
44
Para ser honesto, con la complejidad de los procesadores modernos, me sorprendería que muchos programadores pudieran escribir un ensamblador más ajustado y eficiente que un compilador de C moderno puede generar de todos modos. Odiaría intentar programar una CPU de arquitectura EPIC en ensamblador, por ejemplo, Mel estaría en casa con Itanium . * 8 ')
Mark Booth
55
@ZJR ¡Este nuevo siglo suena emocionante! Sin embargo, tengo curiosidad, ¿en qué idioma se escribió el tiempo de ejecución .NET, Java VM y Linux para esos microcontroladores? Como en, ¿en qué idioma se realizó la programación real del microcontrolador? Oh ... C o ensamblador este siglo también ...

Respuestas:

17

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

  • El ensamblaje se usa en las primeras etapas del gestor de arranque. Cuando la CPU se enciende en la pila no está disponible, y es difícil evitar que el compilador de C intente guardar cosas en la pila. Sin embargo, la mayor parte del gestor de arranque se escribe en C, una vez que se realiza la inicialización más temprana.
  • El ensamblaje se utiliza para escribir primitivas de bloqueo de mutex. Es esencialmente imposible hacer que un compilador de C emita instrucciones de barrera de memoria en los lugares requeridos.
  • Rutinas como memset () o memcpy () a menudo se realizan en ensamblador. Por ejemplo, escribí un memset () con un gran bucle desenrollado, que calcula dinámicamente una dirección de bifurcación para saltar al centro de ese bucle para una iteración final. La rutina de AC habría generado más código, teniendo pérdidas adicionales de I $. Del mismo modo, los conjuntos de instrucciones de la CPU a menudo incluyen carga de línea de caché u otras instrucciones que pueden acelerar drásticamente memcpy (), que el compilador de C no utilizará.

Desventajas

/programming/2684364/why-arent-programs-written-in-assembly-more-often

  • ASM tiene poca legibilidad y no es realmente fácil de mantener en comparación con los lenguajes de nivel superior.
  • Además, hay muchos menos desarrolladores de ASM que para otros lenguajes más populares, como C.
  • Además, si utiliza un lenguaje de nivel superior y las nuevas instrucciones ASM están disponibles (SSE, por ejemplo), solo necesita actualizar su compilador y su antiguo código puede hacer uso de las nuevas instrucciones fácilmente.

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

jmq
fuente
20
  • 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.

BBB
fuente
66
Yo diría que muchas veces verá que el código de máquina optimizado para el compilador de C es mejor que su código de ensamblaje escrito a mano
usuario del
@crucified: esto ya era un reclamo común (y generalmente justificado) a mediados y finales de los 90. Un compilador aplica optimizaciones de manera confiable y sistemática, no solo cuando se da cuenta de la oportunidad.
Steve314
15

El programa de CA puede compilarse en diferentes arquitecturas de microprocesador.

gaviota
fuente
4

Hemos migrado de ensamblador a C en la programación de microprocesadores. Tengo dudas de que sea una buena idea.

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.

Puedo decir que la sintaxis de C es mucho más fácil de aprender que la sintaxis de Assembler.

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.

C es más fácil de usar para hacer programas más complejos.

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.

Aprender C es de alguna manera más productivo que aprender ensamblador porque hay más cosas en desarrollo alrededor de C que Ensamblador.

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.

Assembler es un lenguaje de programación de nivel inferior que C, por lo que es bueno para programar directamente en hardware.

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.

Es mucho más flexible aludiendo a trabajar con memoria, interrupciones, micro registros, etc.

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
¿De qué manera es todo el lenguaje C más complejo que algunos de los lenguajes de máquina más arcanos? Habiendo hecho ambas cosas, creo que C sin las bibliotecas es considerablemente menos complejo. Si se refiere a la Biblioteca estándar de C, también necesita algo así en el ensamblador para hacer algo útil. C puede ser un lenguaje más grande y más amplio, pero no necesita conocerlo con el mismo nivel de detalle. a = b[i] + c;es mucho menos complicado que las instrucciones para cargar b[i](que requiere cálculo) y cen registros (que deben estar disponibles), agregar y almacenar.
David Thornley
1
@DavidThornley Cuanto más aprendes sobre C, más te das cuenta de lo complejo que es. ¿Conoce todos los cientos de casos de comportamiento indefinido / no especificado / implícito? ¿Conoce todas las reglas de promoción de tipo implícito en detalle (promociones enteras, conversiones aritméticas habituales)? ¿Todas las reglas y sintaxis peculiares con respecto a los especificadores de tipo? Todas las diversas formas de matrices multidimensionales estáticas / dinámicas, incluidos los punteros de matriz (que no deben confundirse con los punteros al primer elemento de una matriz) ¿Todas las características de C99 y C11? Y así.
1
@Lundin: Lo importante de C es que puedes hacer todas esas preguntas y encontrar respuestas concretas. Los compiladores que se ajustan al estándar deben documentar cómo se comportan para los 62 comportamientos definidos por la implementación (no "cientos"). La simple simplicidad de Assembly lo convierte en una propuesta para traer su propio almuerzo, que a su vez descarga la complejidad que C trata en su propio código. Podría contrarrestar su argumento preguntándole cuántas bibliotecas de punto flotante se han escrito en ensamblado para una arquitectura determinada y por qué su comportamiento está definido por la implementación.
Blrfl
1
@Lundin: 62 es el número de comportamientos definidos por el compilador enumerados en la sección 4 del manual de GCC. Dejar de lado lo que está definido por la biblioteca hace una comparación de manzanas a manzanas ya que no hay una biblioteca estándar para el ensamblaje. El requisito para documentar es la primera oración de §J.3. GCC y el puñado de compiladores comerciales que compré o utilicé desde que se ratificó el documento C89 (Intel, Sun, IBM, Portland Group), por lo que sus "más" que no se molestan no pueden considerarse conformes. Hablando de estándares, ¿cómo funciona el ensamblaje de x86 escrito con la sintaxis Intel en un ensamblador con sintaxis AT&T?
Blrfl
1
@Lundin: Mi auto es genial, gracias. El volante, el acelerador, el freno, el embrague y el tallo de la señal de giro están en lugares estándar, tienen un comportamiento estándar y los otros controles están claramente marcados con símbolos estándar ISO. Todas las cosas definidas por la implementación, como el sistema de entretenimiento, HVAC, navegación, control de crucero, etc., están documentadas en un grueso libro en la guantera. El ensamblaje es como mi Plymouth de 1973: no había mucho, pero en forma cruda no era tan capaz como lo que estoy manejando ahora. El montaje es de la misma manera; la complejidad viene en lo que le agregas.
Blrfl
1

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.

viejo contador de tiempo
fuente
Estos argumentos me parecen anticuados. Si está utilizando un compilador moderno que fue escrito en los últimos 10 años, entonces creo que tendrá dificultades para escribir un programa ensamblador que sea significativamente más efectivo que un programa C. A menos que tal vez, está utilizando una arquitectura de dinosaurio de 30 años como PIC o 8051, entonces tendrá un programa lento, no importa lo que haces ...
Es bastante trivial arreglar el ensamblaje lento generado por los gcc y llvm más modernos. El 4.x gcc produce un código más lento y menos eficiente que la serie 3.x (para algunos objetivos, al menos los que he evaluado, ARM por ejemplo). Creo que es importante disipar la noción de que el compilador funciona mejor que los humanos porque no lo es. E incluso cuando lo hace, solo lo hace cuando el humano sabe lo que está haciendo. "conozca sus herramientas" si desea utilizarlas de manera efectiva. Comience con C y use ASM cuando sea necesario si puede justificarlo ...
old_timer
Como gcc es de código abierto, es una bestia extraña. Tal vez ese puerto en particular está mal hecho. Todas las optimizaciones de código deben hacerse para la plataforma específica, eso no es una tarea trivial. Sería más justo comparar el rendimiento del ensamblador manual versus un compilador comercial para esa plataforma.
gcc es multi-objetivo, por lo que hace un trabajo bastante bueno en promedio, pero no es un gran trabajo para ningún objetivo en particular. Y eso es lo que se espera. pero su punto sobre un compilador moderno, los últimos 10 años, etc. Simplemente no se cumple, los compiladores no están mejorando en cuanto al código producido, están mejorando en cuanto a idiomas y objetivos y características a costa del código producido. La idea de que cualquier compilador moderno hace el mejor código posible es simplemente falsa. Muy cierto que, en promedio, es MUCHO mejor que un ensamblador codificado a mano, difícil de hacer que cualquier proyecto de tamaño decente sea mejor que C
old_timer
Es por eso que la mayoría de la gente dice que use C hasta que haya un problema y luego repare el problema a mano si puede justificarlo. ¿realmente necesita ese pequeño aumento de rendimiento? ¿Es realmente donde está su problema de rendimiento? ¿Desea mantener este código con asm? ¿Continuará verificando cada compilador futuro para ver si su salida repara o reduce su problema? a un nivel aceptable, etc.
old_timer
1

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).

Brendan
fuente
-3
  1. Relativamente bueno para la eficiencia de la programación.
  2. Es fácil programar usando lenguaje c en lugar de usar ensamblador.
  3. El lenguaje C puede ser bastante más rápido que el lenguaje ensamblador.
  4. Es posible escribir ensamblado en código C pero no C en código ensamblador.
Kiran Sapkale
fuente
3
ventajas solamente ...
Kiran Sapkale
3
Esta es solo una versión reformulada de ¿Cuáles son algunas de las ventajas / desventajas de usar C sobre el ensamblaje? ; No agregaste nada nuevo a la discusión aquí.
Martijn Pieters