una - ¿Para escribir un bootloader en C o C++?
tipos de variables en c++ y sus rangos (10)
Estoy escribiendo un programa, más específicamente un gestor de arranque, para un sistema integrado. Voy a utilizar una biblioteca de C para interactuar con algunos de los componentes de hardware y tengo la opción de escribirla en C o C ++. ¿Hay alguna razón por la que debería elegir una sobre la otra? No necesito las características orientadas a objetos de C ++ pero tiene un sistema de tipos más fuerte. ¿Podría tener otras características de lenguaje que harían el programa más robusto? Sé que algunas personas evitan C ++ porque puede (pero no siempre) generar imágenes de firmware grandes.
El lenguaje C es sustancialmente más fácil de analizar que C ++. Esto significa que un programa que es válido tanto para C como para C ++ válido se compilará más rápido como un programa en C. Probablemente no sea una preocupación importante, pero es solo otra razón por la cual C ++ es probablemente una exageración.
Escribir programas en C no es lo mismo que escribirlos en C ++. Si sabe cómo hacerlo solo en C ++, entonces su elección es C ++. Para escribir el gestor de arranque, será mejor minimizar el código, por lo que probablemente tendrá que deshabilitar la biblioteca estándar de C ++. Si sabe cómo escribir en C, entonces debería usar C, es una opción más común para este tipo de tareas.
Esta no es una pregunta particularmente sencilla de responder. Depende de una serie de factores que incluyen:
- Cómo prefieres diseñar tu código.
- Si hay un compilador de C ++ disponible para su destino (y cualquier otro objetivo en el que desee utilizar el cargador de arranque).
- Qué tan crítico es el tamaño del código para su aplicación (estamos hablando de un 10% más, quizás no de MB, como lo sugiere otra respuesta).
Personalmente, me gustan mucho las clases como una forma de diseñar mi código. Incluso cuando escribo el código C, tiendo a mantener todo en archivos modulares con funciones estáticas de alcance de archivos que "simulan" funciones miembro y (unas pocas) variables estáticas de alcance de archivos para "simular" las variables miembros. Dicho esto, la mayoría de mis proyectos incrustados existentes (todos los cuales son de escala relativamente pequeña, hasta un máximo de 128 kB incluyendo el cargador de arranque, pero generalmente menos) han tendido a escribirse en C. Ahora que tengo un compilador de C ++, sin embargo, Ciertamente estoy considerando mudarme a C ++.
C ++ presenta ventajas considerables al utilizar referencias, sobrecargas y plantillas, incluso si no va tan lejos como las clases. Ciertamente, me quedaría sin utilizar muchas más funciones avanzadas, incluido el uso de la asignación de memoria dinámica (nueva). Por otra parte, también evitaría la asignación de memoria dinámica (malloc, etc.) en C incrustada si es posible.
Si tiene un compilador de C ++ (incluso si solo es g ++), vale la pena ejecutar su código a través de él solo para la comprobación de tipo adicional, de modo que pueda reducir la cantidad de problemas en su código. El compilador de C ++ puede detectar algunas cosas que incluso las herramientas de análisis estático no detectarán.
Para una buena discusión sobre muchas razones inválidas, la gente rechaza C ++, vea el artículo de Dan Saks en Embedded.com .
La mayoría de las respuestas anteriores asumen que su gestor de arranque es pequeño y simple, lo que suele ser el caso; sin embargo, si se vuelve más complejo (es decir, debe poder cargar desde un puerto Ethernet, un puerto USB o un puerto serie ... debe validar el código que se está cargando antes de borrar su código existente) etc.) es posible que desee considerar C ++.
También descubrí que el cargador de arranque y la aplicación generalmente comparten cierta cantidad de código común, por lo que es posible que también desee considerar el uso del mismo idioma que su aplicación para facilitar el intercambio de código.
Para un cargador de arranque, la elección obvia es C, especialmente en un sistema integrado. El código generado deberá estar cerca del metal y muy fácil de depurar, probablemente al colocarlo en el ensamblaje, lo que rápidamente se vuelve difícil sin cuidado en C ++. Además, las cadenas de herramientas C son mucho más ubicuas que las cadenas de herramientas C ++, lo que permite que su cargador de arranque se utilice en más plataformas. Por último, los binarios generados suelen ser más pequeños y utilizan menos memoria cuando se escriben en C.
Para una tarea tan específica como un gestor de arranque, definitivamente no usaría C ++. Creo que la biblioteca estándar de c ++ es al menos un par de MB, no algo que se quiera en un cargador de arranque. Ir con C.
Si no necesita usar la Orientación de objetos, use C. La opción simple allí. Es más simple y más fácil, mientras que realiza la misma tarea.
Algunos fallecidos no estarán de acuerdo, pero OO es lo que hace que C ++> C, y viceversa en muchas circunstancias.
Utilice C con µClibc . Hará su código más simple y reducirá su huella. Se puede encontrar en: www.uclibc.org .
Vaya con C ++ y objchoose las funciones de idioma que necesita. Aún tiene el control total del código de objeto de salida siempre que comprenda las abstracciones de C ++ que está utilizando.
El uso de OO aún puede funcionar bien si evita el uso de funciones virtuales. Evite los tipos de objetos inmutables que requieren una gran cantidad de copias para pasar valores, como std :: string. Pero, aún puede usar características como plantillas sin ningún impacto real en el rendimiento del tiempo de ejecución.
Yo usaría C a menos que haya una razón específica para usar C ++. Para un Bootloader realmente no va a necesitar OO.
Utilice la herramienta más sencilla que realizará el trabajo.