Warum nicht ein High Level Language-basiertes Betriebssystem? Sind Low-Level-Sprachen effizienter?


44

Ohne anmaßend zu sein, möchte ich Sie bitten, die Möglichkeit dazu in Betracht zu ziehen. Die meisten heutigen Betriebssysteme basieren auf ziemlich einfachen Sprachen (hauptsächlich C / C ++). Sogar die neuen wie Android verwenden JNI und die zugrunde liegende Implementierung ist in C

Tatsächlich (dies ist eine persönliche Beobachtung) laufen viele Programme, die in C geschrieben wurden, viel schneller als ihre Vorgänger (zB: Transmission (ein Bittorrent-Client unter Ubuntu) ist viel schneller als Vuze (Java) oder Deluge (Python) ). Sogar Python-Compiler sind in C geschrieben, obwohl PyPy eine Ausnahme darstellt.

Gibt es dafür einen bestimmten Grund? Warum können all unsere so genannten "High Level Languages" mit den großartigen "OOP" -Konzepten nicht zur Erstellung eines soliden Betriebssystems verwendet werden?

Ich habe also im Grunde 2 Fragen.

  1. Warum sind Anwendungen, die in einfachen Sprachen geschrieben sind, effizienter als ihre HLL-Kollegen? Ist die Leistung von Low-Level-Sprachen einfach deshalb besser, weil sie niedriger sind und einfacher in Maschinencode übersetzt werden?
  2. Warum haben wir kein vollwertiges Betriebssystem, das ausschließlich auf einer Hochsprache basiert?

36
Sie implizieren, dass nur "Hochsprachen" objektorientiert sind, was nicht wahr ist.
Uooo

2
@rtindru "Ziemlich einfache Sprache" (hauptsächlich C / C ++)? Was ist dann Ihre Definition von Hochsprache? Sie müssen sich über Ihre Definition / Interpretation der Hochsprache im Klaren sein. Python ist eigentlich eine Skriptsprache, da es direkt auf seiner Engine (IDLE oder Kommandozeilenterminal) ausgeführt wird, wenn Sie das bis jetzt nicht bemerkt haben. Es gibt einen sehr guten Grund (philosophisch und praktisch), warum C / C ++ als Implementierungssprache für viele Betriebssysteme verwendet wird, aber ich bin sicher, dass die Hauptbenutzer hier bei dieser Frage wahrscheinlich nicht darauf eingehen werden.
Hagubear

10
Android ist kein brandneues Betriebssystem. Es ist nur eine andere Linux-Variante.
Den

3
@hagubear Es gibt einen sehr guten Grund (philosophisch und praktisch), warum C / C ++ als Implementierungssprache für viele Betriebssysteme verwendet wird . Was ist das für ein sehr guter Grund?
rtindru

2
Wenn ich das richtig verstehe, wurde das Betriebssystem für LISP-Maschinen in LISP geschrieben. Obwohl vielleicht argumentiert werden könnte, dass der verwendete Dialekt eine Muttersprache war?
Robert Fisher

Antworten:


38

Microsoft hat einige sehr interessante Untersuchungen in diese Richtung durchgeführt, wenn Sie sich Singularity ansehen:

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

Außerdem haben Mothy Roscoe et al. An Barrelfish gearbeitet, das die Programmiersprache Eclipse Constraint als Betriebssystemdienst verwendet, um alle Arten von Problemen bei der Betriebssystemverwaltung und der Ressourcenzuweisung zu lösen:

http://www.barrelfish.org/


Wow, ich kann nicht abstimmen, brauche 15 Wiederholungen ... bin gerade dabei! Danke vielmals.
rtindru

9
@rtindru: Auch mit 1 Wiederholungspunkt können Sie eine Antwort akzeptieren. Was bedeutet es, wenn eine Antwort "akzeptiert" wird?
Marjan Venema

6
Das Akzeptieren einer Antwort kann dazu führen, dass neue Antworten / Diskussionen reduziert werden. Persönlich würde ich empfehlen, dies für mindestens einen weiteren Tag nicht anzunehmen.
Brian

1
Ich würde Cosmos hinzufügen: Open Source, Drittanbieter, nicht so interessant wie Singularität, aber ein paar nette Ideen! cosmos.codeplex.com
Lorenzo Dematté

38

Viel hängt davon ab, wo Sie die Unterscheidung zwischen einfachen und hohen Sprachen vornehmen. Zum Beispiel neigen verschiedene Leute dazu, eine Sprache wie C ++ auf verschiedene Seiten dieser Kluft zu setzen.

