为什么没有基于高级语言的操作系统?低级语言是否更有效?


44

在不冒昧的情况下,我想请您考虑一下这种可能性。如今,大多数操作系统都基于相当低级的语言(主要是C / C ++),即使是新的操作系统(例如Android)也使用JNI,底层实现也使用C语言

实际上,(这是一个个人观察),许多用C编写的程序的运行速度比其高级程序要快得多(例如:传输(Ubuntu上的bittorrent客户端)比Vuze(Java)或Deluge(Python)快很多。 )。即使PyPy是一个例外,即使python编译器也是用C编写的。

那么,这是否有特定原因?为什么我们所有具有出色的“ OOP”概念的所谓“高级语言”都不能用于构建可靠的OS?

所以我基本上有两个问题。

  1. 为什么用低级语言编写的应用程序比HLL同行更有效?低级语言是否会由于低级语言和更容易转换为机器代码的简单原因而表现更好?
  2. 为什么我们没有完全基于高级语言的成熟操作系统?

36
您暗示只有“高级语言”是面向对象的,这是不正确的。
Uooo

2
@rtindru“相当低级的语言”(主要是C / C ++)?那么您对高级语言的定义是什么?您需要清楚自己对高级语言的定义/解释。Python实际上是一种脚本语言,因为如果您现在还没有意识到,它会直接在其引擎(IDLE或命令行终端)上执行。为什么将C / C ++用作许多OS的实现语言是一个很好的理由(从哲学上和实践上来说),但是我敢肯定,这里的高级用户可能不会对这个问题有所了解。
hagubear13年

10
Android不是全新的操作系统。这只是Linux的另一种味道。
2013年

3
@hagubear 有一个很好的理由(从哲学和实践角度而言)为何将C / C ++用作许多OS的实现语言。这是什么很好的理由?
rtindru

2
如果我理解正确,则LISP机器的操作系统是用LISP编写的。尽管也许可以辩称所使用的方言是一种低级语言?
罗伯·费舍尔

Answers:


38

如果您研究奇点,Microsoft会朝这个方向进行一些非常有趣的研究:

http://research.microsoft.com/en-us/projects/singularity/

此外,Mothy Roscoe等人一直在研究Barrelfish,该桶使用Eclipse约束编程语言作为OS服务来解决各种OS管理和资源分配问题:

http://www.barrelfish.org/


哇,我不能投票,需要15次代表...今天才加入!非常感谢。
rtindru

9
@rtindru:即使有1个代表点,您也可以接受答案。“接受”答案是什么意思?
Marjan Venema

6
接受答案往往会减少新的答案/讨论。就个人而言,我建议至少再过一天不接受(针对此特定问题)。
布莱恩

1
我会添加Cosmos:开放源代码,第三方,不像奇异之处那么有趣,但有一些不错的主意!cosmos.codeplex.com
LorenzoDematté13年

38

在很大程度上取决于您将低级语言和高级语言之间划分的位置。例如,不同的人倾向于将诸如C ++之类的语言放在这种鸿沟的不同方面。

关于您的问题:

  1. 我认为低级和高级语言之间没有这种区别,但是解释型语言和可编译为本地指令的语言之间的区别更大。

    但是,程序员之间的文化也可能有所不同,因为曾经使用低级语言的程序员更多地关注他们做出的(设计)选择的性能方面。

  2. 如果您认为C ++是高级的,则至少有一个完全用高级语言编写的OS(Symbian OS是用C ++编写的)。阻止您使用大多数高级语言编写OS的两件事:

    • 操作系统需要对内存和硬件的低级访问,并对它们执行肮脏的把戏。通常认为这种访问对应用程序级程序是不安全的,因此许多高级语言都不允许这样做。
    • OS需要在不存在支持软件(例如解释器)的情况下执行。这使得用无法轻松编译成本机指令的语言编写操作系统非常困难。

35
没有诸如解释性语言或可编译为本地指令的语言之类的东西。语言是一组数学规则,它既不解释也不编译,它只是。插入 和比较。是解释器或编译器的特征,而不是语言的特征。每种语言都可以使用编译器或解释器来实现。如今,大多数语言都具有解释和编译实现。有C语言的解释器,所有主要的JavaScript实现都可以编译为本地代码。到底什么是本机代码?如果我编译Java到JVM字节码和运行
约尔格W¯¯米塔格

11
因为我的PC没有ARM CPU,所以我将C编译为ARM机器代码,并在ARM解释器上运行该代码,那么是什么使ARM本机而不是JVML?
约尔格W¯¯米塔格

5
@JörgWMittag:如果您的CPU可以直接执行Java字节码(而不使用其他JVM),则Java字节码是该CPU的本机代码。另外,我也不排除使用通常在VM中解释或执行的语言编写OS的可能性,但这确实使它们的选择不那么明显。
Bart van Ingen Schenau 2013年

