web-dev-qa-db-ja.com

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

ありふれたことなく、その可能性を考えていただきたい。今日のほとんどのOSは、かなり低レベルの言語(主にC/C++)に基づいています。AndroidはJNIを使​​用し、基礎となる実装はCです

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

これには特別な理由がありますか?優れた「OOP」コンセプトを備えたいわゆる「高水準言語」のすべてが、確実なOSの作成に使用できないのはなぜですか?

だから私は基本的に2つの質問があります。

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

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

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

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

http://www.barrelfish.org/

38
Rafe

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

あなたの質問について:

  1. 低水準言語と高水準言語の間にそのような違いがあるとは思わないが、解釈された言語とネイティブ命令にコンパイルされる言語の違いはもっと大きい。

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

  2. C++が高水準であると考える場合、少なくとも1つのOSが完全に高水準言語で書かれています(Symbian OSはC++で書かれています)。ほとんどの高級言語でOSを書くのを妨げているのは、次の2つです。

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

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

今日の低水準言語は昨日の高水準言語でした

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

歴史的慣性

現在使用しているオペレーティングシステムは、歴史に深く根ざしています。 Windowsは80年代の初めから中頃に戻り、Unixは70年代の初めから中頃に戻ります。オペレーティングシステムには古くて機能しているコードがたくさんあり、通常は古くて機能しているコードを書き直したくありません。

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

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

移植性

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

個人の好み

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

これらを総合すると、オペレーティングシステムが元々Cのようなもので書かれていた理由と、非常に重要なチャンクが(今日でも)そのままである理由が明確になります。

15
Maximus Minimus

オペレーティングシステムでCが優勢になる主な理由は歴史にあります。Windowsやすべての形式のUnix(BSD、Solaris、HP-UX、MacOS Xなど)のような現在の主流のオペレーティングシステムは、Linuxのようなクローンに戻ります。 OOおよびその他の「高レベル」構成が主流になる前の長い間.

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

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

広く普及しているオペレーティングシステムの場合、Cを使用しない注目すべき例は、MacOS Xより前の古典的なMacOSでもあります。これは、大部分が Pascalの方言 で記述されており、何らかの形式のオブジェクト指向を許可していました。

13
johannes

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

第二に、特定のメモリ位置に変数を割り当てることができるようにオペレーティングシステムを作成する場合、それは非常に有用であり、はるかに読みやすくなります。これはCでは簡単で、Cプログラマは誰でもその方法を知っています。それが高水準言語でさえ可能であるならば、それはその方法を知っているのがグルのみであるほどまれです。

つまり、受け入れる必要があるすべての制限と変更を考慮すると、CとC++はずっと簡単に見え始めます。

12
Karl Bielefeldt

まず、ブートストラップでは、アセンブリまたは同等のもので少なくとも一部を記述する必要があります。

第二に、そこにがありましたOSは疑いもなくHLLで書かれています- LISP Machine 。 (商業的に失敗したという事実は、他のハードウェアがより速く安価になり、その勝利 Worse is Better がその哲学や設計の欠陥よりも関係している)と関係がありました。

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

第4に、現時点では新しいOSはほとんど必要ありません。ほぼすべてのハードウェアで動作するかなりの数のLinuxおよびbsdフレーバーがすでにあり、まったく新しいOSをゼロから作成するのは非常にコストがかかります。

6
sds

私が以前書いたものをよりよくフェーズするために。

バロウズ5xxx-6xxxマシンにはアセンブリ言語がありませんでした。利用可能な最低の言語はALGOLの拡張でした。 ALGOLはハードウェアで実装されました。 OSとすべての言語はALGOLで記述されています。それは当時のすべての競合他社のマシンよりも優れていました。また、必要なコードが大幅に減少したため、保守がはるかに容易になりました。 ALGOLなどの再帰的言語をサポートするスタックハードウェアがありました。

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

4
donleslie

あなたが言及する高水準言語のほとんどは、オペレーティングシステムにうまく適合しない機能を持っています:自動メモリ管理。リアルタイムシステムを作成するときは、ガベージコレクターに頼ることはできません。ソフト(オペレーティングシステムと同じです)または最悪のハードです。タネンバウム[i]を引用するには:

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

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

[i]:最新のオペレーティングシステムの第3版、73ページ

3
sakisk

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

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

この点で、CおよびC++は純粋なアセンブリとほぼ同じくらい用途が広いです。 10の異なるメモリ割り当てシナリオをカバーする10の異なるメモリマネージャーが必要であると判断した場合、それらをすべてCおよびC++で実装し、必要に応じてロードおよびアンロードできます。必要がない場合は、標準のCランタイムライブラリやスタートアップコードにリンクする必要はありません。

2

本当の答えはMoneyです。高水準言語のOSの利点を十分に認識していないため、リソースを使って1つを構築し、それを主流にプッシュすることが正当化されます。たとえば、サポートする必要のあるハードウェアの各部分に対して新しいドライバーを構築する。

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

0
Peter