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

13

Actualmente estoy estudiando ingeniería en Telecomunicaciones y Electrónica y hemos migrado de ensamblador a C en la programación de microprocesadores. Tengo dudas de que esta sea una buena idea. ¿Cuáles son algunas ventajas y desventajas de C en comparación con el montaje?

Las ventajas / desventajas que veo son:

Adventages:

  • Puedo decir que la sintaxis de C es mucho más fácil de aprender que la sintaxis del ensamblador.
  • C es más fácil de usar para crear 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:

  • El ensamblador es un lenguaje de programación de nivel inferior al C, por lo que es bueno para la programación directa en hardware.
  • Es mucho más flexible aludirte a trabajar con memoria, interrupciones, microrregistros, etc.
pregunta Daniel Conde Marin 09.03.2012 - 04:47

7 respuestas

15

Aquí hay algunas respuestas de desbordamiento de pila que pueden ayudarlo (estas son las respuestas principales, respuestas aceptadas):

Adventages

enlace (solo para usuarios de 10K) o Archivo

  • El ensamblaje se utiliza 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. No obstante, la mayor parte del gestor de arranque está escrito en C, una vez que se realiza la primera inicialización.
  • El ensamblaje se utiliza para escribir primitivas de bloqueo mutex. Es esencialmente imposible obtener un compilador de C para emitir instrucciones de barrera de memoria en los lugares requeridos.
  • Las rutinas como memset () o memcpy () a menudo se realizan en ensamblaje. Por ejemplo, escribí un memset () con un gran bucle desenrollado, que calcula de forma dinámica una dirección de rama para saltar a la mitad de ese bucle para una iteración final. Una rutina de C habría generado más código, tomando I $ extra extra. 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 dramáticamente memcpy (), que el compilador de C no utilizará.

Desventajas

enlace

  • ASM tiene poca legibilidad y no se puede mantener realmente en comparación con los idiomas de nivel superior.
  • Además, hay muchos menos desarrolladores de ASM que para otros idiomas más populares, como C.
  • Además, si utiliza un lenguaje de nivel superior y las nuevas instrucciones de ASM están disponibles (por ejemplo, SSE), solo necesita actualizar su compilador y su código anterior 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).

enlace

    
respondido por el jmq 09.03.2012 - 05:07
18
  • C es más fácil de programar en comparación con Assembly. Hay obvias razones que no vale la pena repetir.

  • Siendo más fácil de usar, C te 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) como ensamblador escrito a mano, si no mejor.

  • C es bastante bajo, y es raro que quieras ir mucho inferior. Tener una capa de abstracción agregada rara vez es algo malo.

  • Cuando necesite bajar, puede usar Ensamblaje, de lo contrario puede utilizar C.

  • Puede escribir ensamblado en código C, pero no C en código ensamblador.

respondido por el BBB 09.03.2012 - 04:57
14

Un programa en C se puede compilar para diferentes arquitecturas de microprocesadores.

    
respondido por el cgull 09.03.2012 - 05:09
4
  

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

No temas, ya nadie desarrolla nuevos programas en ensamblador al 100%. Hoy en día, C se puede usar incluso para las arquitecturas de 8 bits más pequeñas y crappiest. Sin embargo , saber que un ensamblador te hace un programador de C significativamente mejor. Además, siempre hay algunos pequeños detalles o dos en un programa que deben escribirse en un ensamblador.

  

Puedo decir que la sintaxis de C es mucho más fácil de aprender que la sintaxis de 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 más amplio. Pero, de nuevo, es posible que no necesite aprender todos los detalles.

  

C es más fácil de usar para crear 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, más 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 una gran cantidad de funcionalidades, bibliotecas y recursos prefabricados, por lo que habrá menos reinvención de la rueda. Pero aparte de eso, tu declaración es subjetiva. Creo que es una cuestión de preferencia personal.

Por ejemplo, soy un programador de C experimentado, ocasionalmente programo C ++. Me encuentro mucho menos productivo en C ++, porque no conozco ese lenguaje tan bien como con C. Pero el hecho de que me sienta así no significa necesariamente que la programación en C sea más productiva que la programación en C ++. Un programador experimentado en 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 se tarda en solucionar los errores provocados por el mantenimiento. C es mucho más fácil de mantener que el ensamblador.

  

El ensamblador es un lenguaje de programación de nivel inferior al C, por lo que es bueno para la programación directa en hardware.

