¿Por qué no tener un sistema operativo basado en lenguaje de alto nivel? ¿Son los lenguajes de bajo nivel más eficientes?

44

Sin ser presuntuoso, me gustaría que consideres la posibilidad de esto. La mayoría de los sistemas operativos actuales se basan en lenguajes de muy bajo nivel (principalmente C / C ++) Incluso los nuevos como Android usan JNI & la implementación subyacente está en C

De hecho, (esto es una observación personal) muchos programas escritos en C se ejecutan mucho más rápido que sus homólogos de alto nivel (por ejemplo: Transmission (un cliente de bittorrent en Ubuntu) es mucho más rápido que Vuze (Java) o Duge) (Pitón)). Incluso los compiladores de python están escritos en C, aunque PyPy es una excepción.

Entonces, ¿hay alguna razón en particular para esto? ¿Por qué es que todos nuestros llamados "Lenguajes de alto nivel" con los grandes conceptos de "OOP" no se pueden utilizar para crear un sistema operativo sólido?

Básicamente tengo 2 preguntas.

  1. ¿Por qué las aplicaciones escritas en lenguajes de bajo nivel son más eficientes que sus contrapartes de HLL? ¿Los idiomas de bajo nivel funcionan mejor por la sencilla razón de que son de bajo nivel y se traducen al código de máquina más fácilmente?
  2. ¿Por qué no tenemos un sistema operativo completo basado completamente en un lenguaje de alto nivel?
pregunta rtindru 28.06.2013 - 09:46

10 respuestas

38

Microsoft ha realizado una investigación muy interesante en esta dirección, si te fijas en Singularity:

enlace

Además, Mothy Roscoe y otros han estado trabajando en Barrelfish, que utiliza el lenguaje de programación de restricciones de Eclipse como un servicio de SO para resolver todo tipo de problemas de administración de SO y asignación de recursos:

enlace

    
respondido por el Rafe 28.06.2013 - 09:51
38

Mucho depende de dónde coloque la división entre los idiomas de bajo y alto nivel. Por ejemplo, diferentes personas tienden a poner un lenguaje como C ++ en diferentes lados de esa división.

Con respecto a sus preguntas:

  1. No creo que exista tal diferencia entre los idiomas de bajo y alto nivel, sino más bien una diferencia entre los idiomas interpretados y los idiomas que se compilan según las instrucciones nativas.

    Pero también puede haber una diferencia en la cultura entre los programadores, donde una vez que usan un lenguaje de bajo nivel se centran más en los aspectos de rendimiento de las elecciones (de diseño) que hacen.

  2. Si considera que C ++ es de alto nivel, entonces hay al menos un sistema operativo escrito completamente en un lenguaje de alto nivel (Symbian OS está escrito en C ++). Lo que le impide escribir un sistema operativo en la mayoría de los lenguajes de alto nivel son dos cosas:

    • Un sistema operativo necesita acceso de bajo nivel a la memoria y al hardware y realizar trucos sucios en ellos. Este tipo de acceso generalmente se considera inseguro para los programas de nivel de aplicación, por lo que muchos lenguajes de alto nivel no lo permiten.
    • Un sistema operativo debe ejecutarse sin que esté presente un software de soporte, como intérpretes. Esto hace que sea extremadamente difícil escribir un sistema operativo en un idioma que no pueda compilarse fácilmente en instrucciones nativas.
respondido por el Bart van Ingen Schenau 28.06.2013 - 10:06
15

Hay varias buenas razones para esto.

El lenguaje de bajo nivel de hoy fue el de alto nivel de ayer

Sí, lo creas o no, érase una vez que incluso C se veía como un lenguaje de alto nivel. Incluso ~ 20 años atrás, era lo suficientemente común como para que se lo describiera como un lenguaje de "nivel medio". Este fue un momento antes de que OO fuera tan popular como lo es hoy, Java no existía, C # no existía, incluso C ++ aún no estaba correctamente estandarizado.

Inercia histórica

Los sistemas operativos que usa hoy tienen raíces profundas en la historia. Windows se remonta a principios / mediados de los 80, Unix se remonta a principios / mediados de los 70. Hay MUCHO código antiguo que funciona en los sistemas operativos y, por lo general, no desea volver a escribir el código antiguo que funciona.

En algún momento, debes ir al hardware