15
@JörgWMittag-我同意可以编译或解释任何语言(编译bash脚本;使用解释性C ++(CINT / Cling)),但是语言设计中的许多决定都基于对语言的解释,编译或两者兼而有之。在解释器中,使用一种语言可以使您手动声明/初始化静态类型的变量,手动分配/释放内存,执行指针算术,记住检查数组的边界(相对于垃圾回收内存,推断动态类型,检查数组范围)。这条线是否100%清晰?否,但实际存在差异。
jimbob博士13年

15

这样做有很多充分的理由。

今天的低级语言是昨天的高级语言

是的,不管您信不信,甚至从前C甚至都被视为一种高级语言。甚至在大约20年前,已经很普遍地看到它被描述为“中级”语言。在那时,OO变得像今天一样流行,Java不存在,C#不存在,甚至C ++尚未得到适当的标准化。

历史惯性

您今天使用的操作系统具有深厚的历史渊源。Windows可以追溯到80年代初/中期,Unix可以追溯到70年代初/中期。操作系统中有很多旧的工作代码,并且您通常不想重写旧的工作代码。

在某些时候,您必须使用硬件

这发生在内核中,发生在驱动程序中,发生在内存管理子系统中,发生在文件系统中。当然,您可以在其上添加高级语言,但是您仍然需要能够直接访问较低级语言提供的硬件的功能。

可移植性

我并不是说可移植到不同的硬件或操作系统,因为它在当今已经越来越普遍了。这更加微妙。为某些内容提供基于C的接口的一个主要优点是,事实上,几乎所有其他存在的语言都可以链接到C。基于这个原因,即使Windows API如今仍是基于C的API。

个人喜好

有些人只是喜欢用这种方式编程,这可能是一个主要因素。例如,莱纳斯·托瓦尔兹(Linus Torvalds)对C ++有一个著名的言论,这很清楚地表明,就他而言,C将永远是他从事此类工作的首选工具(言论的内容以及您是否同意它)与该讨论无关;蚂蚁存在的事实就足够了)。

综上所述,这些应该可以清楚地确定为什么以前曾经使用C之类的东西最初编写一个操作系统,以及为什么其中很大一部分(即使在今天)仍然如此。


13

C在操作系统中占主导地位的主要原因在于历史-当前的主流操作系统,例如Windows和所有形式的Unix(BSD,Solaris,HP-UX,MacOS X,以及诸如Linux的克隆)都可以追溯到过去长期以来,在OO和其他“高级”结构成为主流之前。

对于操作系统的核心,除了性能之外,还需要非常具体地说明硬件指令,并且需要对内存进行完全控制,而像C这样的语言则表现得很好。

对于嵌入式系统,有时会有操作系统使用高级语言来表示系统的较大部分。一个著名的例子是Sun的JavaOS

对于广泛使用的操作系统,不使用C的一个显着例子是MacOS X之前的经典MacOS,这在很大程度上是用Pascal方言编写的,它允许某种形式的面向对象。


12

首先,存在一些引导问题。使高级语言更容易的大多数功能都是基于内核必须提供的抽象。如何用需要内存管理器的语言编写内存管理器?如何在不使用语言的漂亮I / O标准库的情况下编写I / O驱动程序?如何在不使用语言库的情况下创建线程和同步原语?

其次,在编写操作系统以将变量分配给特定的内存位置时,它非常有用且可读性更高。在C语言中这很容易,每个C程序员都知道该怎么做。如果甚至可以使用高级语言,也是如此,以至只有大师们才知道该怎么做。

换句话说,当您考虑了所有必须接受的限制和修改时,C和C ++看起来会容易得多。


2
您的第一段没有任何意义。C语言中的I / O驱动程序都不使用stdio.h。自定义互斥锁实现不使用pthreads。这就是自己实现它的意思!这与您使用的语言无关。但这并不是说高级语言是执行低级任务的好选择(根据我的经验,它们通常不存在)。

我对此很清楚。我只是指出,高级语言与低级语言的许多区别在于该语言在内核开发中不可用的那些部分。当您比较核心语言时,C看起来不再那么斯巴达语了。
Karl Bielefeldt

不太正确。当你需要一些代码,不使用X实现X,所有剩余的代码可以依赖于代码和使用十

那是个很好的观点。
Karl Bielefeldt

6

首先,引导程序至少需要一小部分以汇编或等效语言编写。

其次,写在一个无可争议HLL一个操作系统- Lisp机器。(它在商业上失败的事实,与其说其他硬件变得更便宜,更快,更糟的是胜利,不如说其哲学或设计上的缺陷与之相关)。

第三,C ++相当面向对象并且是高级的,因此,正如其他人指出的那样,Symbian OS是另一个例子。

