15

这是一个相当理论的问题,但是..

有多少操作系统可以用 Python、Ruby、Perl 或 Lisp、Haskell 等语言编写?

似乎很多像 init.d 这样的东西都可以用脚本语言轻松完成。防火墙设备操作系统之一(m0n0wall)使用 PHP 进行系统配置(包括启动时)。有人可能会争辩说“emacs 是一种操作系统,主要是用 Lisp 编写的”..

当然,有些位必须是汇编/C,但是有多少可以是常规的 .py/rb/.pl/.el/.hk 文件..?它可能没有最好的性能,但它会是迄今为止最容易修改的操作系统……

4

11 回答 11

23

从技术上讲,如果您编写编译器来执行此操作,则任何一个都可能是。操作系统已经在 J​​ava (JNode)、.NET (MOSA、Singularity、SharpOS、Cosmos)、Haskell (HOUSE)、Python (Unununium) 等中完成。

编辑:我看到很多人都在谈论最底层是一个无法做到的领域;这不是真的。

没有理由不能扩展 X 语言的编译器来处理任何低级操作并将其暴露给该语言。所有功能都可以通过任何语言实现,只需为工作选择正确的工具即可。有时这是 Python,有时是 C,有时是汇编。

查看 Cosmos 和 SharpOS 等项目,了解纯粹的高级操作系统 Done Right (TM)。

于 2008-10-10T08:06:01.620 回答
8

我很惊讶没有人提到 Java 硬件。它应该是我们通过创建更高级别的处理器来进一步发展硬件的灵感。

我刚刚发现了另一个名为“ Pycorn ”的项目。

如果有一个 Python 字节码处理器,那么用 100% Python 制作一个快速的操作系统是可行的。处理器可以实现整个 CPython 字节码,或者任何与 Python 语言兼容的东西(但不是 C 模块!)。处理器必须处理引用计数、类和对象。dicts 的本机散列非常有用,Python 目前在软件中需要的所有复杂数据结构操作都应该完全在硬件中完成。不会有指针的概念,我认为这是构建这样一个处理器的主要动机,因为不可能破坏堆栈。

一切都将是对象!内核本身会调用内存对象上的方法,尽管您不需要太多接触它,因为无论如何硬件都会处理分配和垃圾收集。中断处理程序可以简单地设置为 python 方法。MSR、高速缓存、调试寄存器和 I/O 端口都是对象。

这里有一个关于在 FPGA 上实现 Python 的有趣讨论。

另一方面,(与非 Python 处理器上的 Python O/S 相关)对于声称您无法制作 Pythonic 内联汇编的人来说,仅从抽象中发出汇编非常简单,例如:

asm = MetaASM()
asm.r1 = 1234
asm.r2 = r1 + 5
asm.io.out(r1)

您可以在必要时切换到特定于架构的程序集以满足性能需求或特定于架构的操作/寄存器:

asm = ASM("IA-32")
asm.xor(asm.eax, asm.eax)
asm.cr0 = asm.eax
asm.invtlb
asm.fs.0x00123456 = asm.eax
asm.al = 123
asm.dword.ptr.eax = 1234 # mov dword ptr [eax], 1234
asm.push(asm.eax)

CorePy对这个话题产生了兴趣。

于 2009-11-05T04:37:47.450 回答
4

Python 本身并不提供直接与硬件对话的结构,例如内存映射 I/O 的原始指针和 C/ASM 提供的许多其他结构。然而,有证据表明操作系统中的大多数东西都可以用更抽象的语言编写。微软的Singularity OS几乎完全是用 C# 的变体编写的。有极少量的 C/ASM 来执行中断处理程序等,但其他一切,包括我们大多数人认为的“内核”,基本上都可以用任何图灵完备的语言来完成。

应该注意的是,Singularity 选择在 C/ASM 中实现这些低级结构不应被解释为对高级语言的语法或其他方面的基本限制。人们当然可以制作一种 Python 变体,它可以发出并适当地处理必要的汇编代码。

于 2008-10-10T08:05:06.940 回答
3

House-Haskell 用户的操作系统和环境。它甚至可以在 VM 中启动,您可以使用它。

来源非常易读,IMO。

于 2008-10-10T08:04:30.733 回答
3

除了内核(我的意思是内核、微内核风格)以及为每种动态语言编译运行时的东西之外,如果你正在构建自己的操作系统,几乎任何东西都可以是。只是不实用。sh哎呀,据我所知,init.d 主要是写在里面的。但是sh,虽然功能不强,但它非常轻巧,据我所知,它的功能非常高效。像 Python、Perl 等高级语言可以很好地处理它,但它会慢很多,并且会为解释器实例占用更多内存。

有可能,只是不实用。

于 2008-10-10T08:06:06.877 回答
3

Singularity 的一个有趣结果是,您不再需要 CPU 中的 MMU(内存管理单元),因为所有用户态代码都是“托管”的。我可以看到这在嵌入式场景中是有益的,使用非 MMU Linux 并在脚本应用程序之上。

于 2008-10-10T08:11:07.460 回答
3

请参阅Genera/OpenGenera以获取用 Lisp 编写的操作系统的示例,该示例实际上已在LispMachines上使用了一段时间。
Haskell 有House

于 2008-10-10T08:17:29.880 回答
3

只要编程语言具有操作二进制文件的能力,您就可以用特定语言编写完整的操作系统。这并不是说它容易或实用。这是有道理的,如果您选择的语言可以操作二进制,那么您可以根据需要进行低级操作。

于 2008-10-12T05:21:01.813 回答
2

很难想象用(例如 Python)编写的内核/设备驱动程序等 - 内存管理会有点令人头疼。

另一方面,几乎所有的用户空间代码都可以。在 Linux 下,“init”不需要是本机机器代码二进制文件——它可以是 python 脚本或其他东西,没问题。

于 2008-10-10T08:06:44.770 回答
2

“cleese” ——几乎完全用 Python 编写的操作系统

于 2009-06-21T21:03:00.793 回答
0

我会说这是不可能的。对这个问题的回答不断提到对语言的更改或使用该语言来生成低级(内核)代码。这只是使用一种语言编写另一种语言。虽然我同意这两者都允许您编写操作系统,但我认为它现在不是同一种语言。因此,操作系统可以用多种不同的语言编写,但并非每种语言(无需更改或绕过语言)都可用于编写操作系统。

原始问题的最终答案几乎是全部,但不是全部。唯一接受的是可以访问 CPU 级指令的语言。

于 2008-10-12T05:38:11.593 回答