La programación del hardware se puede hacer directamente en cualquiera de los dos idiomas. Las únicas cosas que no puede hacer en C son acceder a los punteros de pila y los registros de condición, etc., del núcleo de la CPU. Entonces, si por programación de hardware quiere decir que está hablando con su propia CPU, entonces sí, el ensamblador permite un poco más de C. Si quiere decir que accede a un hardware externo, entonces el ensamblador no ofrece ningún beneficio sobre C. Pero quizás las desventajas, ya que a menudo es más difícil escribir Código genérico de ensamblador para un dispositivo externo en particular, que código genérico C.

  

Es mucho más flexible aludirte a trabajar con memoria, interrupciones, microrregistros, etc.

Esto no es correcto. C le permite hacer todo eso también, aunque es posible que tenga que confiar en el código C específico del compilador, como la palabra clave de interrupción.

Al final, necesita saber ambos idiomas para programar MCU, con énfasis en C.

    
respondido por el user29079 19.03.2012 - 16:40
1

Dependiendo de la cantidad de incrustaciones a las que deba ir, C producirá programas grandes y lentos. Lo que aumentará notablemente el costo de esa parte 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 del software son más baratos, de nuevo, eso puede ser verdadero o falso, si está profundamente incrustado y apunta a una parte de bajo poder, pequeña y económica, no se habla mucho de 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, tiene que volver a escribir cada objetivo. Con la serie cortex-m de ARM, ahora estamos empezando a ser capaces de que C compita con asm, no es que la gente no haya estado utilizando C u otros idiomas de nivel superior en sus productos integrados, pero lo han hecho a un costo. / p>

El debate C vs ASM, profesionalmente, se reduce a escribirlo en C y usar ASM donde se pueda justificar. Y puedes justificarlo. En el mundo embebido 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 las pic32, que son mips) a un costo enorme, es un conjunto de instrucciones espantoso para compiladores, un conjunto de instrucciones muy educativo e interesante pero un compilador hostil. msp430, avr, arm, thumb, mips, todo bueno para compiladores. 8051 también malo.

Incluso más que el lenguaje las herramientas. En aquellos casos en los que 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 incluir un solo mod de gcc, administrado por un grupo, es arriesgado desde una perspectiva empresarial. Es probable que encuentre más de un ensamblador, y cualquier persona que valga la pena estar en ese equipo podría preparar un ensamblador en un fin de semana (siempre que el ensamblaje que escriba no sea una directiva y esté feliz). Tanto para asm como para C, querría usar herramientas de código abierto (o las suyas en casa) donde tenga una mejor oportunidad, incluso si eso significa usar una máquina virtual para ejecutar una distro de Linux de 10 años, de tener herramientas disponibles para La vida del producto.

La línea de fondo, nuevamente, usa / aprende / enseña tanto C como asm, comienza con C y usa asm donde puedas justificarlo.

    
respondido por el old_timer 10.03.2012 - 15:17
1

Para el ensamblaje hay un compromiso inevitable entre la capacidad de mantenimiento y el rendimiento del código. Puede escribir un ensamblaje fácil de leer o mantener, o puede escribir código altamente optimizado; pero no puedes hacer ambas cosas.

Para C, el compromiso no desaparece del todo, pero es mucho menos perceptible: puede escribir y mantener una C que esté razonablemente bien optimizada.

Un excelente programador en lenguaje ensamblador será capaz de vencer al compilador casi todo el tiempo, pero la mayoría de las veces elegirá escribir código fácil de leer y mantener; y, por lo tanto, un excelente compilador será derrotado por un compilador la mayor parte del tiempo.

La forma inteligente es usar tanto ensamblaje como C (en lugar de solo ensamblar o solo C), por ejemplo. use C para partes del código donde un excelente programador de lenguaje ensamblador hubiera elegido escribir código mantenible / lento, y use ensamblaje para el resto (donde realmente se justifica "altamente optimizado y difícil de mantener").

    
respondido por el Brendan 22.12.2014 - 18:47
-3
  1. Relativamente bueno para la eficiencia de la programación.
  2. Es fácil programar usando lenguaje c en lugar de usar ensamblaje.
  3. El lenguaje C puede ser bastante más rápido que el lenguaje ensamblador.
  4. Es posible escribir el ensamblaje en código C pero no C en el código de ensamblaje.
respondido por el Kiran Sapkale 22.12.2014 - 16:22

Lea otras preguntas en las etiquetas

Comentarios Recientes

5 C no tiene absolutamente ninguna limitación en su capacidad para invocar otras API de C y tiene un sistema de plantillas simple y elegante. Esta plantilla de configuración y las API de extensión con las que se genera también son extensibles y se puede acceder con, por ejemplo, C ++ Builder. Este escenario explica por qué C ++ Builder se utilizó como herramienta de compilación en el proyecto que hice. El ensamblaje es general: como cualquier otro lenguaje, C admite el desarrollo y la depuración del código... Lee mas