¿Por qué usar C?

¿Por qué se utiliza C para escribir controladores y códigos de sistema operativo?

¿Hay un problema de tamaño?

¿Hay controladores escritos en otros idiomas?

¿En qué idioma se escribieron XP, Vista y Solaris?

C comstack a código de máquina y no requiere ningún soporte de tiempo de ejecución para el lenguaje en sí. Esto significa que es posible escribir código que pueda ejecutarse antes de que existan sistemas de archivos, memoria virtual, procesos y cualquier otra cosa que no sean registros y RAM.

En entornos críticos para la seguridad (piense en aviónica, naves espaciales, dispositivos médicos, transporte, software de control para el control de procesos), los sistemas (así como los controladores) a menudo se escriben utilizando Ada o incluso SPARK / Ada .

Para aclarar: generalmente se entiende que C es un nivel bastante bajo, y más o menos como un “lenguaje macro” para el ensamblaje en sí, de ahí también proviene su poder (velocidad, tamaño, portabilidad).

Ada, por otro lado, ha sido diseñado específicamente para aplicaciones críticas para la seguridad teniendo en cuenta la verificabilidad, para citar a Ada 2005 para sistemas de misión crítica :

Ada [9] es el lenguaje de elección para muchos sistemas críticos debido a su diseño cuidadoso y la existencia de directrices claras para la construcción de sistemas de alta integridad [10]

Ahí también es donde entra en juego el apoyo de Ada para una tipificación fuerte, así como una serie de otras características importantes (cita el diseño para mayor seguridad ):

Los lenguajes de progtwigción difieren enormemente en su idoneidad para el uso en sistemas relacionados con la seguridad. Carré et al. identificó seis factores que influyen en la idoneidad de un lenguaje para aplicaciones de alta integridad [Carré 1990]. Estos son:

  • Solidez lógica
  • Complejidad de definición
  • Poder expresivo
  • Seguridad
  • Verificabilidad
  • Limitaciones de tiempo y espacio acotadas.

Ningún lenguaje de progtwigción estándar funciona bien en todas estas áreas, aunque algunos (como Pascal y Ada) funcionan mucho mejor que lenguajes como C o C ++. En aplicaciones altamente críticas, la “verificabilidad” es de gran importancia. Ciertos lenguajes permiten el uso de potentes herramientas de verificación de software para realizar una amplia gama de pruebas estáticas en el código para detectar un rango de errores de progtwigción. […] Un tema importante en la selección de un lenguaje de progtwigción es la calidad de los comstackdores disponibles y otras herramientas. Para ciertos idiomas están disponibles los comstackdores validados. Si bien no garantiza la perfección, la validación aumenta enormemente nuestra confianza en una herramienta. Desafortunadamente, los comstackdores validados solo están disponibles para un número limitado de idiomas, como Ada y Pascal. Además de los comstackdores, los desarrolladores de sistemas críticos utilizarán una gama de otras herramientas, como los paquetes de análisis de código estático. Las pruebas estáticas que se pueden realizar en un fragmento de código varían mucho según el idioma utilizado. Para facilitar este proceso, es común restringir las funciones que se utilizan en ciertos idiomas a un ‘subconjunto seguro’ del idioma. Los lenguajes bien estructurados y definidos, como los subconjuntos de Ada, Pascal y Modula-2, permiten realizar una gran cantidad de pruebas, como análisis de flujo de datos, análisis de uso de datos, análisis de flujo de información y verificación de rango. Desafortunadamente, muchas de estas pruebas no se pueden realizar en lenguajes como C y C ++.

Sería realmente más allá del scope de esta pregunta entrar en más detalles, pero es posible que desee revisar algunos de los siguientes puntos:

  • Ada en comparación con C y C ++
  • Ada vs. C
  • Cuantificando el debate: Ada vs. C ++
  • ¿Por qué elegir Ada como lengua de enseñanza? (Ada vs. C en la universidad)
  • Comparando los costos de desarrollo de C y Ada ( resumen )
  • C / C ++ / Java Pitfalls y Ada Beneficios
  • ¿Ada es una mejor C?
  • Ada, C, C ++ y Java vs. The Steelman
  • Ada: disipando los mitos
  • Progtwigción en tiempo real de seguridad en Java y Ada.

Si alguien quiere ver a Ada un poco más, mira esto: Progtwigción de Ada (wikibooks)

Incluso hay lenguajes de progtwigción que están específicamente desarrollados para aplicaciones altamente críticas, como JOVIAL o HAL / S , el último de los cuales es utilizado por el progtwig del transbordador espacial.

¿Hay algún controlador escrito en otros idiomas?

He visto algunos controladores de Linux para hardware especial escritos en Ada, aunque no conozco otros sistemas operativos. Sin embargo, estos controladores generalmente terminan envolviendo la API de C.

“¿por qué estamos usando el lenguaje C para escribir controladores y códigos de sistema operativo?”

Para que los progtwigdores no tengan que aprender una nueva syntax de cada nuevo lenguaje ensamblador para cada nuevo tipo de máquina.

“¿Hay algún controlador escrito en otros idiomas?”

Históricamente, los lenguajes ensambladores. No recuerdo si PL / S o BLISS podrían usarse para los conductores. Quizás B. En los tiempos modernos, algunas personas valientes usan C ++ pero tienen que ser muy cuidadosas. C ++ puede usarse un poco más fácilmente en controladores de modo de usuario en algunas situaciones.

Porque C tiene la mejor combinación de velocidad, bajo uso de memoria, acceso de bajo nivel al hardware y popularidad.

