[eside-ghost] sistemas embebidos, C vs C++

Jon Valdés juanval en gmail.com
Mar Nov 25 13:11:37 CET 2008


On Tue, Nov 25, 2008 at 12:19 PM, halls <frikihalls en gmail.com> wrote:
> wop!
>
> En el curro donde estoy estabamos realizando un proyecto con
> microcontroladores de la familia MSP430 de Texas Instruments [1] y por una
> serie de razones vamos a repensarlo y reorganizarlo todo desde cero de una
> forma mas estructurada y mas bonito y mas genial todo.
>
> Hasta ahora el proyecto lo estabamos escribiendo en C++, utilizando el IAR
> Workbench [2] como IDE, con su propio compilador y tal. Y aqui nos ha
> surgido el problema. A la hora de decidir en que lenguaje lo desarrollamos
> tenemos division de opiniones. Los que vienen de software de PC son mas
> partidarios de C++, mientras que los que vienen de microcontroladores y
> ensamblador, son mas partidarios de C.
>
> El problema basico viene siendo un balance entre optimizacion (algunos de
> los micros que usamos solo tienen 128 bytes de RAM), facilidad de codigo,
> rapidez de ejecucion (tanto de los micros como del tiempo requerido para
> realizar el proyecto), y portabilidad.
>
> En concreto yo estoy ahi dubitativo entre uno y otro, pero hasta ahora me
> convence mas el uso de C (bien estructurado y bien pensado desde el
> principio). Mi razonamiento es que siendo sistemas embebidos, donde los
> recursos son muy limitados, conviene tener control al detalle de lo que se
> hace, y la facilidad que te dan las herencias de C++ y que no hay en C se
> pueden paliar con un buen diseño base.

En mi opinión, la potencia de C++ viene de 3 cosas: polimorfismo,
templates y la STL.

El asunto de polimorfismo es delicado en sistemas tan limitados,
porque las llamadas a funciones virtuales tienen un coste de
rendimiento, nimio en un PC, pero nada despreciable en bichos tan
pequeños. Aparte que sólo la vtable de un objeto con cuatro funciones
virtuales ya se te come la mitad de la RAM que teneis disponible (128
bytes, uugggg) :-S

Asi que en la práctica estás limitado a herencia sin funciones
virtuales (ni clases virtuales, que también necesitan una vtable).

Por otro lado, la STL es bastante tocha para meterla en sistemas asi
de pequeños. Incluso partes pequeñas como std::vector probablemente
sean mucho mas grandes en código que soluciones hechas in-house (aqui
estoy suponiendo que también estais limitados en cantidad de memoria
que podeis usar para almacenar el código).

Asi que quedan las templates, que permiten hacer muchas virguerías...
pero también hace falta ser bastante gurú para entenderlas (y no digo
ya para programarlas). Y bueno, al menos GCC tiene unas extensiones
bastante guapas para permitir hacer bastantes cosas tipo templates en
C [1]

No sé, a mi me encanta C++, pero está claro que hay sitios donde no
puedes explotarlo al máximo. En este caso yo consideraría C muy
seriamente...  aunque siempre podeis programar en C++ como si fuera "C
with classes". Vamos, cambiar la palabra struct por la palabra class,
y programar como si fuera C. En ese caso no tendríais pérdidas de
rendimiento por usar C++, y siempre podríais usar las features más
potentes del lenguaje si en algún momento las necesitais

O eso creo yo.
Taluegoooo

[1] http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/?S_TACT=105AGX01&S_CMP=HP


Más información sobre la lista de distribución eside-ghost