In Bezug auf Ihre Fragen:

  1. Ich glaube nicht, dass es einen solchen Unterschied zwischen Sprachen auf niedriger und hoher Ebene gibt, sondern eher einen Unterschied zwischen interpretierten Sprachen und Sprachen, die sich zu muttersprachlichen Anweisungen kompilieren lassen.

    Es kann aber auch einen Unterschied in der Kultur zwischen Programmierern geben, bei denen sich die Benutzer einer einfachen Sprache mehr auf die Leistungsaspekte der von ihnen getroffenen (Entwurfs-) Entscheidungen konzentrieren.

  2. Wenn Sie C ++ als High-Level-Betriebssystem betrachten, ist mindestens ein Betriebssystem vollständig in einer High-Level-Sprache geschrieben (Symbian OS ist in C ++ geschrieben). Was Sie davon abhält, ein Betriebssystem in den meisten höheren Sprachen zu schreiben, sind zwei Dinge:

    • Ein Betriebssystem benötigt Zugriff auf Arbeitsspeicher und Hardware auf niedriger Ebene und führt schmutzige Tricks mit ihnen durch. Diese Art des Zugriffs wird im Allgemeinen für Programme auf Anwendungsebene als unsicher eingestuft, sodass dies in vielen höheren Sprachen nicht zulässig ist.
    • Ein Betriebssystem muss ausgeführt werden, ohne dass Unterstützungssoftware vorhanden ist, z. B. Dolmetscher. Dies macht es extrem schwierig, ein Betriebssystem in einer Sprache zu schreiben, die nicht einfach zu nativen Anweisungen kompiliert werden kann.

35
Es gibt keine interpretierte Sprache oder eine Sprache, die sich zu muttersprachlichen Anweisungen kompilieren lässt. Eine Sprache ist ein Satz mathematischer Regeln, sie wird weder interpretiert noch kompiliert, sondern ist es einfach . Interp. und Comp. sind Eigenschaften des Interpreten oder des Compilers, nicht der Sprache. Jede Sprache kann mit einem Compiler oder einem Interpreter implementiert werden. Die meisten Sprachen haben heute sowohl interpretierte als auch kompilierte Implementierungen. Es gibt Interpreter für C und alle wichtigen JavaScript-Implementierungen, die in systemeigenen Code kompiliert werden. Und was ist nativer Code überhaupt? Wenn ich Java nach JVM-Bytecode kompiliere und starte
Jörg W Mittag

11
das auf einer Java-CPU, und ich kompiliere C zu ARM-Maschinencode und führe das auf einem ARM-Interpreter aus, weil mein PC keine ARM-CPU hat. Was macht dann ARM nativ und JVML nicht?
Jörg W Mittag

5
@ JörgWMittag: Wenn Sie eine CPU haben, die Java-Bytecode direkt ausführen kann (ohne eine zusätzliche JVM zu verwenden), ist Java-Bytecode der native Code für diese CPU. Außerdem schließe ich die Möglichkeit nicht aus, ein Betriebssystem in einer Sprache zu schreiben, die normalerweise in einer VM interpretiert oder ausgeführt wird, aber dies macht die Auswahl weniger offensichtlich.
Bart van Ingen Schenau

15
@ JörgWMittag - Ich bin damit einverstanden, dass jede Sprache kompiliert oder interpretiert werden kann (kompilieren Sie ein Bash-Skript; verwenden Sie interpretiertes C ++ (CINT / Cling)), aber viele Entscheidungen im Sprachdesign basieren darauf, ob dies interpretiert, kompiliert oder beides ist. Eine Sprache, mit der Sie statisch typisierte Variablen manuell deklarieren / initialisieren, Speicher manuell zuweisen / freigeben, Zeigerarithmetik ausführen und die Array-Grenzen überprüfen können, ist in einem Interpreter weniger praktisch (im Vergleich zu einer Sprache, die Speicher durch Garbage-Collect sammelt und dynamischen Typ ergibt). überprüft Arraygrenzen). Ist diese Linie 100% klar? Nein, aber der Unterschied besteht in der Praxis.
Dr. Jimbob

15

Dafür gibt es eine Reihe von guten Gründen.

Die Muttersprache von heute war die Hochsprache von gestern

Ja, ob Sie es glauben oder nicht, früher wurde sogar C als Hochsprache angesehen. Noch vor ca. 20 Jahren war es üblich genug, es als "Mittelstufe" zu bezeichnen. Dies war eine Zeit bevor OO so populär war wie heute, Java existierte nicht, C # existierte nicht, sogar C ++ war noch nicht richtig standardisiert.

Historische Trägheit

