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.
- 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?
- Warum haben wir kein vollwertiges Betriebssystem, das ausschließlich auf einer Hochsprache basiert?
Antworten:
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/
quelle
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:
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.
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:
quelle
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.
quelle
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ß.
quelle
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.
quelle
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).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.
quelle
there is little need for new OSes at this time
Ich 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)CAR
undCDR
besteht aus IBM 704-Assembler-Makros ! Sogar C trennt die Inline-Assemblierung , anstatt sie wie jede andere Funktion zu behandeln. In Anbetracht von LispsCAR
und derCDR
Arbeit 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.CAR
UndCDR
sein Assembler - Makros war nur eine Implementierung Detail, kein wesentliches Merkmal . ;))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.
quelle
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:
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
quelle
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.
quelle
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 .
quelle