プロが教える店舗&オフィスのセキュリティ対策術

最近、プログラミングを始めたのですが、その際に、様々なアプリケーションやOSをはどんな言語によってかかれているのかが知りたくなりました。
確かUNIXはC言語だったでしょうか?

そして、WINDOWS98、NT、2000やMacOSは何によってかかれ
ているのでしょうか?

A 回答 (4件)

こんにちは、honiyonです。


 WindowsはC++とアセンブラで書かれていると思います。 プログラマーに公開している Win32APIは C言語で使われる事を想定しているのでその可能性は高いです。
 WinNTは、「他人が読めないくらい Cとアランブラが入り混じっている」と聞いて事もあります。
 ただし、マイクロソフトは、Windowsはこんな言語で書いています」と公表しているわけではないので、あくまで推測です。

 参考になれば幸いです(..
    • good
    • 0
この回答へのお礼

こんにちは、honiyonさん。
知識がすくないワタクシですが、一番知りたいことをピンポイントで答えて
いただき参考になりました。
ありがとうございました。

お礼日時:2001/06/03 00:41

予測ですが、各CPU対応のassemblerとC/C++でしょう


少なくとも生ポインタが扱えない言語ではOSは作れません。
なぜなら、OSはアプリケーションと違いハードウェアを直接操作する必要があるわけで、その時にリソースの一部、または全部がメモリマップされたハードウェアではアクセスできないからです。
Assemblerが必要な理由は割り込み処理と呼ばれる一連の処理ルーチンを記述する場合、CPU依存の命令が必要な場合があり、C/C++ではCPU依存の命令が書けない為、実現できない可能性がある為です。

また、UNIXは「大部分を」Cで書かれていますがすべてがCで記述されているわけではありません。やはり一部はAssemblerで記述されています。昔のUNIXのソースコードが http://www.amazon.co.jp/exec/obidos/ASIN/4756118 … の lion's Commentary UNIXと言う本に完全なソースコードとして載っています。

後WindowsNTであれば開発秘話がhttp://www.amazon.co.jp/exec/obidos/ASIN/4822740 …
の 戦うプログラマー (上下巻)に載っています。開発言語まで載っているかは分からないですが・・・
    • good
    • 0
この回答へのお礼

ありがとうございます。
今、職場でつかっているOSがNTですので、是非とも開発秘話のページを
参照させていただきます!

お礼日時:2001/06/03 00:44

Windowsは、他の方がおっしゃているとおりだと思います。

(私も、推測の域を出ません)

MacOSは、現在はちょっとわかりませんが、以前はPascalでかかれていました。
WinAPIがC言語からの呼び出しを想定しているように、MacOSのAPI(昔はTool Boxと呼んでいました。)は、呼び出しの約束がPascalです。(OS XからTool Boxではなくなったので、言語が変わった可能性があります。)
    • good
    • 0
この回答へのお礼

ありがとうございます。
MacOSが以前、Pascalでかかれていたのは意外でした。
学生時代、情報処理の教養講座でPascalの説明を受けたとき、
この言語はほとんど使われていないと聞いたので。

お礼日時:2001/06/03 00:47

補足です



msystemさんが
>MacOSのAPI(昔はTool Boxと呼んでいました。)は、呼び出しの約束がPascalです。

はWindowsAPIにも当てはまります。といってもPascalで作られているわけではなく、Pascal呼び出し規約と言う点について、ですが。

x86CPUのCの処理系では、関数呼び出し時に呼び出し側がスタックに引数をつみ、関数から戻ってきたのち、つんだスタックを破棄します。
たいしてPascalでは呼び出し側がスタックに引数をつむのは同様ですが、スタックは、その関数から出る時に関数側が破棄します。

これがx86 CPUでは関数から戻る+スタック破棄が一命令で実行でき、関数から抜けた後、破棄するのに比べ、微妙に速度向上が望めます。ほんの数クロックですがAPIのように膨大な回数呼び出されるものであれば、ちりも積もればなんとやらでそれなりの高速化が期待できるでしょう。

では、なぜCがPascalと同じ呼び出し規約にしなかったか?と言うと
printf関数のような可変長引数関数ではPascal呼び出しでは実現できない為です。
関数からの戻り+スタック破棄は x86の RET命令を使っており
RET命令は RET n(nはイミディエイト値、直接書きこんである値)のため可変する個数のスタックを破棄する事は出来ません。
そのため引数をつんだ側で、スタックを破棄する必要がある為、Pascal呼び出しを利用していないのです。
    • good
    • 0
この回答へのお礼

2度のご回答、ありがとうございます。
今現在でのワタクシには専門的すぎて半分ぐらいしかわからないのですが、
言語はちがえども規約・規格というものが同じことがあるというのが分かり
とても参考になりました。

お礼日時:2001/06/03 00:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!