Con sistemas embebidos basados en microcontroladores de 8 y 16 bits, todo se reduce a que es más fácil desarrollar un software que se adapte a los recursos limitados de estas limitaciones de almacenamiento muy modestas (quizás unos 100 bytes de RAM para microcontroladores de 8 bits de gama baja). , con 2-8 KiB de ROM o EPROM / Flash para almacenamiento de código).
En esos casos, los lenguajes pequeños como C o ensamblado tienden a ser los lenguajes de desarrollo más utilizados. Como una comparación relativa muy aproximada, un ensamblador completo y un compilador C99 pueden caber en un solo disquete, mientras que necesita varios MiB para un sistema de desarrollo C ++ moderno (con STL, etc.).
Cuando está buscando micros de gama alta (16 bits de alta gama, y en su mayoría de 32 bits, con 64 bits bastante raros) y DSP en entornos integrados, las restricciones se debilitan y el desarrollo de software puede constituir la mayor parte del desarrollo esfuerzo, por lo que tiene sentido utilizar las herramientas de desarrollo más productivas, incluidos los lenguajes más avanzados con características como lenguajes de programación orientada a objetos (OOP) como C ++ y lenguajes más nuevos (Java, Perl, Ruby, Python).
Es posible en el ensamblaje y en C predecir cuánta memoria se está utilizando, de modo que un diseño con espacio limitado es factible, pero las características avanzadas como plantillas, manejo de excepciones y enlace de tiempo de ejecución hacen que sea imposible saber exactamente la huella de memoria necesaria para un programa estándar de C ++ por adelantado. No sé lo suficiente sobre MISRA C ++ , que es un subconjunto de C ++, para comentarlo.
Los lenguajes basados en máquinas virtuales que ejecutan código de bytes (Java, Perl, Python) son menos maduros en la experiencia del desarrollador integrado, y como estos lenguajes están diseñados para aislar al programador del hardware en particular, también hace que sea más difícil ser consciente de limitaciones y restricciones de dicho sistema de hardware integrado. Este es un problema menor con los procesadores rápidos de 32 bits (por ejemplo, ARMv7) con MiB, si no GiB de RAM.
Todas las implementaciones de BASIC que conozco son bastante simplistas en las características del lenguaje, y se mantienen en gran medida fieles al legado de Dartmouth BASIC de la década de 1960. Esto significa que el lenguaje no tiene bibliotecas de tiempo de ejecución complejas o manejo de excepciones, y un intérprete o compilador es bastante simple de escribir y también tiene un tamaño de archivo pequeño. La mayoría de los microcontroladores tienen al menos un compilador BASIC disponible para ello.
Espero que describa a grandes rasgos las razones por las que encontrará que C y el ensamblaje se usan principalmente en sistemas embebidos más pequeños o más antiguos, y con las limitaciones de los nuevos sistemas embebidos de gama media a alta, difieren solo ligeramente de una computadora personal de escritorio tradicional.