第四,目前几乎不需要新的操作系统。我们已经有很多可以在几乎任何硬件上运行的linux和bsd版本,并且从头开始创建全新的操作系统非常昂贵。


您错过了Burroughs B5000大型机。他们的操作系统是用Burroughs Extended ALGOL编写的。
John R. Strohm 2013年

1
there is little need for new OSes at this time我还没有决定自己是否正确。是的,我们只需要现代OS(现代Windows(NT)/现代Unix),功能和性能。但是几乎没有:他们出生在另一个领域,那里的“网”是公司/大学,并且用户值得信赖,multiproc是2/4处理器。它们在某种程度上受到过度信任(rootkit,恶意软件,病毒等)的困扰。我开始认为,现代,安全,隔离的操作系统还有空间,也可以更好地支持并行性(更好的是线程)
LorenzoDematté13年

Lisp 低级的,CAR并且CDRIBM 704汇编器宏!甚至C也会分隔内联汇编,而不是将其视为任何其他函数。考虑Lisp的CARCDR在x86,ARM的工作,和超过国际检索单位主机,这是一些令人印象深刻的便携式组装。(对我可能感到困惑的任何人的旁注:是的,Lisp是一种高级语言。CARCDR成为汇编宏只是实现细节,而不是关键功能。;))
8bittree

4

为了更好地分阶段我之前写的内容。

Burroughs 5xxx-6xxx机器没有汇编语言。可用的最低语言是对Algol的扩展。Algol在硬件中实现。操作系统和所有语言均使用Algol编写。它比当时所有竞争对手的机器都要好。它还需要更少的代码,这使得维护起来更加容易。它具有支持递归语言(例如Algol)的堆栈硬件。

Burroughs操作系统演变成一个称为MCP的版本。MCP当前在Unisys系统上运行。


3

您提到的大多数高级语言都具有与操作系统不太匹配的功能:自动内存管理。在编写实时系统时,您不能依靠垃圾收集器-要么是软的(即操作系统),要么是最差的硬。引用Tanenbaum [i]:

C没有的一些东西包括内置的字符串,线程,包,类,对象,类型安全性和垃圾回收。最后一个是用于操作系统的显示停止器。C语言中的所有存储都是静态的或由程序员显式分配和释放的,通常是使用库函数mallocfree。后者的属性-程序员对内存的完全控制-以及显式指针使C对编写操作系统具有吸引力。操作系统在某种程度上基本上是实时系统,甚至是通用系统。发生中断时,操作系统可能只有几微秒的时间来执行某些操作或丢失关键信息。在任意时刻启动垃圾回收是无法忍受的。

现在,您可能会争论C ++也是不错的选择,因为它提供了手动内存管理。C ++已经在某些操作系统中使用,例如Symbian(由Bart提到)和BeOS。但是,恕我直言,C语言仍然是可以最快地移植到许多体系结构中的语言,而无需付出很大的努力(与特定体系结构的组装相反)。

[i]:现代操作系统第3版,第73页


3
Symbolics机器具有自动内存管理功能。Smalltalk在奥拓上做了。那是在80年代。线性系统完全消除了GC的必要性。如果我们能记住这一点,这些问题就已经解决了!
弗兰克Shearar

一种语言可能会包括自动内存管理,但会包含一种特殊的“深度固定”引用,并允许方法明确声明它们将不会访问任何非固定引用,也不会调用可能这样做的任何方法。不需要世间无用的垃圾收集器来干扰在不会访问任何可能由GC修改的对象的方法中运行的代码。
supercat

2

正如其他人指出的那样,已经用高级语言编写了几种操作系统。也许您的意思是,所有成功的,大众市场的通用操作系统都是用汇编,C和C ++的某种组合编写的?

大多数高级语言都具有大量有用的功能,这些功能会带来相关的性能成本。自动化内存管理是一个明显的例子,数组的边界检查是另一个例子。如果您正在编写通用操作系统,则可能会遇到这些有用功能的性能损失超出您愿意支付的情况。到那时,您希望能够将其关闭。诸如Python,C#和Java之类的语言在可以关闭的功能方面有所不同,但是在这方面,它们都不像C或C ++那样通用。

在这方面,C和C ++几乎与纯汇编一样通用。如果您决定需要十个不同的内存管理器来涵盖十个不同的内存分配方案,则可以在C和C ++中全部实现它们,并根据需要加载和卸载它们。哎呀,如果不想的话,您甚至不必链接到标准C运行时库或启动代码。


0

真正的答案是金钱。高级语言操作系统没有足够的可察觉的好处,不足以证明花费资源来构建一个并随后将其推向主流。例如,为需要支持的每个硬件构建新的驱动程序会涉及大量成本。

有多种以高级语言编写的OS,其主要研究目的是OberonSingularity

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.