Serviceを読んで理解し、同意したものとみなします。スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。1,461件-12クローズされました。この質問では現在、回答を受け付けていません。スタック・オーバーフローでオントピックになるように質問を更新してください。票19「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を書ける言語」ですぐに思い浮かぶようなものはだいたいこのカテゴリでしょうね。Lispは低レベルアクセスのプリミティブを備えているので書けるでしょう。LL系の言語処理系だと必要なプリミティブを備えているものは少ないんじゃないかと思います。「この言語の処理系ならベアメタルOSが書ける|書けたぞ」というのをコメントでお寄せ頂ければ適宜まとめます。書かれた場合はOS名などもあると良いかも。汎用機のOSではPL/Iが使われていたと読んだ記憶も。個の銅バッジ流石です。OSがどこまでかを議論せずにこの話は始められません。その事は、今日勉強しました。Windowsのようなユーティリティまで含めてなのかカーネルのみを扱うのか組み込みシステムの様に考えるか多種多様でしょう。その中でも人機は重要だと感じたプログラミング言語の機能としてアドレスがあります。プログラマがアドレスを扱えない言語があるのだとしたらその言語でOSが書けるのか?ということを疑問に思いました。そんな言語があるのかも疑問に思ったところです。13:38「OSがどこまでか」によってこの質問の答えは変わりません。カーネルは作れるが、その上で動くユーティリティは作れない、といった言語は無いからです。14:001mjyさん、通常の意味でのOSを前提として、その上である種の環境を提供するプラットフォーム自体を「OS」と呼ぶこともあるので、このような説明としました。この場合、ハードウェアレイヤへのアクセスは下位OSに任せることになります。確かに、低レベルOSが書ければ同じ言語でアプリが書けないことはないので、上の層のせいで除外されることは無いですね。それは分かり辛かったと思います。書かれていたそうです。含むソフトウェアとを包括的に設計していたのですね。したがって、この質問はハードウェアをどう設計するかという問題も含むと思います。16:243LispマシンがLispの基本的な処理をハードでサポートしていたのは主に速度のためで、それらが無くてもLispでOSを書くことは可能です。ハードとOSの境界が必ずしもはっきりしたものでないという点は同意です。一般にプログラミング言語と呼ばれている物は、どのようなアルゴリズムでも表現出来るように作られており、相互に翻訳可能です。「チューリング完全」というらしいです。ある言語には出来る事が、別の言語では出来ない、という事はありません。し、得意不得意がありますから、言語によって現実的な手間で実用的なプログラムを作成出来る分野は異なります。OSに関しては得意とする言語が少ないですから「作れるが現実的でない」というのがほとんどだと思います。理由としては以下の二つが多いと思いますが、言語によって違うので、興味がある言語に絞って質問を具体的にすると、詳しい回答を得られやすいでしょう。タグが付いた他の質問を参照するか、自分で質問をする。