java - speed - python vs c
Utilice la herramienta adecuada para el trabajo: programaciĆ³n integrada (8)
Estoy interesado en lenguajes de programación bien adaptados para la programación embebida. En particular:
¿Es posible programar sistemas embebidos en C ++? ¿O es mejor usar C puro? ¿O es C ++ correcto solo si se excluyen algunas características del lenguaje (por ejemplo, RTTI, excepciones y plantillas)?
¿Qué pasa con Java en este dominio?
Gracias.
¿Es posible programar sistemas embebidos en C ++?
Sí, por supuesto, incluso en sistemas de 8 bits. C ++ solo tiene unos requisitos de inicialización de tiempo de ejecución ligeramente diferentes a los de C, ya que antes se debe invocar a los constructores main () para cualquier objeto estático. La sobrecarga (sin incluir los propios constructores que está bajo su control) para eso es pequeña, aunque debe tener cuidado ya que el orden de construcción no está definido.
Con C ++ solo pagas por lo que usas (y mucho de lo que es útil puede ser gratis). Es decir, por ejemplo, un fragmento de código C que también es compilable en C ++ generalmente no requerirá más memoria y se ejecutará más lento cuando se compila como C ++ que cuando se compila como C. Hay algunos elementos de C ++ que debe tener cuidado con, pero muchas de las características más útiles tienen un costo pequeño o gratis, y un gran beneficio.
¿O es mejor usar C puro?
Posiblemente, en algunos casos. Algunos objetivos más pequeños de 8 e incluso 16 bits no tienen compilador de C ++ (o al menos ninguno de cualquier reputación), el uso del código C dará una mayor portabilidad si eso fuera un problema. Además, en los destinos con limitaciones de recursos con aplicaciones pequeñas, los beneficios que C ++ puede aportar a C son mínimos. Las características adicionales en C ++ (principalmente aquellas que permiten OOP) lo hacen adecuado para la construcción de software relativamente grande y compleja.
¿O es C ++ correcto solo si se excluyen algunas características del lenguaje (por ejemplo, RTTI, excepciones y plantillas)?
Las características del lenguaje que pueden ser aceptables dependen completamente del objetivo y la aplicación. Si tiene limitaciones de memoria, puede evitar características o bibliotecas costosas, e incluso entonces puede depender de si se trata de un código o espacio de datos del que carece (en destinos donde están separados). Si la aplicación es difícil en tiempo real , evitaría aquellas características y clases de biblioteca que no sean deterministas.
En general, sugiero que si su objetivo es de 32 bits, siempre use C ++ en lugar de C, luego corte su C ++ para que se ajuste a la memoria y las limitaciones de rendimiento. Para partes más pequeñas, sea un poco más prudente al elegir C ++, aunque no lo descuente por completo; Puede hacer la vida más fácil.
Si elige usar C ++, asegúrese de tener un hardware / software de depuración decente que sea compatible con C ++. La relativa facilidad con la que se puede construir software complejo en C ++ hace que un depurador decente sea aún más valioso. No todas las herramientas en el campo incorporado son compatibles con C ++ o son capaces de hacerlo.
Siempre recomiendo buscar en los archivos de Embedded.com sobre cualquier tema incrustado, tiene una gran cantidad de artículos, que incluyen varios de esta pregunta, que incluyen:
- Pocas razones para rechazar C ++
- Programa de hombres reales en C
- Sumérgete en C ++ y sobrevive
- Pautas para usar C ++ como alternativa a C en diseños integrados
- ¿Por qué C ++ es una alternativa viable a C en el diseño de sistemas integrados?
- Mejor incluso en los niveles más bajos
Con respecto a Java, no soy un experto, pero tiene importantes requisitos de tiempo de ejecución que lo hacen inadecuado para sistemas con recursos limitados. Probablemente se limitará a un hardware relativamente caro utilizando Java. Su principal beneficio es la independencia de la plataforma, pero esa portabilidad no se extiende a las plataformas que no admiten Java (de las cuales hay muchas), por lo que es posiblemente menos portátil que una implementación de C o C ++ bien diseñada con una interfaz de hardware abstracta.
[edit] Concidentally acabo de recibir esto en el boletín TechOnline: Uso eficiente de C ++ en aplicaciones incrustadas
¿O es C ++ correcto solo si se excluyen algunas características del lenguaje (por ejemplo, RTTI, excepciones y plantillas)?
Es bueno estar pensando en estas líneas. La complejidad en tiempo de compilación no es un gran problema, pero la complejidad en tiempo de ejecución tiene un costo de recursos.
C ++ facilita la modularidad de clase / espacio de nombres (por ejemplo, el método foo()
en más de un contexto) y la modularidad de la instancia ( bar
campo miembro bar
pertenece a más de un objeto), los cuales son una gran ventaja en el diseño de software. También hay características como const
, referencias, conversiones estáticas y plantillas, que pueden ayudar a imponer restricciones y tienen poco o ningún costo de tiempo de ejecución.
No excluiría las plantillas . Son complejos de pensar y necesitas un compilador que los maneje bien, pero el costo de los recursos es casi todo el tiempo de compilación. Lo que te "costará" es el hecho de que cada vez que usas una plantilla con diferentes parámetros de clase, produce un nuevo conjunto de código para instanciar las funciones miembro. Pero es casi seguro que tendrías que hacer lo mismo sin plantillas. Además, las plantillas le permiten diseñar y probar bibliotecas para circunstancias generales, en archivos separados que se crean instancias en tiempo de compilación en lugar de tiempo de enlace. Solo para aclarar que: las plantillas le permiten tener un archivo Ah que usted prueba. Luego lo usas con el archivo Bh o Bc para crear una instancia en el momento de la compilación. (Una biblioteca se vincularía en lugar de compilarse, y esto la hace menos flexible; los métodos de plantilla se pueden optimizar para que no incurran en una llamada de función). He utilizado plantillas en sistemas integrados para implementar el código CRC y punto matemático: puedo probar el código general, ponerlo en el control de versiones y luego reutilizarlo varias veces escribiendo una clase simple que se deriva de una plantilla o tenga un campo de miembro de plantilla. El ejemplo clásico, por supuesto, es STL.
RTTI y excepciones : estas agregan complejidad en tiempo de ejecución. No tengo una buena idea del costo de los recursos, pero espero que RTTI sea bastante simple (solo agrega una etiqueta de tipo, lo que cuesta más espacio), mientras que las excepciones son probablemente bestiales, e involucran el desenrollado de la pila.
Funciones virtuales : solía descartarlas debido a los costos de memoria + tiempo de ejecución (mínimos pero todavía existen), así como a la complejidad de la depuración, pero permiten desacoplar los objetos entre sí. Si no usa funciones virtuales, cuando una instancia de una clase (por ejemplo, Foo) necesita ejecutar el código asociado con una instancia de otra clase (por ejemplo, Bar), la primera clase debe saber todo sobre la segunda (para compilar Foo). necesita tener un enlace estático a todos los métodos en Bar) - esto agrega una gran cantidad de acoplamiento apretado.
asignación de memoria dinámica : esta es otra gran cosa (que también está en C), que evitamos como la plaga en mi empresa; no solo hay todo tipo de errores que pueden surgir, sino que el gran costo del tiempo de ejecución es el asignador / Deallocator, y tiene que estar dispuesto y ser capaz de saber cuál es el costo y aceptarlo.
Edición: Me encantaría usar Java en lugar de C ++ en el mundo integrado. Desafortunadamente, mis opciones son limitadas y los costos de recursos de tiempo de ejecución (tamaño del código, tamaño de memoria, restricciones de tiempo de recolección de basura) son demasiado altos en el espacio en el que trabajo. Mi razón para usar Java es menor debido a sus beneficios de tiempo de ejecución y más para el el hecho de que su diseño de software sea mucho más limpio y las herramientas sean mucho mejores (OMG! refactoring! woohoo!) ... la clave para mí parece estar en dos cosas, que hacen que C / C ++ se sienta muy torpe en comparación:
que todo es un objeto y todos los métodos son virtuales, por lo que puede apoyarse en gran medida en las abstracciones de las interfaces.
la separación interfaz / implementación en Java no es esta cosa de división del archivo
.c/.h
que hace que los compiladores sean tan lentos. En contraste, utilizo Java en Eclipse y compila automáticamente el código justo cuando lo edito. ¡Esto es enorme! Encuentro la mayoría de mis errores de inmediato. En C / C ++ tengo que esperar un ciclo de compilación completo.
Algún día espero que haya un lenguaje entre C / C ++ y Java que ofrezca las ventajas de Java para el desarrollo de software, sin requerir las alarmas que hacen que Java sea tan atractivo para aplicaciones de escritorio / servidor pero poco atractivo en la mayor parte del mundo integrado.
Creo que ya tienes una gran respuesta de Clifford, pero le agregaré mi experiencia. Como se señaló, el tipo de sistema embebido es el controlador principal. En Defensa / Aeroespacial, C y Ada son los lenguajes integrados más populares que encuentro. Aunque a medida que pasa el tiempo, veo más C ++ a medida que el desarrollo basado en modelos se vuelve popular con herramientas como Rhapsody. En la lista de trabajos, ver los requisitos para la experiencia en Diseño Orientado a Objetos también me lleva a creer que el mercado está cambiando lentamente para seguir las tendencias del desarrollo general.
Si está realmente interesado en el desarrollo integrado, empezaría con C. Es bastante universal. Casi todos los sistemas operativos, incluidos los sistemas operativos en tiempo real como Integrity, Nucleus, VxWorks y Linux integrado, tienen un compilador y herramientas para ello. Las cosas que aprenderá sobre los punteros, la gestión de la memoria, etc. se traducirán al desarrollo de C ++ en el mundo integrado, al menos.
En cuanto a Java, si está interesado en el desarrollo para plataformas móviles como teléfonos inteligentes, esta es una opción sólida (Android viene a la mente). Pero en el mundo de los sistemas operativos en tiempo real, no lo he visto.
En esa nota, eso me lleva a mi último punto y consejo. Si quisiera saltar a la programación integrada (que hice hace 4 años), me concentraría en aprender C desde un punto de vista de bajo nivel como se mencionó anteriormente. Luego, también aprendería qué hace que la programación en tiempo real sea tan difícil / diferente. El siguiente libro me pareció bastante bueno para enseñarte a pensar como un programador integrado en lugar de un desarrollador de aplicaciones. ¡Buena suerte!
La mayoría de las veces en sistemas integrados, el lenguaje en el que está programando está determinado por el compilador que realmente está disponible.
Si su hardware solo tiene un compilador de C, eso es lo que va a usar. SI tiene un compilador de C ++ decente que realmente no hay razón para preferir C sobre C ++.
Me atrevería a decir que Java no es una opción muy popular en sistemas integrados.
La programación integrada en estos días abarca una amplia gama de aplicaciones.
A grandes rasgos, va desde sensores / interruptores hasta sistemas de seguridad completos.
Debe basar su idioma en la complejidad y los recursos de hardware.
Es una de las opciones junto a HW (CPU, ...), SO, protocolos, ...
opciones posibles:
- interruptores: ensamblador
- Dispositivos tipo enrutador: C y / o C ++
- dispositivos de mano: Java o QT / C ++
- Sistemas completos: combinaciones C y / o C ++ con python.
Realmente se reduce a qué plataforma de hardware está operando y, por lo tanto, qué plataformas de software están abiertas para usted. Para una gran cantidad de kits incorporados recientes, diseñados en torno a un sistema en chip, un megabyte o dos de RAM, algunos dispositivos, realmente desea un pequeño sistema operativo para administrar el hardware de bajo nivel mientras se concentra en su aplicación. La elección del sistema operativo limita el conjunto de idiomas disponibles.
Ciertamente es posible usar C ++ en el espacio incrustado, pero el conjunto completo de características del lenguaje requiere mucho trabajo para portar correctamente. Por ejemplo, eCos se implementa en una mezcla de C y lo que podríamos llamar los aspectos estructurales de C ++; El soporte para RTTI, las excepciones y el STL faltan en la versión gratuita, aunque hay personas que trabajan en esto (y un puerto comercial disponible).
De manera similar, es posible usar Java; lo sé, porté una JVM a un entorno integrado; no fue divertido, aunque normalmente se obtiene una configuración de lenguaje Java reducida, a menudo algo basado en J2ME.
Tanto C como C ++ pueden usarse en sistemas integrados. Si limita las funciones de C ++ que usa, entonces usará aproximadamente la misma velocidad y espacio que C. En cuanto al uso de estas funciones adicionales, realmente depende de sus restricciones. Por ejemplo, si está creando un sistema en tiempo real, entonces las excepciones pueden no ser una buena idea, simplemente porque considerar el tiempo de propagación de las excepciones y todos los caminos a través de los cuales se pueden propagar las excepciones pueden dificultar las garantías en tiempo real. aunque, nuevamente, la implementación de CORBA en tiempo real de ACE / Tao usa excepciones). Si bien las plantillas y RTTI pueden llevar a programas más grandes, existe una gran variabilidad en los sistemas integrados, por lo que, dependiendo de sus limitaciones de recursos, esto podría ser perfectamente correcto o inaceptable. Lo mismo ocurre con Java. Java (bueno, técnicamente, el lenguaje de programación Java con un subconjunto de la API de Java) se ejecuta en Android, por ejemplo, utilizando la máquina virtual Dalvik. J2ME se ejecuta en una variedad de dispositivos integrados. Si funcionará o no para su aplicación, depende de sus limitaciones particulares.
c es el lenguaje más común utilizado en los sistemas integrados.
Sin embargo, creo que el futuro de C ++ está en el dominio del sistema integrado. Creo que los estándares de C ++ 0x ayudarán en ese aspecto. Así que no me sorprendería ver que C ++ se usa mucho más en este campo.