- ベストアンサー
標準関数の中身について
最近C言語を学びはじめた初心者です。 標準関数にprintfやsinなどいろいろありますがこれらの中身はどうなっているのですか? 例えばprintfを作った人はif文やfor文など関数でないものを駆使して作っていったということなんですか?しかしif文やfor文だけではディスプレイに表示させたり ということはできないですよね? 単なる数値計算というだけならfor文とかを使ってできそうですが、ディスプレイに表示させたりファイルに書き込んだり、とかいう作業はコンピューター内部でどのようにして実行されているのでしょうか?またそういう関数を自分で作るにはどういう知識が必要なんでしょうか? ちょっと馬鹿っぽい質問かもしれませんがよろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
標準関数自体は、よく使われるであろう機能や、使いやすくした機能を提供するものです。 例えば、sin関数を必要になるたびに作ってたら大変でしょう。また、画面表示をputcで 全部やるのはもっと大変ですよね。 次にディスプレイなどのデバイス操作に関して説明します。まず、OSがあるからパソコンを 利用することができることはわかると思います。このことから推測できるように、デバイス 操作というものは、すべてOSのお仕事なわけです。なので、デバイス操作は、すべてOSお願 いしているわけです。 わかりやすいように例を挙げます。まず、putchar('a')を実行するとします。 これも標準関数の一つです。putcharは、呼び出されると、OSに対して「'a'という文字を 一文字、標準出力に表示して下さい」とお願いします。printf関数にしても同じで、内部で いろんな処理をしたあと、OSにこの文字を表示してくださいとお願いするわけです。 概ねこんな感じでデバイス操作は行なわれます。 で、このデバイス操作、すなわちOSにお願いするということがifやforでは記述できない ものなわけです。この「OSにお願いする」には、「システムコール」というものを用います。 システムコールは、プログラマにとって関数のようにして使うことができます。例えば、 putcharを実行すると、最終的にはwriteシステムコールが呼び出されます。OSは システムコールによって呼び出されると、引数に従って処理を行なって元のプログラムに制御 が戻るわけです。 じゃあなぜOSを経由しないとデバイス操作ができないの?という疑問が残ります。昔の MS-DOSなんかだと、自分で直接制御できたわけですから。これは「保護」というのが一番の 理由です。MS-DOSのようにプロセスが1つしか実行できないOSなら気をつけてプログラムを 書けばいいだけですが、いろいろなプロセスが実行できる今のOSではいろいろな問題が出てき ます。ですから、OSがすべて代行することでうまくいくというわけですね。 と、かなり長くなってしまいましたが、これでいかがでしょう。
その他の回答 (4)
具体的な実装は処理系(←要はコンピュータの種類ですね。DOS/V,Macなどのハードの違い、OSの違いなど)によって異なってきますが、大まかな概念は次のような物です。 下層から順番に書くと、 1. 特定のメモリ上のデータを表示するハードウェアがある。 2. 一番低位のBIOSというC又はアセンブラでかかれたプログラムがそのハードを制御していて、表示用のFunction Call(要するに関数)をもっています。 具体的な仕事はICなどのポートを叩いたりします。 3.OSはBIOSに文字表示などを指示するための低位の関数を持っています。 4.Cのライブラリ関数の低位関数があり、これらの関数ではOSの低位関数を呼び出すようになっています。 5.printfなどは更にCの低位のライブラリ関数を組み合わせてつくられています。 自分で作る場合は、最低OSの関数に関する知識があれば書けるでしょう。 組み込み機器用のコンピュータのプログラムなどでは、極端な場合では自分で直接ハードを制御する関数群を書いて、ライブラリを作る場合もあります。
お礼
詳しいお答えありがとうございます。 なんとなくわかりました。 やはりハードとOSレベルの知識がいりそうですね。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
標準関数のソースを見たいということであれば、VC++ならインストールオプションでインストールすることが出来ます。 これをインストールすると、標準関数の中もデバッグできるようになります。 ソースの内容なんですが、あくまでもVC++が実装している内容であって、他のコンパイラが同じ作りになっているとは限らないところに注意をして下さい。 確かに他の方々がいっているように、処理系依存のところはよっぽどのことがない限り、すぐに役に立つとは思えませんが、アルゴリズムの勉強にはなるんでは?と私は思います。
お礼
ありがとうございます。 もう少し腕を上げてから勉強することにします。
- Lara-Port
- ベストアンサー率36% (12/33)
細かい話をすると、プログラミング言語が生まれてきた歴史を話さなくてはいけなくなるので、それはやめます。 C言語は、もともと、UNIX-OSを簡単に開発できるようにするために作成されたもので、UNIX上のアセンブラ言語から開発されたのが始まりです。(UnixはWindowsでいえば、DOS窓のようなものです。) この時点で、文字をモニタに表示したりする関数などの初歩的なものは、用意されています。この時点のC言語を使って、もっと簡単に使える関数が作られ、ライブラリ化されていって、新しいC言語群となっていきます。これを繰り返し行われて、今のような標準関数たちになっています。そして、いろいろなOSで使用できるような形に修正されていっています。 C言語が持っている関数を一切使わずにC言語でモニタに文字表示するのはできません。また、コンピュータ内部の動きを理解するには、PCのハードウエア分野を深く理解する必要がありますし、プログラミングというソフトウエア面からも見ようとすると、アセンブラ言語の表面的な知識でなく、少々深い知識が必要になってきます。 そういうことを理解するための本が、最近は少し大きい一般書店でも多く置いてありますから、興味があれば、いかがでしょうか? Cの歴史を参考URLに入れておきます。興味があれば、見てください。 わかりにくい説明だったかな?
お礼
ありがとうございます。 プロラムの歴史ですか。前途多難ですががんばります。 URLも参考になりました。
- dtm
- ベストアンサー率37% (23/62)
No.291691(4つ前)の質問もそうですけど、厳しいかもしれませんが、初心者の気にするようなものではないと思います。少なくとも関数リファレンスを見ずにプログラムを組めるようになった後でなければ全く意味がありませんし、理解できません。 >またそういう関数を自分で作るにはどういう知識が必要なんでしょうか? OS の勉強をすることです。ライブラリ内部の実装は OS 依存部分を含みます。一応、(ANSI 部分は)OS 依存にしないためのライブラリですから。ただし、printf や scanf など大半の関数は単純な関数の組み合わせですので、printf と同じ関数を作ることは簡単に出来ます。単純な関数ほど OS に依存します。 自分で考えて、printf や scanf と同じ関数を作ってみてはどうでしょうか?
お礼
ありがとうございます。 確かに僕にはまだ早そうです。 とはいえ大体の学習の道しるべにはなりました。
お礼
詳しいお答えありがとうございます。 なんとなくわかりました。確かになんでOSなんかあるのだろうと思ったりしてましたがそういう理由だったのですね。勉強になりました。