Esto sucede en el kernel, sucede en los controladores, sucede en los subsistemas de administración de memoria, sucede en el sistema de archivos. Claro que puedes superponer un lenguaje de alto nivel, pero aún necesitas la capacidad de acceder más directamente al hardware que ofrece un lenguaje de nivel inferior.

Portabilidad

No me refiero a la portabilidad a un hardware diferente o un sistema operativo diferente como se entiende más comúnmente hoy en día; esto es mas sutil Hay una gran ventaja de proporcionar una interfaz basada en C para algo, y es el hecho de que prácticamente todos los demás lenguajes que existen pueden vincularse a C. Incluso la API de Windows sigue siendo una API basada en C en estos días por esa razón.

Preferencia personal

Algunas personas prefieren programar de esta manera, y eso puede ser un factor importante. Por ejemplo, Linus Torvalds tiene una rant famosa contra C ++ , lo que deja bastante claro que as en lo que a él respecta, C siempre será su herramienta de elección para este tipo de trabajo (el contenido de la perorata y si está de acuerdo o no con ella es irrelevante para esta discusión; el hecho de que la perorata sea suficiente). p>

Tomados en conjunto, deben establecer claramente por qué un sistema operativo se escribió originalmente en algo como C en los viejos tiempos, y por qué partes muy significativas de él, incluso hoy, siguen siendo así.

    
respondido por el Maximus Minimus 03.07.2013 - 21:54
13

Una de las principales razones del predominio de C para los sistemas operativos se encuentra en la historia: los sistemas operativos actuales actuales como Windows y todas las formas de Unix (BSD, Solaris, HP-UX, MacOS X, ... y clones como Linux). ) retrocede mucho tiempo, antes de que OO y otras construcciones de "alto nivel" se conviertan en la corriente principal.

Para el núcleo del sistema operativo, además del rendimiento, existen necesidades muy específicas acerca de las instrucciones de hardware y se necesita un control total sobre la memoria, lo que a los lenguajes C les va muy bien.

Para los sistemas integrados, a veces hay sistemas operativos que usan lenguajes de nivel superior para partes más grandes del sistema. Un ejemplo notable es JavaOS por Sun.

Para sistemas operativos extendidos, un ejemplo notable que no usa C también es el MacOS clásico antes de MacOS X, que fue escrito en gran parte en dialecto de Pascal que permitió alguna forma de orientación a objetos.

    
respondido por el johannes 28.06.2013 - 10:46
12

Primero, hay algunos problemas de bootstrap. La mayoría de las características que facilitan los lenguajes de alto nivel se basan en abstracciones que un núcleo debe proporcionar. ¿Cómo se escribe un administrador de memoria en un idioma que requiere un administrador de memoria? ¿Cómo se escriben los controladores de E / S sin usar las bibliotecas estándar de E / S de su idioma? ¿Cómo se crean primitivas de subprocesos y sincronización sin utilizar las bibliotecas del idioma?

Segundo, es extremadamente útil y mucho más legible cuando se escriben sistemas operativos para poder asignar una variable a una ubicación de memoria específica. Esto es fácil en C, y cada programador de C sabe cómo hacerlo. Si es posible incluso en idiomas de nivel superior, es tan raro que solo los gurús saben cómo hacerlo.

En otras palabras, cuando tenga en cuenta todas las limitaciones y modificaciones que tendría que aceptar, C y C ++ comienzan a parecer mucho más fáciles.

    
respondido por el Karl Bielefeldt 28.06.2013 - 17:53
6

En primer lugar, el arranque requiere que al menos una pequeña parte se escriba en ensamblado o equivalente.

En segundo lugar, había un sistema operativo escrito en una HLL indiscutiblemente: Lisp Machine . (El hecho de que fracasara comercialmente tenía más que ver con que otro hardware se volviera más barato y más rápido y el triunfo de Lo peor es mejor que con deficiencias de su filosofía o diseño).

Tercero, C ++ está bastante orientado a los objetos y tiene un alto nivel, por lo que, como señalan otros, Symbian OS es otra ejemplo.

Cuarto, hay poca necesidad de nuevos sistemas operativos en este momento. Ya tenemos bastantes linux y bsd que se ejecutan en casi cualquier hardware, y crear un nuevo sistema operativo desde cero es bastante caro.

    
respondido por el sds 28.06.2013 - 19:08
4

