Escribir SO en lenguaje interpretado

¿Es posible escribir un sistema operativo usando un lenguaje que no esté compilado [es decir, interpretado como python] o que no use un tiempo de ejecución [como Java]? ¿No sería necesario que la máquina virtual se ejecutara sobre un sistema operativo ya?

preguntado el 11 de mayo de 12 a las 05:05

5 Respuestas

Microsoft Research ha creado un sistema operativo, llamado Singularidad.

Sin embargo, ES un proyecto de investigación y creo que necesitaban un código de bajo nivel para iniciar el proceso de arranque (en algún momento, un sistema operativo necesita comunicarse con el hardware).

Wikipedia dice:

El código de despacho de interrupción x86 de nivel más bajo está escrito en lenguaje ensamblador y C. Una vez que este código ha hecho su trabajo, invoca el núcleo, cuyo tiempo de ejecución y recolector de basura están escritos en Sing# (una versión extendida de Spec#, en sí misma una extensión de C#) y se ejecuta en modo desprotegido. La capa de abstracción de hardware está escrita en C++ y se ejecuta en modo protegido. También hay algo de código C para manejar la depuración. El BIOS de la computadora se invoca durante la etapa de arranque en modo real de 16 bits; una vez en el modo de 32 bits, Singularity nunca vuelve a invocar el BIOS, sino que invoca los controladores de dispositivos escritos en Sing#. Durante la instalación, los códigos de operación de Common Intermediate Language (CIL) se compilan en códigos de operación x86 utilizando el compilador Bartok.

contestado el 11 de mayo de 12 a las 05:05

¿Qué? IL no se interpreta en Singularity. - SK-lógica

Por supuesto. Simplemente no esperes que sea rápido, por eso nadie hace esto.

Probablemente tendrá que hacer algunas cosas divertidas (instrucciones virtuales) en el intérprete para permitir que su sistema operativo realice cambios en el estado de la máquina (registros y pila, mapa de memoria, registros de dispositivos de E/S) y algo específico de la máquina para permitir que el hardware interrupciones para hacer la transición a la ejecución del código interpretado y retroceder para regresar de las interrupciones. Y es posible que tenga dificultades con la lógica de arranque inicial; su intérprete claramente no puede cargarse del disco.

Pero para la mayoría de los sistemas operativos, si se hace correctamente, por ejemplo, con un compilador JIT, sería bastante portátil y, de hecho, podría ser razonablemente rápido. [Querría que el compilador JIT esté codificado en el mismo idioma y sujeto a auto-JIT].

Propuse un HLL similar a C que se compilaba en código interpretado por una máquina virtual, exactamente en esta arquitectura para el sistema OS 360 en la década de 1980, y casi cerré un trato para construirlo. Habría sido divertido. Ah bueno.

Respondido el 07 de junio de 12 a las 06:06

Sí es posible, especialidad si piensas en una máquina virtual.

Por ejemplo, puede crear una versión pequeña de minix en Java para que se ejecute en la parte superior de JVM. Pero no sé la razón por la que alguien hace esto, excepto demasiado tiempo libre :)

Un sistema operativo debe ser muy delgado y rápido. Si elige python, tiene la sobrecarga del intérprete de python en cada operación. Incluso si piensas en una pequeña parte del sistema, como los controladores de dispositivos: imagina el intérprete de Python ejecutándose en el espacio del kernel por un tiempo...

pero para casos educativos o especiales (¿arduino? ¿incrustar?) puede ser aceptable. Creo que lua puede ser una buena idea porque el intérprete es muy pequeño.

contestado el 11 de mayo de 12 a las 05:05

Hay una gran cantidad de sistemas operativos Forth de cosecha propia. Forth está en el límite de ser "interpretado" (pero prefiero mantenerme alejado de este término, es demasiado vago y se usa demasiado mal).

contestado el 11 de mayo de 12 a las 10:05

Cada lenguaje/compilador utiliza algo de tiempo de ejecución, excepto el código de máquina sin procesar. Por ejemplo, C tiene algo llamado crt0, que es un conjunto de rutinas de inicio de ejecución para cualquier programa C. Sin mencionar el ampliamente utilizado libc. Y, por lo que no puede evitarlo, la pregunta correcta es: ¿qué tan grande/eficiente debe ser un tiempo de ejecución? ¿Y cómo debe comportarse? Por ejemplo: ¿necesito un recolector de basura?

Ahora, algunas piezas críticas del sistema operativo deben compilarse en el código de máquina sin procesar. De lo contrario, la CPU no sabrá cómo ejecutarlo. Después de todo, la CPU solo entiende el código de la máquina. Además, debe seguir un proceso de arranque, lo que significa que el código compilado debe ser compatible con bios o uefi o lo que sea que use para arrancar. Finalmente, para aprovechar todas/la mayoría de las características de la CPU, se debe emitir algún código de máquina en bruto en tiempo de compilación o en tiempo de ejecución. Por ejemplo, núcleos de CPU. Si bien técnicamente no es necesario, probablemente no desee un sistema operativo que no sepa cómo usar múltiples núcleos de CPU.

Entonces puedes hacer casi todo lo que quieras. Por ejemplo, puede incrustar un tiempo de ejecución de Java dentro de su sistema operativo personalizado y permitir que solo se ejecuten programas de Java. Aún así, probablemente necesitará un lenguaje de nivel inferior para implementar algunas funcionalidades de bajo nivel, como los controladores de hardware.

Tenga en cuenta que técnicamente todo eso se puede escribir en cualquier idioma. Incluso si su sistema operativo está basado en Java, puede escribirse completamente en Python. Al final del día, un sistema operativo es solo una secuencia de bytes que cualquier idioma puede emitir. Aunque escribir todo desde cero, digamos Python, es una idea radical que no recomendaría.

respondido 16 nov., 21:15

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.