なぜ高レベル言語ベースのOSがないのですか?低レベル言語はより効率的ですか?


44

予想外のことをせずに、この可能性を検討してほしい。現在、ほとんどのOSはかなり低レベルの言語(主にC / C ++)に基づいています。Androidなどの新しい言語でもJNIを使​​用しており、基礎となる実装はCで行われています

実際、(これは個人的な観察です)Cで書かれた多くのプログラムは、高レベルのものよりもはるかに高速に実行されます(例:Transmission(Ubuntuのbittorrentクライアント)は、Vuze(Java)またはDeluge(Python)よりもはるかに高速です)。PyPyは例外ですが、PythonコンパイラでさえCで書かれています。

これには特別な理由がありますか?優れた「OOP」の概念を備えたいわゆる「高レベル言語」がすべて、堅牢なOSの作成に使用できないのはなぜですか?

基本的に2つの質問があります。

  1. なぜ低レベル言語で記述されたアプリケーションは、HLLの対応言語よりも効率的ですか?低レベル言語は、低レベルであり、マシンコードへの翻訳が簡単であるという単純な理由により、パフォーマンスが向上しますか?
  2. 完全に高レベル言語に基づいた本格的なOSがないのはなぜですか?

36
「高レベル言語」のみがオブジェクト指向であることを意味しますが、これは正しくありません。
うおお

2
@rtindru "かなり低レベルの言語"(主にC / C ++)?では、高級言語の定義は何ですか?高水準言語の定義/解釈について明確にする必要があります。Pythonは実際にはスクリプト言語であり、エンジン(IDLEまたはコマンドラインターミナル)で直接実行されます(まだ気付いていない場合)。C / C ++が多くのOSの実装言語として使用される理由(哲学的かつ実用的)が非常にありますが、ここのパワーユーザーはおそらくこの質問に飛び込むことはないでしょう。
ハグベア

10
Androidはまったく新しいOSではありません。これは単なるLinuxのフレーバーです。
デン

3
@hagubear C / C ++が多くのOSの実装言語として使用されるのには、非常に正当な理由(哲学的かつ実用的)があります。この非常に良い理由は何ですか?
rtindru

2
正しく理解できれば、LISPマシンのOSはLISPで作成されています。おそらく、使用されている方言が低レベルの言語であると主張できますか?
ロバートフィッシャー

回答:


38

特異点を調べると、Microsoftはこの方向で非常に興味深い研究を行っています。

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

また、Mothy Roscoe氏は、Eclipse制約プログラミング言語をOSサービスとして使用して、あらゆる種類のOS管理とリソース割り当ての問題を解決するBarrelfishに取り組んでいます。

http://www.barrelfish.org/


うわー、投票できません、15人の担当者が必要です...ちょうど今日参加しました!どうもありがとう。
-rtindru

9
@rtindru:担当者が1人であっても、回答を受け入れることができます。回答が「受け入れられる」とはどういう意味ですか?
マルジャンヴェネマ

6
回答を受け入れると、新しい回答/議論が減る傾向があります。個人的には、少なくとも1日間は(この特定の質問に対して)受け入れないことをお勧めします。
ブライアン

1
Cosmosを束に追加します。オープンソース、サードパーティ、特異性ほど面白くありませんが、いくつかの素晴らしいアイデアがあります。cosmos.codeplex.com
ロレンツォDematté

38

多くは、低レベル言語と高レベル言語の区分をどこに置くかに依存します。たとえば、人によって、C ++のような言語をその境界の異なる側面に配置する傾向があります。

あなたの質問について:

  1. 低レベル言語と高レベル言語にはこのような違いがあるとは思わないが、インタープリター言語とネイティブ命令にコンパイルされる言語にはさらに違いがある。

    しかし、プログラマー間の文化にも違いがある可能性があります。プログラマーは、低レベル言語を使用する1回目は、彼らが行う(設計)選択のパフォーマンスの側面により重点を置いています。

  2. C ++を高レベルと見なす場合、少なくとも1つのOSが完全に高レベル言語で記述されています(Symbian OSはC ++で記述されています)。ほとんどの高級言語でOSを書くことを妨げるものは2つあります。

    • OSは、メモリとハードウェアへの低レベルのアクセスを必要とし、それらに対してダーティートリックを実行します。この種のアクセスは一般にアプリケーションレベルのプログラムにとって安全ではないと見なされているため、多くの高レベル言語ではアクセスが許可されていません。
    • OSは、インタープリターなどのサポートソフトウェアが存在しない状態で実行する必要があります。これにより、簡単にネイティブ命令にコンパイルできない言語でOSを記述することは非常に難しくなります。