Betriebssysteme, die Sie heute verwenden, sind tief in der Geschichte verwurzelt. Windows geht zurück auf die frühen / mittleren 80er Jahre, Unix geht zurück auf die frühen / mittleren 70er Jahre. In Betriebssystemen gibt es viele alte, funktionierende Codes, und Sie möchten im Allgemeinen keinen alten, funktionierenden Code umschreiben.

Irgendwann muss man auf die Hardware runter

Dies geschieht im Kernel, in Treibern, in Speicherverwaltungssubsystemen und im Dateisystem. Sicher, Sie können eine Hochsprache darüber legen, aber Sie müssen immer noch die Möglichkeit haben, direkter auf die Hardware zuzugreifen, die eine niedrigere Sprache bietet.

Portabilität

Ich meine nicht die Portabilität auf andere Hardware oder ein anderes Betriebssystem, wie es heute allgemein verstanden wird. das ist subtiler. Es gibt einen großen Vorteil, eine C-basierte Schnittstelle für etwas bereitzustellen, und das ist die Tatsache, dass praktisch jede andere Sprache, die vorhanden ist, eine Verknüpfung zu C herstellen kann. Auch die Windows-API ist aus diesem Grund noch eine C-basierte API.

Persönliche Präferenz

Einige Leute bevorzugen es einfach, auf diese Weise zu programmieren, und das kann ein wichtiger Faktor sein. Zum Beispiel hat Linus Torvalds eine berühmte Parole gegen C ++ , was ziemlich deutlich macht, dass C für diese Art von Arbeit immer sein Werkzeug sein wird (der Inhalt der Parole und ob Sie damit einverstanden sind oder nicht) ist für diese Diskussion irrelevant; die Tatsache, dass es das Geschwätz gibt, reicht aus).

Zusammengenommen sollten diese klar belegen, warum ein Betriebssystem ursprünglich in etwas wie C geschrieben wurde und warum sehr bedeutende Teile davon - auch heute noch - so bleiben.


13

Ein Hauptgrund für die Dominanz von C für Betriebssysteme liegt in der Geschichte - aktuelle Mainstream-Betriebssysteme wie Windows und alle Formen von Unix (BSD, Solaris, HP-UX, MacOS X, ... sowie Klone wie Linux) gehen zurück lange bevor OO und andere "high level" Konstrukte zum Mainstream wurden.

Für den Kern des Betriebssystems gibt es neben der Leistung sehr spezifische Anforderungen an die Hardwareanweisungen und man muss die volle Kontrolle über den Speicher haben, welche Sprachen wie C sehr gut funktionieren.

Bei eingebetteten Systemen gibt es manchmal Betriebssysteme, die höhere Sprachen für größere Teile des Systems verwenden. Ein bemerkenswertes Beispiel ist JavaOS von Sun.

Ein bemerkenswertes Beispiel für weitverbreitete Betriebssysteme, die kein C verwenden, ist das klassische MacOS vor MacOS X - das größtenteils in einem Dialekt von Pascal geschrieben wurde, der irgendeine Form der Objektorientierung zuließ.


12

Erstens gibt es einige Bootstrap-Probleme. Die meisten Funktionen, die Hochsprachen vereinfachen, basieren auf Abstraktionen, die ein Kernel selbst bereitstellen muss. Wie schreibe ich einen Speichermanager in einer Sprache, die einen Speichermanager erfordert? Wie schreibt man I / O-Treiber, ohne die netten I / O-Standardbibliotheken Ihrer Sprache zu verwenden? Wie können Sie Threading- und Synchronisationsprimitive erstellen, ohne die Sprachbibliotheken zu verwenden?

Zweitens ist es beim Schreiben von Betriebssystemen äußerst nützlich und viel lesbarer, wenn Sie einer Variablen einen bestimmten Speicherort zuweisen können. Dies ist in C einfach und jeder einzelne C-Programmierer weiß, wie es geht. Wenn es sogar in höheren Sprachen möglich ist, ist es so selten, dass nur Gurus wissen, wie es geht.

Mit anderen Worten, wenn Sie alle Einschränkungen und Änderungen berücksichtigen, die Sie akzeptieren müssten, sehen C und C ++ viel einfacher aus.


2
Dein erster Absatz ergibt keinen Sinn. Ein E / A-Treiber in C verwendet auch nicht stdio.h. Eine benutzerdefinierte Mutex-Implementierung verwendet keine pthreads. Genau das bedeutet es, es selbst umzusetzen! Und das ist unabhängig von der Sprache, die Sie verwenden. Das heißt nicht, dass Hochsprachen eine gute Wahl für Aufgaben auf niedrigem Niveau sind (sie sind normalerweise nicht nach meiner Erfahrung).