La mayoría de los sistemas operativos tienen un kernel escrito en C, y las aplicaciones además de las escritas en C, C ++, C # u Obj-C

C es, con mucho, el lenguaje más fácil (que no sea ensamblaje) para “ponerse en marcha” en el hardware básico. Con C, (asumiendo que tienes un gestor de arranque de 32 bits como GRUB para hacer el cambio de modo difícil), todo lo que debes hacer es crear un pequeño archivo crt0.asm que configure la stack y eso es todo (obtienes el idioma, sin incluir libc) . Con C ++, debe preocuparse por los lanzamientos dynamics, las excepciones, los constructores globales, la anulación de nuevos, etc. Con C #, debe migrar el tiempo de ejecución de .Net (que, básicamente, requiere un núcleo) y no estoy seguro de Obj-C , pero estoy seguro de que tiene algunos requisitos también …

C es simplemente el lenguaje más fácil de usar para los conductores. No solo es fácil comenzar, sino que también es fácil saber exactamente qué sucede a nivel de máquina. No hay sobrecarga de operadores para confundirte a ti y tal. Claro que es útil en un “buen” entorno, pero en el Ring 0, donde un puntero malo no solo bloquea su aplicación, sino que generalmente genera una falla triple (reinicio), pantalla azul o pánico del núcleo. Realmente te gusta saber lo que pasa en tu máquina ..

Las máquinas Lisp tenían sus sistemas operativos escritos en Lisp, lo que demuestra que no tiene que usar C o ensamblaje. El negocio de las máquinas Lisp fue destruido por la disponibilidad de PC baratas, cuyos sistemas operativos, por supuesto, estaban escritos en C y ensamblaje.

C fue uno de los primeros idiomas (que no era ensamblaje) que era adecuado para escribir sistemas operativos, por lo que se detectó pronto. Mientras que otros lenguajes han aparecido desde entonces, también son adecuados para escribir sistemas operativos, C se ha mantenido popular tal vez debido a su larga historia y la familiaridad de los progtwigdores con su estructura y syntax.

C también es un lenguaje que enseña mucho acerca de la administración de la memoria y es lo suficientemente bajo como para mostrar la barrera entre el hardware y el software. Esto es algo raro entre muchas metodologías actuales, que han crecido más hacia la abstracción por encima de cualquier cosa en el nivel de hardware. Me parece que C es una excelente manera de aprender estas cosas, mientras que al mismo tiempo es capaz de escribir código rápido.

Recuerde que C fue desarrollado originalmente para escribir sistemas operativos (en este caso, Unix) y cosas similares de bajo nivel. Está muy cerca de la architecture del sistema y no contiene ninguna característica adicional que queramos controlar, cómo funcionan exactamente. Sin embargo, tenga en cuenta que el rest del sistema operativo, incluidas las bibliotecas de progtwigción, no tiene que estar escrito en el mismo idioma que el núcleo. Las funciones del núcleo se proporcionan a través de un sistema de interrupciones y, de hecho, dichas bibliotecas de progtwigción se pueden escribir en cualquier lenguaje que admita fragmentos de ensamblador.

Los sistemas operativos más populares en la actualidad están escritos en C: Windows, Linux y muchos otros clones de Unix, sin embargo, esta no es la regla. Hay algunos sistemas operativos orientados a objetos, donde tanto el núcleo como la interfaz de progtwigción están escritos en un lenguaje objective, como:

  • NeXTSTEP – Objective-C
  • BeOS – C ++
  • Sílaba – C ++

Ver: Sistema operativo orientado a objetos en Wikipedia.

Tenga en cuenta que en Linux, es posible escribir controladores de kernel en otros idiomas distintos de C (sin embargo, no se recomienda). De todos modos, todo se convierte en un código de máquina cuando se trata de ejecutarlo.

“C comstack a código de máquina y no requiere ningún soporte de tiempo de ejecución para el lenguaje en sí”.

Esta es la mejor característica de C

Creo que lenguajes como Python, Java y otros son populares principalmente porque ofrecen amplias bibliotecas estándar que permiten al progtwigdor codificar una solución en menos líneas. Literalmente, un progtwigdor de Ruby puede abrir y leer un archivo en una línea en la que en C toma varias líneas. Sin embargo debajo de esta abstracción hay múltiples líneas. Por lo tanto la misma abstracción se hará en C y se recomienda. Curiosamente, parece que la filosofía C no es reducir el total de líneas de código, por lo que no hay un esfuerzo organizado para hacerlo. C parece ser visto como un lenguaje para todos los chips de procesadores y, naturalmente, esto significa que es difícil crear soluciones abstractas “estándar” de una línea. Pero C le permite usar los comandos del preprocesador #ifdef, por lo que, en teoría, puede tener múltiples variaciones de una implementación para múltiples procesadores y plataformas en un solo archivo de cabecera. Este no puede ser el caso de Python o Java. Entonces, mientras C no tiene una biblioteca estándar elegante, es útil para la portabilidad. Si su empresa desea ofrecer progtwigs que se ejecutan en computadoras, dispositivos integrados y portátiles, entonces C es su idioma de elección. Es difícil reemplazar la utilidad de C en el mundo.

Como otra nota para las máquinas que tienen controladores en otros idiomas, existe la plataforma robótica SunSpot . Los controladores para dispositivos que están conectados (sensores, motores y todo lo que se puede comunicar a través de los pines de E / S) están escritos en Java por el usuario.