Para mejorar la fase de lo que escribí anteriormente.

Las máquinas Burroughs 5xxx - 6xxx no tenían lenguaje ensamblador. El idioma más bajo disponible fue una extensión de Algol. El Algol fue implementado en hardware. El sistema operativo y todos los idiomas fueron escritos en Algol. Superó a todas las máquinas competidoras de la época. También requería una cantidad de código significativamente menor, lo que hizo mucho más fácil de mantener. Tenía un hardware de pila que admitía un lenguaje recursivo como Algol.

El sistema operativo Burroughs evolucionó a una versión llamada MCP. MCP actualmente se ejecuta en sistemas Unisys.

    
respondido por el donleslie 03.07.2013 - 21:00
3

La mayoría de los idiomas de nivel superior que mencionas tienen una característica que no encaja bien con los sistemas operativos: administración automática de memoria. No se puede confiar en un recolector de basura cuando se escribe un sistema en tiempo real, ya sea software (lo que es un sistema operativo) o incluso peor. Para citar Tanenbaum [i]:

  

Algunas cosas que C no tiene incluyen cadenas integradas, hilos, paquetes, clases, objetos, seguridad de tipos y recolección de basura. El último es un tapón de show para sistemas operativos. Todo el almacenamiento en C es estático o está explícitamente asignado y publicado por el programador, generalmente con la función de biblioteca malloc y free . Es la última propiedad, el control total del programador sobre la memoria, junto con los punteros explícitos lo que hace que C sea atractivo para escribir sistemas operativos. Los sistemas operativos son básicamente sistemas en tiempo real, hasta cierto punto, incluso de propósito general. Cuando ocurre una interrupción, el sistema operativo puede tener solo unos pocos microsegundos para realizar alguna acción o perder información crítica. Tener la recolección de basura en un momento arbitrario es intolerable.

Ahora, podría argumentar que C ++ también es un buen candidato, ya que ofrece administración de memoria manual. C ++ ya se ha utilizado en algunos sistemas operativos como Symbian (mencionado por Bart ) y BeOS. Pero IMHO C sigue siendo el lenguaje más rápido que se puede portar en muchas arquitecturas sin un gran esfuerzo (en contraste con el ensamblaje de una arquitectura específica).

[i]: 3ª edición de Modern Operating Systems, página 73

    
respondido por el sakisk 28.06.2013 - 19:35
2

Como han señalado otros, varios sistemas operativos se han escrito en lenguajes de alto nivel. Tal vez lo que quiere decir es que todos los sistemas operativos exitosos de uso general en el mercado masivo se han escrito en una combinación de ensamblaje, C y C ++.

La mayoría de los lenguajes de alto nivel tienen toneladas de funciones útiles que conllevan un costo de rendimiento asociado. La administración automatizada de la memoria es un ejemplo obvio, la verificación de los límites de los arreglos es otro. Si está escribiendo un sistema operativo de propósito general, es probable que se encuentre en situaciones en las que la penalización de rendimiento de estas características útiles es más de lo que está dispuesto a pagar. En ese momento te gustaría poder apagarlos. Los idiomas como Python, C # y Java varían en cuanto a las funciones que puede desactivar, pero ninguna de ellas es tan versátil como C o C ++ en este sentido.

En este aspecto, C y C ++ son casi tan versátiles como el ensamblaje puro. Si decide que necesita diez administradores de memoria diferentes que cubran diez escenarios diferentes de asignación de memoria, puede implementarlos todos en C y C ++, y cargarlos y descargarlos como mejor le parezca. Heck, ni siquiera tiene que vincularse a las bibliotecas de tiempo de ejecución de C estándar o al código de inicio si no lo desea.

    
respondido por el Charles E. Grant 28.06.2013 - 20:22
0

La respuesta real es Dinero . No se percibe el beneficio suficiente de un sistema operativo de lenguaje de alto nivel para justificar el gasto de los recursos para crear uno y luego insertarlo en la corriente principal. Hay un costo enorme en la construcción de un nuevo controlador para cada pieza de hardware que necesita. para apoyar, por ejemplo.

Hay varios sistemas operativos escritos en lenguajes de alto nivel, con el objetivo principal de la investigación, como Oberon y Singularity .

    
respondido por el Peter 11.06.2016 - 15:12