Das ist mir bewusst. Ich möchte nur darauf hinweisen, dass vieles, was eine hohe von einer niedrigen Sprache unterscheidet, in den Teilen der Sprache liegt, die in der Kernelentwicklung nicht verfügbar sind. Wenn Sie die Sprachen von Kern zu Kern vergleichen, sieht C nicht mehr so ​​spartanisch aus.
Karl Bielefeldt

Nicht ganz richtig. Während Sie einen Code benötigen , der X nicht verwendet, um X zu implementieren, kann der gesamte verbleibende Code von diesem Code abhängen und X verwenden.

Das ist ein guter Punkt.
Karl Bielefeldt

6

Zunächst muss beim Bootstrapping mindestens ein kleiner Teil in Assembly oder einem gleichwertigen Element geschrieben werden.

Zweitens gab es ein Betriebssystem, das in einer HLL- Lisp-Maschine geschrieben war . (Die Tatsache, dass es kommerziell versagt hat, hat mehr damit zu tun, dass andere Hardware schneller billiger wird und der Siegeszug von Worse besser ist als mit Mängeln ihrer Philosophie oder ihres Designs).

Drittens ist C ++ ziemlich objektorientiert und auf hohem Niveau. Wie andere betonten, ist Symbian OS ein weiteres Beispiel.

Viertens besteht derzeit kaum Bedarf an neuen Betriebssystemen. Wir haben bereits eine ganze Reihe von Linux- und BSD-Versionen, die auf nahezu jeder Hardware laufen, und die Erstellung eines brandneuen Betriebssystems von Grund auf ist ziemlich teuer.


Sie haben die Burroughs B5000-Großrechner verpasst. Ihr Betriebssystem wurde in Burroughs Extended ALGOL geschrieben.
John R. Strohm

1
there is little need for new OSes at this timeIch habe mich immer noch nicht entschieden, ob dies zutrifft oder nicht. Ja, moderne Betriebssysteme (modernes Windows (NT) / modernes Unix) sind alles, was wir brauchen, was Funktionalität und Leistung betrifft. Aber kaum: Sie sind in einem anderen Bereich geboren, in dem "das Netz" Unternehmen / Universität war und den Benutzern vertraut wurde, und Multiprozessoren waren 2/4 Prozessoren. Sie sind bis zu einem gewissen Grad durch das Übermaß an Vertrauen (Rootkits, Malware, Viren ...) "geplagt". Ich fange an zu denken, dass es Platz für ein modernes, sicheres, isoliertes Betriebssystem gibt ... mit besserer Unterstützung für Parallelität (besser als Threads)
Lorenzo Dematté

Lisp ist auf niedrigem Niveau CARund CDRbesteht aus IBM 704-Assembler-Makros ! Sogar C trennt die Inline-Assemblierung , anstatt sie wie jede andere Funktion zu behandeln. In Anbetracht von Lisps CARund der CDRArbeit an x86, ARM und einer Vielzahl von über ISAs ist dies eine beeindruckend tragbare Baugruppe. (Randbemerkung zu jedem , den ich habe verwirrt kann: Ja, das ist Lisp eine Hochsprache. CARUnd CDRsein Assembler - Makros war nur eine Implementierung Detail, kein wesentliches Merkmal . ;))
8bittree

4

Zur besseren Phase, was ich vorher geschrieben habe.

Die Burroughs 5xxx - 6xxx-Maschinen hatten keine Assemblersprache. Die niedrigste verfügbare Sprache war eine Erweiterung von Algol. Der Algol wurde in Hardware implementiert. Das Betriebssystem und alle Sprachen wurden in Algol geschrieben. Es übertraf alle Konkurrenzmaschinen der Zeit. Außerdem wurde deutlich weniger Code benötigt, wodurch die Wartung erheblich vereinfacht wurde. Es hatte Stack-Hardware, die eine rekursive Sprache wie Algol unterstützte.

Das Betriebssystem Burroughs entwickelte sich zu einer Version namens MCP. MCP läuft derzeit auf Unisys-Systemen.


3

Die meisten der von Ihnen erwähnten höheren Sprachen haben eine Funktion, die nicht gut zu Betriebssystemen passt: Automatische Speicherverwaltung. Sie können sich beim Schreiben eines Echtzeitsystems nicht auf einen Garbage Collector verlassen - entweder soft (was ein Betriebssystem ist) oder sogar worst hard. Um Tanenbaum [i] zu zitieren:

Zu den Dingen, über die C nicht verfügt, gehören integrierte Zeichenfolgen, Threads, Pakete, Klassen, Objekte, Typensicherheit und Garbage Collection. Der letzte ist ein Show Stopper für Betriebssysteme. Der gesamte Speicher in C ist entweder statisch oder wird vom Programmierer explizit zugewiesen und freigegeben, normalerweise mit der Bibliotheksfunktion malloc und free . Es ist die letztere Eigenschaft - die vollständige Kontrolle des Programmierers über den Speicher - zusammen mit expliziten Zeigern, die C für das Schreiben von Betriebssystemen attraktiv macht. Betriebssysteme sind im Grunde genommen in gewissem Maße Echtzeitsysteme, auch solche für allgemeine Zwecke. Wenn ein Interrupt auftritt, hat das Betriebssystem möglicherweise nur wenige Mikrosekunden Zeit, um eine Aktion auszuführen oder wichtige Informationen zu verlieren. Es ist unerträglich, wenn die Müllabfuhr zu einem beliebigen Zeitpunkt einsetzt.

Nun könnte man argumentieren, dass C ++ auch ein guter Kandidat ist, da es eine manuelle Speicherverwaltung bietet. C ++ wurde bereits in einigen Betriebssystemen wie Symbian (von Bart erwähnt ) und BeOS verwendet. Aber IMHO C ist immer noch die schnellste Sprache, die in vielen Architekturen ohne großen Aufwand portiert werden kann (im Gegensatz zur Assemblierung einer bestimmten Architektur).

[i]: Modern Operating Systems 3. Auflage, Seite 73


3
Symbolics-Maschinen hatten eine automatische Speicherverwaltung. Smalltalk tat es auf einem Alto. Das war in den 80ern. Durch ein lineares System entfällt die Notwendigkeit einer GC vollständig. Das sind gelöste Probleme, wenn wir uns nur daran erinnern könnten!
Frank Shearar

Es wäre möglich, dass eine Sprache eine automatische Speicherverwaltung enthält, jedoch eine spezielle Art von "tief verankerten" Verweisen enthält, und dass Methoden explizit erklären können, dass sie auf keine nicht verankerten Verweise zugreifen und keine Methoden aufrufen, die dies tun könnten. Es wäre nicht erforderlich, dass ein weltweiter Garbage Collector den Code stört, der in einer Methode ausgeführt wird, die nicht auf Objekte zugreift, die möglicherweise vom GC geändert werden.
Supercat

2

Wie andere angemerkt haben, wurden mehrere Betriebssysteme in Hochsprachen geschrieben. Vielleicht meinen Sie damit, dass alle erfolgreichen Allzweck-Betriebssysteme für den Massenmarkt in einer Kombination aus Assembly, C und C ++ geschrieben wurden?

Die meisten High-Level-Sprachen verfügen über eine Vielzahl hilfreicher Funktionen, die mit Performance-Kosten verbunden sind. Die automatisierte Speicherverwaltung ist ein naheliegendes Beispiel, die Überprüfung von Arrays ist ein weiteres. Wenn Sie ein Allzweck-Betriebssystem schreiben, werden Sie wahrscheinlich in Situationen geraten, in denen die Leistungseinbußen dieser hilfreichen Funktionen höher sind, als Sie bereit sind, dafür zu zahlen. An diesem Punkt möchten Sie in der Lage sein, sie auszuschalten. Sprachen wie Python, C # und Java unterscheiden sich in den Funktionen, die Sie deaktivieren können, aber keine davon ist in dieser Hinsicht so vielseitig wie C oder C ++.

In dieser Hinsicht sind C und C ++ fast so vielseitig wie reine Assemblierung. Wenn Sie zehn verschiedene Speichermanager für zehn verschiedene Speicherzuweisungsszenarien benötigen, können Sie diese alle in C und C ++ implementieren und nach Belieben laden und entladen. Sie müssen nicht einmal eine Verknüpfung zu den Standard-C-Laufzeitbibliotheken oder dem Startcode herstellen, wenn Sie dies nicht möchten.


0

Die wirkliche Antwort ist Geld . Es gibt nicht genug wahrgenommene Vorteile eines Hochsprachen-Betriebssystems, um die Ausgaben für den Aufbau eines solchen zu rechtfertigen und es dann in den Mainstream zu drängen. Die Entwicklung eines neuen Treibers für jede Hardware, die beispielsweise unterstützt werden muss, ist mit enormen Kosten verbunden.

Es gibt verschiedene Betriebssysteme, die in Hochsprachen geschrieben sind, mit dem Hauptzweck der Forschung, wie Oberon und Singularity .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.