

OSが作れない言語はありますか  
もしあるとしたら  
どのようなことが理由としてあげられますか？


CC BY-SA 3.0
2015-10-30T11:22:50.510
18244
2018-04-09T10:07:02.100
2018-04-09T10:07:02.100
19110
10960
question
プログラミング言語 operating-system
OSが作れない言語はありますか


無いです。  
一般にプログラミング言語と呼ばれている物は、どのようなアルゴリズムでも表現出来るように作られており、相互に翻訳可能です。「チューリング完全」というらしいです。ですから、ある言語には出来る事が、別の言語では出来ない、という事はありません。

だだし、得意不得意がありますから、言語によって現実的な手間で実用的なプログラムを作成出来る分野は異なります。  
OSに関しては得意とする言語が少ないですから「作れるが現実的でない」というのがほとんどだと思います。  
理由としては以下の二つが多いと思いますが、言語によって違うので、興味がある言語に絞って質問を具体的にすると、詳しい回答を得られやすいでしょう。

  1. 既存の処理系、もしくは処理系の生成物（実行ファイル）がOSに依存している
  2. 動作速度が遅い


CC BY-SA 3.0
2015-10-30T12:07:06.167
18250
2015-10-30T12:07:06.167
3054
18244
answer


「OS」および「言語」について、それが何を指すかで答えが変わってきます。

# 「OS」の指すもの

特に前提が無ければ、まあOSXやWindows、Linuxあたりを想定してるのかなとも思いますが、用途によってはブートローダに毛の生えた程度のものやいわゆるモニタとも呼ばれるサブルーチン群だってOSの一種と言えなくはないですし、ある種の言語処理環境をポータブルに提供するシステムや巨大な分散システムの制御を担うものもあるでしょう。後者の場合、個々のマシン上で走ってるOSの上に載る形で、ハードウェアなど低レベルリソースへのアクセスをそちらに任せるという可能性もあります。

ただ、あまり話を広げすぎても仕方ないので、ここではあるハードウェア上で、他にサービスを提供するソフトウェアが走っていない状況で実行され、その上に走るアプリケーションにサービスを提供するもの、程度と考えておきましょうか。従ってハードウェアリソースへのアクセスは必要。一方華やかなGUIなどは(デバイスへの低レベルアクセスさえ提供されていれば)アプリケーションでやろうと思えばできるので対象外とします。

# 「言語」の指すもの

ここでは「プログラミング言語」という意図だと思いますが、プログラミング言語に限定しても

  * 言語仕様で定められた範囲の機能
  * 現実にあるその言語の実装が持つ機能
  * 言語仕様で可能な範囲の機能

などいくつかの範囲が考えられます。

「言語仕様で定められた範囲」、とは、言語仕様及び標準ライブラリで提供される機能だけから組み立てられる範囲ということです。言語仕様や標準ライブラリで入出力をほとんど定めていない言語があるので、そういったものではハードウェアへのアクセス自体が書けず、上で検討したOSは書けないことになります。

しかしこの定義を厳密に解釈しすぎると既存のシステム系言語でも外れてしまうものが出てくるかもしれません。(Cの言語定義を最近読んでないのでもしかすると記憶違いかもしれませんが、Cで  
特定のアドレスにマップされたI/Oにアクセスするために整数値をポインタにキャストして扱うのって、仕様上は動作を保証されていないんじゃなかったでしたっけ?)

この意味でOSが書ける言語、というのは案外少ないんじゃないかと思います。少なくともハードウェアのI/Oが仕様上明確に定義されていないと。この意味では、POKE、PEEKでマシンのメモリアドレスへの直接アクセスが定義されていたかつてのBASICなどがむしろ「OSを書ける言語」に近そうです。

次に、順序が前後しますが、「言語仕様で可能な範囲の機能」について。こちらは、言語仕様や標準ライブラリでは定められていないけれど、「処理系がそういう機能を提供することが仕様上禁じられていない」ような機能を考えたとしたら、OSを書くことが出来るか、という話になります。

例えばSchemeの言語仕様にはI/Oがほとんど無く、メモリへの直接アクセスも出来ませんし、ガベージコレクタ任せでメモリの割り当てや開放さえ明示する手段がありません。しかし、「アドレスを指定してそこに読み書きをする関数」「特定の範囲でガベージコレクタを止める関数」等を処理系が定義することは禁じられていません。処理系がそういう機能を提供しさえすれば、SchemeだけでSchemeのガベージコレクタ含むランタイムやブートローダを書くことができ、OSさえも書くことが可能です。

この意味では、ほとんど全ての汎用言語で「OSを書く」ことが可能でしょう。但し、チューリング完全であっても処理系によるライブラリ拡張の余地のない言語というのはあります
(Brainf*ckなどesoteric系言語がすぐに思い浮かびます)。原理的にはそういった言語でもサンドボックス的な環境を作ってその中でアプリケーションを走らせることは出来るはずですが、上で考えたようなOSは書けないでしょう。

最後に「現実にあるその言語の実装が持つ機能」。これはその言語の処理系として今あるものでできること、です。これは「言語仕様で定められた範囲」のスーパーセットで、「言語仕様で可能な範囲の機能」のサブセットになります。

「OSを書ける言語」ですぐに思い浮かぶようなものはだいたいこのカテゴリでしょうね。C,
C++はもちろんですが、LispやFortranといった長老も歴史の長い処理系だと可能でしょう(Fortranの処理系は良く知らないですが、例えばAllegro
Common Lispは低レベルアクセスのプリミティブを備えているので書けるでしょう。)
一方、LL系の言語処理系だと必要なプリミティブを備えているものは少ないんじゃないかと思います。

**緩募** :
「この言語の処理系ならベアメタルOSが書ける|書けたぞ」というのをコメントでお寄せ頂ければ適宜まとめます。既に書かれた場合はOS名などもあると良いかも。汎用機のOSではPL/Iが使われていたと読んだ記憶も。


CC BY-SA 3.0
2015-10-30T12:54:16.413
18251
2015-10-30T13:31:19.997
2015-10-30T13:31:19.997
5258
5258
18244
answer