是否可以在不使用一行C / C ++代码的情况下编写整个操作系统?

时间:2009-03-09 16:57:28

标签: operating-system

是否可以在不使用一行C / C ++代码的情况下编写整个操作系统?

编辑:再添加一个列表 - 程序集

11 个答案:

答案 0 :(得分:51)

是和否。

首先,重要的是要记住,无论您的选择语言是什么,最终编译产品都是汇编语言(或更准确地说,机器代码)。甚至解释器(例如cpython解释器)也最终将脚本转换为机器代码。

但这可能过于技术性而且错过了你问题的核心:

“我可以用更高级别的语言编写操作系统吗?”

对此的答案既是个人的,也是技术性的。

首先,个人方面:如果还不知道如何用汇编语言和C语言编写操作系统,那么你绝对没有办法在OS设计上尝试。

通常那些刚接触编程的人会有这样的问题,因为他们想做一些像编写新操作系统一样酷的东西,而不需要学习甚至尝试这样一个项目所需的全部知识。他们想知道更高级别的语言是否可以绕过所有那些混乱的研究。

所以,如果,在你的内心深处,这就是你所追求的,现在停下来。停止,停止,停止。善于做某事很难。没有捷径。准备好卷起袖子并得到一些腕管综合征。

这并不排除遵循最终OS设计的途径!如果这是你的热情,那就从顶部开始,逐步向下。获取有关网络协议,内存管理,线程等的书籍,解决每个主要子系统并充分了解它。如果你不能使用旧的,你就不能写一个新的!

然后阅读有关操作系统设计和实现的书籍,直到您梦想过程管理方法。

请记住,必要的知识量(不仅仅是计算机操作,而是像API这样的社会结构)是巨大的。这是一个漫长的旅程,也是一个有益的旅程。如果你像我一样真的喜欢这种工艺,即使你从未真正写过操作系统,你也会很高兴你花时间。

现在,技术答案。您将需要一个引导加载程序,并且必须使用汇编语言编写。毕竟,您的处理器不知道C#。通过引导加载程序阶段,您可以使用您想要的任何语言编写操作系统代码,并且它将运行,假设您的语言可以编译为机器代码二进制文件(而不是字节码!)

然而,即使在我们目前的“循环过剩”计算环境中,操作系统也必须精简高效,而且在高级语言中几乎不可能实现,在解释语言中更是如此。

很可能,您需要编写自己的编译器/解释器,将该语言作为操作系统的核心组件。该核心编译器可能只允许该语言的受限子集(并且您通过在受限制的子语言中编写更强大的编译器来进行引导)。否则表现将非常糟糕。

但所有这些都非常复杂,对这些问题的真正讨论需要您可能目前缺乏的深度知识。但如果你有动力这样做,你可以很容易地改变它,然后我很乐意整天讨论方法!

如果它让你感觉更好,我确实知道写一个操作系统,我仍然围着做白日梦,试图弄清楚我可以通过python编写多少操作系统。 ;)

答案 1 :(得分:16)

是。使用汇编程序。我会用Forth。 Genera是由Lisp编码的符号系统制作的操作系统。 C主要用于因为它是可信的,我们知道它是如何工作的。并且宇宙中的每个CPU都存在c编译器。 c的编译器很容易构建。

** Symbolics在互联网上注册了第一个域名。 (有趣的事实)

答案 2 :(得分:14)

不确定。您可以使用纯汇编程序或选择其他高级语言。

但你通常不想这样做。因为现代操作系统中所需的汇编代码量相当低。操作系统中的大多数代码都不需要那么低的级别。

C提供了一个很好的中间抽象级别,它仍然允许编写相当低级的代码,而不必处理所有汇编程序开发人员需要处理的细节。

编辑:一旦从等式中移除装配,它就会变得复杂得多。设置一个不错的操作系统需要执行几个机器代码指令,这些指令根本没有用高级语言表示(因为它们非常非常特定于机器)。理论上你可以在二进制blob中生成纯机器代码并从高级语言跳转到该位置,但我认为这是作弊,因为你必须首先想出那个二进制blob。

答案 3 :(得分:10)

是的,MenuetOS是仅使用汇编程序编写的操作系统的示例。

由于您似乎对汇编程序不感兴趣,另请参阅JNode,一个用Java编写的操作系统,以及Singularity,一个用C#编写的操作系统。

答案 4 :(得分:8)

有许多尝试来创建JVM的硬件实现。当然,这种硬件的操作系统将用Java编写。 例如,请参阅:http://www.jopdesign.com/

Nokia's S40似乎主要是用Java开发的。

答案 5 :(得分:4)

不确定。 C / C ++代码被编译成ASM代码,但是您可以以相同的方式使用许多其他语言。

您可能无法使用Java或C#,因为它们依赖于虚拟机并且可以用C语言编写。

实际上我相信有一个基于LISP创建操作系统的项目,但它失败了。

答案 6 :(得分:3)

不确定。只要有可用的编译器可以生成适当的机器代码,任何语言都可以。

答案 7 :(得分:2)

结帐http://common-lisp.net/project/movitz/。这是一个完全用Lisp编写的操作系统。我认为它拥有自己的Assmebler,例如Lisp到机器代码翻译器。

我喜欢没有C / C ++的操作系统,特别是基于Lisp的操作系统。

答案 8 :(得分:1)

是。显然,任何组装都是可能的,但往往不实用。已经有一些尝试用托管代码(.NET,Java)制作操作系统,并取得了不同程度的成功。

答案 9 :(得分:1)

如果你真的想,那么是的,你可以在不使用Assembly,C或C ++的情况下编写一个完整的操作系统,但我认为它只是一段时间。如果你愿意的话,你可以得到二进制编辑器并用二进制或十六进制编程整个语言,这需要很长时间,但它完全有可能。

答案 10 :(得分:0)

你可以用机器代码写吗?这只是二进制。你可以在汇编中编写它,但这有一个复杂的结构。您可能应该在C中编写它,因为它在编译时直接转换为机器代码,因此它比C#/ C ++更快并且比汇编更简单