【问题标题】:How much of an operating system could be written in, say, Python? [closed]有多少操作系统可以用 Python 编写? [关闭]
【发布时间】:2010-09-16 11:16:14
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你提到的防火墙设备操作系统是monowall(m0n0.ch/wall),pfSense恰好是它的后代。
  • 为什么不建设性?这个问题定义明确,可以明确回答。
  • @Mechanicalsnail 我提出了一个自定义版主标志,以便重新打开它。

标签: operating-system


【解决方案1】:

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

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

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

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

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

另一方面,(与非 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 对这个话题产生了兴趣。

【讨论】:

  • 再想一想,我们可能应该坚持使用 Java 处理器,因为 Java 代码比 Python 更具确定性,因此对于更快的速度来说总是便宜得多。无论如何,那些仅仅因为越界访问内存而做不安全事情的语言必须被淘汰。
  • @Quonux 这个问题只是询问操作系统是否可以用高级语言编写,您的评论在这里并不具有建设性。
【解决方案2】:

"cleese" - 几乎完全用 Python 编写的操作系统

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 您确实意识到每种语言都会被翻译成另一种语言,对吗? C被编译成汇编,然后汇编成机器代码。这就好比说用C写内核其实就是用汇编写...
    • 是的,但是 C# 被编译为 IL,而不是本机代码(除非您使用 Mono 的静态编译功能)。所以严格来说,使用 C# 创建操作系统是不可能的。使用生成 asm 的 C# 编译器的修改版本是。这是否仍然是 C# 值得商榷。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 没有理由甚至中断处理程序等必须是 C/ASM。例如,Cosmos 和 SharpOS 都通过 C#(以及它们发出内联 asm 的自定义方式,X# (Cosmos))来处理这一切。只需要让编译器发出这段代码。
      • 我认为 Cosmos 和 SharpOS 只是将 ASM 封装在更便携、更冗长(但类型安全)的语法中。这里的代码 (gocosmos.org/Blog/20080428.en.aspx) 看起来很像汇编。即使你可以用 Python 编写它,它也不会在那时完全是 Pythonic。
      • 我认为 Cosmos 在抽象方面做得还不够。编译器确实应该处理这些低级细节并以合乎逻辑的方式将其公开给高级。也就是说,托管内核还有很长的路要走。
      • 我们习惯推理的任何类型的程序都可以用任何图灵完备语言实现的论点当然是正确的,但我觉得它有点虚伪,除非那是真的OP在问什么。不,ASM 没有任何魔法,但硬件执行指令
      • .. 说你可以在 Python 中做到这一点并不完全令人满意,因为你真的必须以一些基本的方式对语言进行混蛋才能让它发出 ASM 并将其放入例如中断向量表。
      【解决方案6】:

      请参阅Genera / OpenGenera 以了解在 LispMachines 上实际使用了相当长一段时间的用 Lisp 编写的操作系统的示例。
      Haskell 有House

      【讨论】:

        【解决方案7】:

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

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

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

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

        【讨论】:

        • 我相信 JNode 的微内核是用汇编程序编写的——对于需要 VM 的语言来说,这不是必需的吗?在最低级别,任何可用的操作系统都至少包含一个小汇编程序。 C 最小化了汇编器,因为它允许原生的低级操作。
        • 感谢您对 JNode 的更正,但不,您的操作系统没有任何装配的基本要求。您扩展编译器以发出正确的机器代码来完成工作。您可以使用平台语言构建平台功能的子集,然后启动。
        • 例如,我的一个 .NET(Nemerle 和 C#)内核是在纯 .NET 中完成的。编译器的小型运行时不处理对象,只是暴露内存、中断等。对象系统本身是用 Nemerle/C# 构建的。完全自引导。
        • C 本质上是一个可移植的程序集,加上一些不完全低级的特性。所以默认情况下,它是编写操作系统的好语言。但它对于编写业务应用程序来说是一种糟糕的语言。相反,具有许多有用的高级构造和许多有用的抽象层的语言对于编写业务应用程序来说是很好的,但不利于编写操作系统。不过,如果需要,您可以用这两种语言编写操作系统和业务应用程序。
        • 我不同意这样的想法,因为低级内容的必要 asm 可能会被侵入编译器,这意味着任何语言都可以用于任意低级系统级编程。这意味着您将属于操作系统代码库的 (asm) 代码移动到编译器的代码库中,同时打破了许多关于正确代码组织的规则。
        【解决方案8】:

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

        【讨论】:

          【解决方案9】:

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

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

          【讨论】:

            【解决方案10】:

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

            有可能,只是不实用。

            【讨论】:

              【解决方案11】:

              House - Haskell User's Operating System and Environment。它甚至可以在 VM 中启动,您可以使用它。

              来源非常易读,IMO。

              【讨论】:

                猜你喜欢
                • 2022-10-01
                • 1970-01-01
                • 2012-10-07
                • 2011-10-16
                • 1970-01-01
                • 2011-11-19
                • 2013-08-18
                • 2012-06-09
                • 2014-01-23
                相关资源
                最近更新 更多