35
インタプリタ言語やネイティブ命令にコンパイルされる言語などはありません。言語は数学的ルールのセットであり、解釈もコンパイルもされず、ただです。Interp。とコンプ。言語ではなく、インタプリタまたはコンパイラの特性です。すべての言語は、コンパイラーまたはインタープリターを使用して実装できます。現在、ほとんどの言語には、解釈された実装とコンパイルされた実装があります。C用のインタープリターがあり、すべての主要なJavaScript実装はネイティブコードにコンパイルされます。とにかくネイティブコードとは何ですか?私は、JVMバイトコードへのJavaをコンパイルして実行する場合
イェルクWミッタークを

11
それはJava CPUで、CをARMマシンコードにコンパイルし、ARMインタープリターで実行します。これは、PCにARM CPUがないため、ARMネイティブとJVMLがないのはなぜですか?
ヨルグWミッターグ

5
@JörgWMittag:Javaバイトコードを(追加のJVMを使用せずに)直接実行できるCPUがある場合、JavaバイトコードはそのCPUのネイティブコードです。また、VMで通常解釈または実行される言語でOSを作成する可能性を排除していませんが、選択をあまり明確にしません。
バートヴァンインゲンシェナウ

15
@JörgWMittag-任意の言語をコンパイルまたは解釈できることに同意します(bashスクリプトをコンパイルします;解釈されたC ++(CINT / Cling)を使用します)が、言語設計における多くの決定は、これが解釈、コンパイル、またはその両方に基づいていることに基づきます。静的に型指定された変数を手動で宣言/初期化し、メモリを手動で割り当て/解放し、ポインタ演算を行い、配列の境界を確認することを忘れないようにする言語は、インタープリタではあまり便利ではありません(メモリをガベージコレクションし、動的型を推測する言語に対して、配列の境界を確認します)。この行は100%明確ですか?いいえ、しかし実際には違いがあります。
ジンボブ博士13年

15

これには多くの正当な理由があります。

今日の低レベル言語は昨日の高レベル言語でした

はい、信じられないかもしれませんが、むかしむかしCも高級言語と見なされていました。〜20年前でさえ、それが「中間レベル」言語として記述されるのを見るのに十分一般的でした。これは、OOが今日と同じくらい人気があり、Javaが存在せず、C#が存在せず、C ++がまだ適切に標準化されていなかった時代でした。

歴史的慣性

現在使用しているオペレーティングシステムは、歴史に深く根ざしています。Windowsは80年代前半/中期に戻り、UNIXは70年代前半/中期に戻ります。オペレーティングシステムには多くの古い動作中のコードがあり、通常、古い動作中のコードを書き直したくありません。

ある時点で、ハードウェアに行く必要があります

これはカーネルで発生し、ドライバーで発生し、メモリ管理サブシステムで発生し、ファイルシステムで発生します。その上に高レベル言語を重ねることはできますが、低レベル言語が提供するハードウェアにより直接アクセスする機能が必要です。

移植性

今日一般的に理解されているように、異なるハードウェアや異なるOSへの移植性を意味するものではありません。これはより微妙です。何かにCベースのインターフェイスを提供することの1つの大きな利点があります。それは、事実上、存在する他のすべての言語がCにリンクできるという事実です。

個人の好み

一部の人々はこの方法でプログラムすることを好むだけであり、それが大きな要因になる可能性があります。たとえば、Linus TorvaldsにはC ++に対する有名な暴言があり、彼が懸念している限り、Cは常にこの種の作業に最適なツールであることがはっきりしています(暴言の内容と同意するかどうか)この議論とは無関係です;暴言が存在するという事実で十分です)。

まとめると、これらは、昔はオペレーティングシステムが元々Cのようなもので書かれていた理由と、今日でも非常に重要なチャンクが残っている理由を明確に確立するはずです。


13

オペレーティングシステムでCが優勢である主な理由は歴史にあります-Windowsやあらゆる形式のUnix(BSD、Solaris、HP-UX、MacOS Xなど)のような現在の主流のオペレーティングシステムとLinuxのようなクローン長い間、オブジェクト指向やその他の「高レベル」構造が主流になる前に。

