最近C言語を学びはじめた初心者です。
標準関数にprintfやsinなどいろいろありますがこれらの中身はどうなっているのですか?
例えばprintfを作った人はif文やfor文など関数でないものを駆使して作っていったということなんですか?しかしif文やfor文だけではディスプレイに表示させたり
ということはできないですよね?
単なる数値計算というだけならfor文とかを使ってできそうですが、ディスプレイに表示させたりファイルに書き込んだり、とかいう作業はコンピューター内部でどのようにして実行されているのでしょうか?またそういう関数を自分で作るにはどういう知識が必要なんでしょうか?
ちょっと馬鹿っぽい質問かもしれませんがよろしくお願いします。
No.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がすべて代行することでうまくいくというわけですね。
と、かなり長くなってしまいましたが、これでいかがでしょう。
詳しいお答えありがとうございます。
なんとなくわかりました。確かになんでOSなんかあるのだろうと思ったりしてましたがそういう理由だったのですね。勉強になりました。
No.4
- 回答日時:
具体的な実装は処理系(←要はコンピュータの種類ですね。
DOS/V,Macなどのハードの違い、OSの違いなど)によって異なってきますが、大まかな概念は次のような物です。下層から順番に書くと、
1. 特定のメモリ上のデータを表示するハードウェアがある。
2. 一番低位のBIOSというC又はアセンブラでかかれたプログラムがそのハードを制御していて、表示用のFunction Call(要するに関数)をもっています。
具体的な仕事はICなどのポートを叩いたりします。
3.OSはBIOSに文字表示などを指示するための低位の関数を持っています。
4.Cのライブラリ関数の低位関数があり、これらの関数ではOSの低位関数を呼び出すようになっています。
5.printfなどは更にCの低位のライブラリ関数を組み合わせてつくられています。
自分で作る場合は、最低OSの関数に関する知識があれば書けるでしょう。
組み込み機器用のコンピュータのプログラムなどでは、極端な場合では自分で直接ハードを制御する関数群を書いて、ライブラリを作る場合もあります。
No.3
- 回答日時:
標準関数のソースを見たいということであれば、VC++ならインストールオプションでインストールすることが出来ます。
これをインストールすると、標準関数の中もデバッグできるようになります。
ソースの内容なんですが、あくまでもVC++が実装している内容であって、他のコンパイラが同じ作りになっているとは限らないところに注意をして下さい。
確かに他の方々がいっているように、処理系依存のところはよっぽどのことがない限り、すぐに役に立つとは思えませんが、アルゴリズムの勉強にはなるんでは?と私は思います。
No.2
- 回答日時:
細かい話をすると、プログラミング言語が生まれてきた歴史を話さなくてはいけなくなるので、それはやめます。
C言語は、もともと、UNIX-OSを簡単に開発できるようにするために作成されたもので、UNIX上のアセンブラ言語から開発されたのが始まりです。(UnixはWindowsでいえば、DOS窓のようなものです。)
この時点で、文字をモニタに表示したりする関数などの初歩的なものは、用意されています。この時点のC言語を使って、もっと簡単に使える関数が作られ、ライブラリ化されていって、新しいC言語群となっていきます。これを繰り返し行われて、今のような標準関数たちになっています。そして、いろいろなOSで使用できるような形に修正されていっています。
C言語が持っている関数を一切使わずにC言語でモニタに文字表示するのはできません。また、コンピュータ内部の動きを理解するには、PCのハードウエア分野を深く理解する必要がありますし、プログラミングというソフトウエア面からも見ようとすると、アセンブラ言語の表面的な知識でなく、少々深い知識が必要になってきます。
そういうことを理解するための本が、最近は少し大きい一般書店でも多く置いてありますから、興味があれば、いかがでしょうか?
Cの歴史を参考URLに入れておきます。興味があれば、見てください。
わかりにくい説明だったかな?
参考URL:http://www.bohyoh.com/CandCPP/C/history.html
No.1
- 回答日時:
No.291691(4つ前)の質問もそうですけど、厳しいかもしれませんが、初心者の気にするようなものではないと思います。
少なくとも関数リファレンスを見ずにプログラムを組めるようになった後でなければ全く意味がありませんし、理解できません。>またそういう関数を自分で作るにはどういう知識が必要なんでしょうか?
OS の勉強をすることです。ライブラリ内部の実装は OS 依存部分を含みます。一応、(ANSI 部分は)OS 依存にしないためのライブラリですから。ただし、printf や scanf など大半の関数は単純な関数の組み合わせですので、printf と同じ関数を作ることは簡単に出来ます。単純な関数ほど OS に依存します。
自分で考えて、printf や scanf と同じ関数を作ってみてはどうでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Pythonを用いたフラッシュ暗算ソフトの開発に必要なもの 2 2023/01/29 02:22
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンピュータ言語とプログラミ...
-
コンパイラーとアセンブラの違い
-
ものづくりに向いているプログ...
-
0xffffとは?
-
verilog 符号付加減算(最上位...
-
ビットシフトってどんな時使うの?
-
エクセルVBAのIf,Then 構...
-
符号無し整数xを右にnビット回転
-
ライン数とステップ数の違いは?
-
アセンブラからC言語に変換する...
-
delph5 ボタンの色を変更するに...
-
8ビットのデータの、先頭ビット...
-
アセンブラのリンカのダウンロ...
-
シーケンス制御についての質問...
-
エンディアンについて。
-
ビットの反転?
-
情報科学の飽和演算、ラップア...
-
03分22秒36のような時間の単位...
-
ビットの取り出し方法
-
ラズパイのgpuの演算部分のみを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ものづくりに向いているプログ...
-
アセンブリ言語からC言語への変...
-
電化製品って何言語?
-
昔のゲーム製作に使用する言語...
-
コンピュータ言語とプログラミ...
-
Windowsはいったい何言語で書か...
-
標準関数の中身について
-
パチンコやスロットについて
-
NS Basic/Palm の入門書ありま...
-
プログラマーの方へ質問です。
-
OSはどんなコンピューター言語...
-
フローチャートを書く書かない
-
アセンブリ言語を学ぶことは意...
-
コンパイラーとアセンブラの違い
-
アセンブリとC言語ではどっちが...
-
アセンブリ言語について。
-
おすすめのプログラミング言語...
-
CASLの問題です。
-
オープン系 Web系 ファー...
-
OSを書いている言語と、昔の言語。
おすすめ情報