Sin ser presuntuoso, me gustaría que consideraras la posibilidad de esto. La mayoría de los sistemas operativos actuales se basan en lenguajes de nivel bastante bajo (principalmente C / C ++) Incluso los nuevos, como Android, usan JNI y 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 contrapartes de alto nivel (por ejemplo: la transmisión (un cliente bittorrent en Ubuntu) es mucho más rápido que Vuze (Java) o Deluge (Python) ) Incluso los compiladores de Python están escritos en C, aunque PyPy es una excepción.
Entonces, ¿hay una razón 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 hacer un sistema operativo sólido?
Entonces tengo 2 preguntas básicamente.
- ¿Por qué las aplicaciones escritas en lenguajes de bajo nivel son más eficientes que sus contrapartes HLL? ¿Los lenguajes de bajo nivel funcionan mejor por la simple razón de que son de bajo nivel y se traducen más fácilmente al código de máquina?
- ¿Por qué no tenemos un sistema operativo completo basado completamente en un lenguaje de alto nivel?
Respuestas:
Microsoft ha hecho una investigación muy interesante en esta dirección, si nos fijamos en Singularity:
http://research.microsoft.com/en-us/projects/singularity/
Además, Mothy Roscoe et al. Han estado trabajando en Barrelfish, que utiliza el lenguaje de programación de restricciones Eclipse como un servicio de SO para resolver todo tipo de problemas de administración de SO y asignación de recursos:
http://www.barrelfish.org/
fuente
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:
No creo que haya tanta diferencia entre los idiomas de bajo y alto nivel, pero sí una diferencia entre los idiomas interpretados y los idiomas que compilan 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.
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 idiomas de alto nivel son dos cosas:
fuente
Hay una serie de buenas razones para esto.
El lenguaje de bajo nivel de hoy era el lenguaje de alto nivel de ayer
Sí, lo creas o no, alguna vez incluso C fue visto como un lenguaje de alto nivel. Incluso hace ~ 20 años era lo suficientemente común como para verlo descrito 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 MUCHOS códigos antiguos que funcionan en los sistemas operativos y, por lo general, no desea volver a escribir el código antiguo que funciona.
En algún momento tienes que bajar 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 puede superponer un lenguaje de alto nivel, pero aún necesita 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, ya que hoy se entiende más comúnmente; Esto es más 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 idiomas 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 simplemente prefieren programar de esta manera, y eso puede ser un factor importante. Por ejemplo, Linus Torvalds tiene un famoso discurso contra C ++ que deja bastante claro que, en lo que a él respecta, C siempre será su herramienta de elección para este tipo de trabajo (el contenido del discurso y si está o no de acuerdo con él) es irrelevante para esta discusión; el hecho de que exista la diatriba es suficiente).
Tomados en conjunto, estos deberían establecer claramente por qué un sistema operativo se escribió originalmente en algo como C en los viejos tiempos, y por qué partes muy importantes de él, incluso hoy, siguen siéndolo.
fuente
Una razón principal del dominio de C para los sistemas operativos radica en la historia: los sistemas operativos principales actuales como Windows y todas las formas de Unix (BSD, Solaris, HP-UX, MacOS X, ... así como clones como Linux) se remontan mucho tiempo antes de que OO y otras construcciones de "alto nivel" se convirtieran en la corriente principal.
Para el núcleo del sistema operativo además del rendimiento, es necesario ser muy específico acerca de las instrucciones de hardware y uno necesita un control total sobre la memoria, que lenguajes como C funcionan muy bien.
Para los sistemas integrados, a veces hay sistemas operativos que utilizan lenguajes de nivel superior para partes más grandes del sistema. Un ejemplo notable es JavaOS de Sun.
Para los sistemas operativos generalizados, un ejemplo notable que no usa C también es el MacOS clásico antes que MacOS X, que estaba escrito en gran parte en un dialecto de Pascal que permitía alguna forma de orientación a objetos.
fuente
Primero, hay algunos problemas de arranque. La mayoría de las características que facilitan los lenguajes de alto nivel se basan en abstracciones que un núcleo debe proporcionarse. ¿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 utilizar las agradables bibliotecas estándar de E / S de su idioma? ¿Cómo se crean primitivas de subprocesamiento y sincronización sin utilizar las bibliotecas del lenguaje?
En segundo lugar, es extremadamente útil y mucho más legible al escribir 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 incluso es posible en idiomas de nivel superior, es tan raro que solo los gurús saben cómo hacerlo.
En otras palabras, cuando tiene en cuenta todas las limitaciones y modificaciones que tendría que aceptar, C y C ++ comienzan a verse mucho más fáciles.
fuente
stdio.h
. Una implementación de mutex personalizada no usa pthreads. ¡Eso es precisamente lo que significa implementarlo usted mismo! Y eso es independiente del lenguaje que está utilizando. Esto no quiere decir que los lenguajes de alto nivel sean una buena opción para tareas de bajo nivel (por lo general, no están en mi experiencia).En primer lugar, el bootstrapping requiere que al menos una pequeña parte se escriba en ensamblador o equivalente.
En segundo lugar, era un sistema operativo escrito en un indiscutiblemente HLL - Máquina Lisp . (El hecho de que falló comercialmente tuvo más que ver con que otro hardware se volviera más barato y el triunfo de Peor es mejor que con las deficiencias de su filosofía o diseño).
En tercer lugar, C ++ es bastante orientado a objetos y de alto nivel, por lo que, como otros señalaron, Symbian OS es otro ejemplo.
Cuarto, hay poca necesidad de nuevos sistemas operativos en este momento. Ya tenemos bastantes sabores de Linux y BSD que se ejecutan en casi cualquier hardware, y crear un nuevo sistema operativo desde cero es bastante costoso.
fuente
there is little need for new OSes at this time
Todavía no he decidido si esto es cierto o no. Sí, los sistemas operativos modernos (ventanas modernas (NT) / Unix moderno) son todo lo que necesitamos, funcionalidad y rendimiento. Pero apenas: nacen en otra área donde "la red" era corporativa / universitaria y los usuarios confiaban, y multiproc era procesadores 2/4. Están "plagados", hasta cierto punto, por el exceso de confianza (rootkits, malware, virus ...). Estoy empezando a pensar que hay espacio para un sistema operativo moderno, seguro y aislado ... con un mejor soporte para el paralelismo también (mejor que los hilos)CAR
yCDR
son macros de ensamblador IBM 704 ! Incluso C segrega el ensamblaje en línea , en lugar de tratarlo como cualquier otra función. Teniendo en cuenta LispCAR
y elCDR
trabajo en x86, ARM y una gran cantidad de ISA, es un ensamblaje impresionantemente portátil. (Nota al margen a cualquiera que pueda haber confundido: Sí, Lisp es un lenguaje de alto nivel.CAR
YCDR
ser macros ensambladores fue solo un detalle de implementación, no una característica clave.;))Para mejorar la fase de lo que escribí anteriormente.
Las máquinas Burroughs 5xxx - 6xxx no tenían un lenguaje ensamblador. El idioma más bajo disponible era una extensión de Algol. El Algol se implementó en hardware. El sistema operativo y todos los idiomas fueron escritos en Algol. Superó a todas las máquinas de la competencia de la época. También requería una cantidad significativamente menor de código, lo que facilitaba mucho el mantenimiento. Tenía hardware de pila que soportaba un lenguaje recursivo como Algol.
El sistema operativo Burroughs evolucionó a una versión llamada MCP. MCP actualmente se ejecuta en sistemas Unisys.
fuente
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 puede confiar en un recolector de basura cuando escribe un sistema en tiempo real, ya sea suave (que es lo que es un sistema operativo) o incluso peor. Para citar a Tanenbaum [i]:
Ahora, podría argumentar que C ++ también es un buen candidato, ya que ofrece administración manual de memoria. 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]: Modern Operating Systems 3rd edition, página 73
fuente
Como otros han señalado, varios sistemas operativos han sido escritos en lenguajes de alto nivel. ¿Quizás lo que quieres decir es que todo el sistema operativo exitoso, de mercado masivo y de uso general se ha escrito en alguna combinación de ensamblaje, C y C ++?
La mayoría de los idiomas de alto nivel tienen toneladas de características útiles que conllevan un costo de rendimiento asociado. La gestión de memoria automatizada es un ejemplo obvio, la comprobación de límites de matrices es otra. Si está escribiendo un sistema operativo de propósito general, es probable que se encuentre con situaciones en las que la penalización de rendimiento de estas útiles funciones es mayor de lo que está dispuesto a pagar. En ese punto, le gustaría poder desactivarlos. Los lenguajes como Python, C # y Java varían en las características que puede desactivar, pero ninguno de ellos es tan versátil como C o C ++ a este respecto.
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 cubren diez escenarios diferentes de asignación de memoria, puede implementarlos todos en C y C ++, y cargarlos y descargarlos como mejor le parezca. Diablos, ni siquiera tiene que vincular a las bibliotecas de tiempo de ejecución estándar de C o al código de inicio si no lo desea.
fuente
La verdadera respuesta es el dinero . No se perciben suficientes beneficios de un sistema operativo de lenguaje de alto nivel para justificar gastar los recursos para construir uno y luego llevarlo a la corriente principal. Hay un costo enorme involucrado en la construcción de un nuevo controlador para cada pieza de hardware que necesita soportar, por ejemplo.
Hay varios sistemas operativos escritos en lenguajes de alto nivel, con el objetivo principal de la investigación, como Oberon y Singularity .
fuente