パフォーマンス以外のオペレーティングシステムのコアについては、ハードウェア命令について非常に具体的に説明する必要があり、Cなどの言語が非常にうまく機能するメモリを完全に制御する必要があります。

組み込みシステムの場合、システムの大部分に高レベルの言語を使用するオペレーティングシステムが存在する場合があります。1つの注目すべき例は、SunによるJavaOSです。

で記述された大部分であった-広範囲のオペレーティングシステムにもCを使用していない顕著な例は、MacOS Xの前に古典のMacOSであるパスカルの方言オブジェクト指向のいくつかのフォームを可能にしました。


12

まず、いくつかのブートストラップの問題があります。高レベル言語を簡単にする機能のほとんどは、カーネルが提供する必要がある抽象化に基づいています。メモリマネージャーを必要とする言語でメモリマネージャーを記述する方法 使用している言語の優れたI / O標準ライブラリを使用せずに、I / Oドライバをどのように作成しますか?言語のライブラリを使用せずに、どのようにスレッド化および同期プリミティブを作成しますか?

第二に、オペレーティングシステムを記述するときに変数を特定のメモリ位置に割り当てることができるため、非常に便利で読みやすくなります。これはCでは簡単であり、すべてのCプログラマーがその方法を知っています。より高レベルの言語でも可能であれば、それを行う方法を知っているのはグルだけです。

つまり、受け入れる必要のあるすべての制限と変更を考慮すると、CとC ++の方がはるかに見やすくなります。


2
最初の段落は意味がありません。CのI / Oドライバーstdio.hもどちらも使用しません。カスタムmutex実装は、pthreadを使用しません。それはまさにそれを自分で実装することを意味します!そして、それはあなたが使用している言語に依存しません。それは、低レベルのタスクには高レベルの言語が適していると言うことではありません(通常、私の経験にはありません)。

私はそれを知っています。高レベル言語と低レベル言語を区別するものの多くは、カーネル開発では利用できない言語の部分にあることを指摘しています。コアとコアの言語を比較すると、Cはもはや質素ではありません。
カールビーレフェルト

まったくそうではありません。あなたが必要とする一方で、いくつかの Xを実装するためにXを使用していないコードを、残りのすべてのコードは、そのコードと使用X.に依存することができます

それは良い点です。
カールビーレフェルト

6

まず第一に、ブートストラップには、アセンブリまたは同等のもので書かれた少なくとも小さな部分が必要です。

第二に、そこにいた -議論の余地なくHLLで記述されたOS のLispマシン。(商業的に失敗したという事実は、他のハードウェアがより速く安くなることに関係しており、Worseの勝利はその哲学や設計の欠陥より優れています)。

第三に、C ++は非常にオブジェクト指向で高レベルなので、他の人が指摘したように、Symbian OSは別の例です。

第4に、現時点では新しいOSはほとんど必要ありません。ほぼすべてのハードウェアで実行されるLinuxおよびbsdのフレーバーがかなりあり、新しいOSをゼロから作成するのは非常に高価です。


バローズB5000メインフレームを見逃しました。彼らのオペレーティングシステムは、バロウズ拡張ALGOLで書かれています。
ジョンR.ストローム

1
there is little need for new OSes at this timeこれが本当かどうかはまだ決まっていません。はい。最新のOS(モダンウィンドウ(NT)/最新のUnix)が必要なのは、機能とパフォーマンスの面ですべてです。しかし、かろうじて:彼らは、「ネット」が企業/大学であり、ユーザーが信頼し、multiprocが2/4プロセッサであった別の領域で生まれました。それらは、過剰な信頼(ルートキット、マルウェア、ウイルスなど)により、ある程度「苦しんで」います。私は、近代的で安全な、孤立したOSのためのスペースがあると考え始めています...並列処理のより良いサポート(スレッドよりも良い)
ロレンツォデマテ

Lisp 低レベルでCARありCDRIBM 704アセンブラーマクロです!Cでさえ、他の関数として扱うのではなく、インラインアセンブリを分離します。Lispの考慮CARCDRのx86、ARM、およびいくつかの印象的なポータブルアセンブリだのISA以上のホスト上で動作します。(私は混乱している可能性が誰にサイドノートでは:はい、Lispは高レベルの言語である。CARCDRされてアセンブラマクロはちょうど実装の詳細ではなく、重要な機能だった。))
8bittree

4

私が以前に書いたものをより良い段階にするために。

