No me gustó esta pregunta, ya que no se puede responder fácilmente, pero quizás pueda reformular: "¿Qué impide que Embedded cambie de idioma?"
Por ejemplo, casi vemos C / C ++ para embebido (creo que también he oído mencionar ADA antes? Corrígeme si estoy equivocado)
Pero, ¿qué impide exactamente que el mundo integrado cambie de idioma? ¿Es solo que C es demasiado fácil de usar o simplemente no hay realmente una "necesidad" de cambio ya que C hace todo bien?
Esto siempre me ha desconcertado, no es que me esté quejando. Dado que mantenerlo en unos pocos idiomas mantiene las cosas estandarizadas. Pero aún queda la pregunta.
Me doy cuenta de que esta es una especie de pregunta subjetiva, sin embargo, mi pregunta principal es "Por qué" y no "SI / CUÁNDO"
Respuestas:
En primer lugar: olvidarse de "incrustado", ya que no es una distinción útil. La propiedad más importante es "limitada por recursos". El recurso más importante suele ser el tiempo, en cuyo caso hablamos de sistemas en tiempo real, pero también puede ser memoria o potencia.
La adopción de un nuevo lenguaje es difícil y raro. Requiere una nueva capacitación, nuevas herramientas y encontrar una buena manera de trabajar con el nuevo idioma. Esto es costoso, especialmente para los primeros usuarios. También es un problema de gallina y huevo: sin una gran base de usuarios no habrá herramientas y bibliotecas de buena calidad, pero sin ellas no habrá una gran base de usuarios. Por lo tanto, un nuevo idioma debe tener una gran ventaja sobre los existentes, de lo contrario no tendrá ninguna posibilidad.
La mayoría de los nuevos desarrollos "recientes" en idiomas han estado llenando la brecha entre la potencia de CPU disponible y lo que el usuario necesita. En otras palabras: pueden ser ineficientes en velocidad, pero compensan siendo más fáciles para el programador. Piense en el surgimiento de lenguajes como Java, Python, Perl, Tcl que esencialmente son ejecutados por un intérprete (tal vez después de una compilación) y hacen un uso intensivo de la administración de memoria dinámica. Pero esto no coincide bien con el mundo con recursos limitados, donde queremos obtener a) la mayor parte de los recursos disponibles, incluso a expensas de un mayor esfuerzo de programación, yb) un uso predecible de los recursos.
C y C ++ (o un subconjunto adecuado) siguen siendo los lenguajes de más alto nivel que son de uso común (lo suficiente como para contar con buenas herramientas, suficientes programadores capacitados y amplias bibliotecas) que pueden cumplir con los requisitos predecibles de espacio y tiempo que no están muy lejos de lo que es posible en el hardware actual. El único contendiente es, creo, Ada, pero ha sufrido un mal comienzo: las primeras implementaciones fueron (¿percibidas como?) Demasiado lentas e ineficientes, y ahora (a pesar de que hay buenas implementaciones disponibles) el lenguaje se ha retrasado un poco en características (en comparación con C ++). Personalmente, creo que es una lástima, en igualdad de condiciones, prefiero volar en un avión programado en Ada que uno que se haya hecho en C o C ++.
fuente
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.
fuente
La mayoría de las respuestas ya indicaban las razones históricas (bien conocido, todos lo usan, no sería fácil cambiar los hábitos, etc.). Si bien estoy de acuerdo con ellos, debemos tener en cuenta que hay otra razón importante.
Es no que "C es una mala elección o anticuado pero todavía lo utilizan por costumbre" (como los teclados QWERTY).
C es en sí mismo una muy buena opción para el desarrollo integrado, especialmente en aplicaciones de tiempo crítico. ¿Por qué?
tiene un nivel lo suficientemente bajo como para ser utilizado fácilmente para implementar programas en tiempo real. Si necesita medir el tiempo en nanosegundos, tiene que atrapar una interrupción cada 5 microsegundos, o tiene que usar exactamente 64 bytes de RAM total, entonces con un lenguaje de muy alto nivel, a menudo sería imposible o muy difícil resolverlo . C le brinda un control mucho mejor sobre el hardware que los lenguajes de nivel superior, esta es una de las diferencias más importantes entre el desarrollo para embebido frente a PC.
es lo suficientemente alto como para ser rápido y fácil de codificar, en comparación con el ensamblaje.
Entonces, C es el mejor (o uno de los mejores) compromiso entre la velocidad y el acceso directo al hardware de Assembly, y la fácil lectura y comprensión de lenguajes de alto nivel.
fuente
unsigned char i=63,j=128; do {something;} while(--j); while(--i);
no será tan legible comounsigned int i=16000; do {something;} while(--i);
, pero se ejecutará más rápido y será más eficiente en el PIC. Si el código se moviera al ARM, el segundo enfoque sería más eficiente, pero el primero aún funcionaría.Es exactamente la misma razón por la cual en la programación regular los lenguajes (más utilizados) no cambian (realmente):
fuente
En el mundo integrado, puede ser mucho más difícil (o imposible) proporcionar actualizaciones de software, por lo que es aún más crítico garantizar la corrección. Lamentablemente, C proporciona muy poca ayuda a este respecto y permite que el programador juegue rápido y suelto.
Me duele usar C para sistemas embebidos, y desearía poder al menos subir a C ++ por los muchos beneficios que proporciona en forma de restricciones como const, referencias, escritura de stringer, etc.
Supongo que la respuesta es simplemente que estamos atrapados con C porque cambiar no es comercialmente viable. Todos conocen C, hay muchos compiladores, bibliotecas y herramientas para generarlo. Con un nuevo lenguaje, estaríamos comenzando desde cero.
Supongo que es por eso que la gente todavía usa PHP .
fuente
¿Nadie ha oído hablar de SPARK Ada?
Esta es una versión "pequeña" del lenguaje Ada y las herramientas de desarrollo relacionadas para sistemas integrados, por ejemplo, aviónica y otras aplicaciones críticas para la seguridad, como equipos médicos.
Los estudios han demostrado solo una pérdida del 5-10% en la velocidad de procesamiento en comparación con C / C ++ con la codificación SPARK más confiable.
Creo que la proliferación de C en los sistemas integrados se debe a razones económicas:
Ya está allí y, por lo general, funciona para la mayoría de las aplicaciones, y la mayoría de las aplicaciones en volumen no son críticas, nadie morirá si la lavadora se desborda, entonces, ¿por qué cambiar?
El conjunto de herramientas SPARK será un gasto adicional en sí mismo y para que el personal de capacitación lo use.
Los beneficios adicionales de SPARK (u otros lenguajes que no son C) para el controlador / sistema de administración incorporado pueden no ser suficientes para justificar la prima necesaria en el precio del producto a los ojos del consumidor, especialmente cuando ven a las marcas rivales aparentemente "buenas" vendiéndose Por un precio más bajo.
La compañía AdaCore tiene cuidado de no profundizar demasiado en las aplicaciones del mercado masivo, ya que estas inevitablemente exigirán un gran aumento en el personal de soporte técnico para tratar problemas no centrales. AdaCore es una compañía experta de alto nivel, se enorgullece como tal y presenta sus productos y servicios en compañías de alta tecnología. Es inusual que un idioma penetre en nuevos mercados a menos que sus principales partes interesadas realmente lo deseen.
Entonces, @ Wouter, ¡no debes preocuparte por morir en los cielos por falta de código incrustado de Ada!
Ya está en los sistemas de aviones durante muchos años. Del mismo modo para su marcapasos.
Pero para el lavavajillas, el sistema de control de servicios de construcción, el controlador del horno de laboratorio y otras arenas no tan estrictamente reguladas, ¿vale la pena económicamente hacer un esfuerzo adicional?
fuente
Supongo que la razón principal de la popularidad de C es que primero: C es popular y mucha gente lo sabe y segundo: ninguno de los nuevos lenguajes populares como Java, C # e incluso muchos aspectos de C ++ son adecuados para el trabajo integrado. Básicamente, los otros 3 lenguajes que mencioné dependen mucho de la memoria dinámica, que trae consigo la ejecución no determinista del programa, los objetos, que traen memoria dinámica, los requisitos de memoria grandes (ya que uno de los lados más importantes de OO es el uso de mayor número de clases), la creciente popularidad de la compilación justo a tiempo (y muchas plataformas integradas ni siquiera pueden compilar su propio código C) ...
También está el hecho de que muchas de las bibliotecas que se envían con Java o C # son inútiles para una gran cantidad de proyectos integrados.
Por otro lado, tenemos idiomas más antiguos como Pascal o Basic. Desde mi punto de vista, no son tan populares porque C se convirtió en el lenguaje "estándar de la industria" y una gran cantidad de programadores e ingenieros aprenden C hoy. En algunas escuelas, Pascal o Basic ni siquiera se aprenden. También está el hecho de que muchos lenguajes populares hoy en día tienen una sintaxis similar a la de C y usar Pascal sería extraño para un programador de C.
En cuanto a FORTRAN, bueno, supongo que entró en un campo de nicho y es utilizado principalmente por ingenieros y científicos que trabajan en áreas donde hay un ecosistema adecuado para su uso. No veo ninguna razón en particular (aparte de las que mencioné para Pascal y Basic) no se usa en sistemas integrados.
Tenga en cuenta que en esta respuesta me concentré principalmente en sistemas más pequeños. También hay muchos dispositivos integrados que usan sistemas operativos más complejos como GNU / Linux o algún otro derivado de Unix y para programarlos, se puede usar más o menos cualquier lenguaje popualr.
fuente
C es un lenguaje muy simple, y en más de una ocasión se ha denominado lenguaje ensamblador sofisticado . Es casi la cantidad mínima de abstracción que puede proporcionar el código de ensamblaje anterior, ya que las construcciones C se asignan directamente a las construcciones a nivel de máquina.
Por esta y otras razones, es muy fácil implementar un compilador de C en un nuevo chip. Gran parte del trabajo ya está hecho, hay relativamente poca complejidad o cosas que pueden salir mal, y el control de bajo nivel le permite manejar con bastante facilidad cualquier peculiaridad que tenga su hardware.
C ++ se puede implementar (en realidad originalmente) como una capa de traducción de código fuente encima de C, lo que significa que obtienes C ++ (o al menos alguna versión de él) de forma gratuita con tu compilador de C.
Con C y C ++, usted es un programa de arranque prácticamente todo lo que necesita para su nuevo chip, por lo que es el lugar lógico para comenzar.
fuente
Algunas razones que los otros no han mencionado:
Espacio problemático: C es adecuado para sistemas pequeños y simples. Si todo lo que hace es reaccionar a las señales externas y presionar algunos números, entonces C funciona bastante bien (sin estructuras de datos complejas, sin malloc, sin manejo complejo de errores).
Volumen de producción: si tiene grandes series de producción, es económicamente razonable ahorrar en cada unidad de hardware y gastar más en programadores, porque la programación es un costo único.
fuente
Creo que es porque C / C ++ son los lenguajes de nivel más bajo y alto.
fuente
De hecho, para pequeños sistemas integrados, C es mucho más popular que C ++. Y la razón para eso es la misma que para no usar otros idiomas. C ++ requiere un tiempo de ejecución, a menos que regale la mayoría de las características que lo hacen diferente de C.
Además del ensamblado, C es el único lenguaje que sé que compila en código nativo y para el cual tener un tiempo de ejecución es opcional. Por lo tanto, se garantiza que será la huella más pequeña y el tiempo de ejecución más rápido en un entorno restringido (excepto si usa el ensamblaje).
Por otro lado, en sistemas embebidos medianos y grandes (con los cuales quiero decir más memoria y reloj, mayor tamaño de palabra) no diría que C (o C ++) es tan frecuente. He visto sistemas que admiten Python, Forth ... incluso Java.
Pero, por supuesto, casi siempre tiene la opción de usar C / C ++, obviamente, por las mismas razones que mencioné anteriormente. Y teniendo la opción, y siendo usted alguien que ya se siente cómodo con C para pequeños, ¿por qué elegiría otro idioma?
fuente