バロウズ5xxx-6xxxマシンにはアセンブリ言語がありませんでした。使用可能な最も低い言語は、Algolの拡張機能でした。Algolはハードウェアに実装されました。OSとすべての言語は、アルゴルで書かれています。当時のすべての競合マシンよりも優れていました。また、必要なコードが大幅に少なくなり、メンテナンスがはるかに簡単になりました。Algolなどの再帰言語をサポートするスタックハードウェアがありました。

バローズオペレーティングシステムは、MCPと呼ばれるバージョンに進化しました。MCPは現在、Unisysシステムで実行されます。


3

あなたが言及する高レベル言語のほとんどには、オペレーティングシステムにうまく適合しない機能があります:自動メモリ管理。リアルタイムシステムを記述するときに、ガベージコレクターに依存することはできません。ソフト(オペレーティングシステムとは)または最悪のハードのいずれかです。Tanenbaum [i]を引用するには:

Cにはないものには、組み込みの文字列、スレッド、パッケージ、クラス、オブジェクト、タイプセーフ、およびガベージコレクションが含まれます。最後の1つは、オペレーティングシステムのショーストッパーです。Cのすべてのストレージは静的であるか、通常はライブラリ関数mallocおよびfreeを使用してプログラマーによって明示的に割り当てられて解放されます。Cをオペレーティングシステムの作成に魅力的なものにするのは、明示的なポインタとともに、後者のプロパティ(メモリに対するプログラマの完全な制御)です。オペレーティングシステムは、基本的にはある程度リアルタイムシステムであり、汎用システムであっても同様です。割り込みが発生した場合、オペレーティングシステムは、アクションを実行したり重要な情報を失ったりするのに数マイクロ秒しかかからない場合があります。ガベージコレクションを任意のタイミングで開始することは許されません。

ここで、C ++は手動のメモリ管理を提供するため、C ++も適切な候補であると主張するかもしれません。C ++は、Symbian(Bartによる言及)やBeOS などの一部のオペレーティングシステムで既に使用されています。ただし、IMHO Cは、(特定のアーキテクチャのアセンブリとは対照的に)多大な労力をかけずに多くのアーキテクチャに移植できる最速の言語です。

[i]:Modern Operating Systems第3版、73ページ


3
Symbolicsマシンには自動メモリ管理がありました。SmalltalkはAltoで行いました。それは80年代でした。線形型システムは、GCの必要性を完全に取り除きます。私たちだけがそれを覚えていれば、これらは解決された問題です!
フランク・シーラー

言語に自動メモリ管理を含めることは可能ですが、特別な種類の「深く固定された」参照を含め、メソッドが非固定参照にアクセスせず、そうする可能性のあるメソッドを呼び出さないことを明示的に宣言できます。GCによって変更される可能性のあるオブジェクトにアクセスしないメソッドで実行されているコードに干渉する、世界を停止するガベージコレクターは必要ありません。
supercat

2

他の人が指摘しているように、いくつかのオペレーティングシステムは高級言語で書かれています。おそらく、あなたが言っているのは、成功した大衆市場の汎用OSはすべて、アセンブリ、C、C ++の組み合わせで書かれているということでしょうか?

ほとんどの高水準言語には、関連するパフォーマンスコストをもたらす便利な機能が数多くあります。自動化されたメモリ管理は明らかな例であり、配列の境界チェックも別の方法です。汎用OSを作成している場合、これらの便利な機能のパフォーマンスの低下が、支払おうとする以上の状況に陥る可能性があります。その時点で、それらをオフにすることができます。Python、C#、Javaなどの言語は、どの機能をオフにできるかによって異なりますが、この点でCやC ++ほど汎用性のあるものはありません。

この側面では、CおよびC ++は、純粋なアセンブリとほぼ同じ汎用性があります。10種類のメモリ割り当てシナリオをカバーする10種類のメモリマネージャが必要であると判断した場合は、それらすべてをCおよびC ++で実装し、適切な方法でロードおよびアンロードできます。要するに、標準のCランタイムライブラリや起動コードにリンクする必要さえありません。


0

本当の答えはお金です。高レベル言語OSの利点は、リソースを構築してそれをメインストリームに投入するためにリソースを費やすことを正当化するほど十分ではありませんたとえば、サポートする必要のあるハードウェアごとに新しいドライバーを構築するには、莫大な費用がかかります。

OberonSingularityなど、研究を主な目的とする高レベル言語で記述されたさまざまなOSがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.