- 締切済み
プログラミングとコンピュータについて
プログラミングとコンピュータについて 大学でプログラミング(C言語)を勉強をしててふと思いました プログラミングでどうやってCPUとかメモリとか、そういったコンピュータの深い部分を操作できるのでしょうか? すみません 抽象的でどう説明したらいいかわかりません 簡単なプログラミングだったらカレンダーとか電卓とか作れますが、これらのプログラムってCPUとかメモリとかOSとかの根本的な部分があればこそ成り立つものですよね 例えばCPUの状態を表示するソフトウェアだったりレジストリを削除するツールだったり、こういうプログラムってプログラムが直接コンピュータの根本的な部分と直結してるってことですよね? つまりハードとソフトの境目がどのような構造なのかよくわからないって感じですかね ソフトを作るのはプログラミングだけどソフトとハードを繋げるのもプログラミング ゲームとかスクリーンセーバーとか電卓とかを作っても、これでどうやってwindowsやLinuxは作れたんだろう?って思ってしまいます C言語や他のプログラミング言語を学んでいけば自ずと理解できるものなんでしょうか? 無知は承知で質問します どうにも不思議で、しかし腹立たしくてむずがゆいです 誰か教えてください、お願いします
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- zwi
- ベストアンサー率56% (730/1282)
もっと素朴なマイコンとして、AVRマイコンも紹介しておきます。 連載でアセンブラにも触れられているの調度良いかも知れません。 連載記事「マイコン制御基礎以前」 http://monoist.atmarkit.co.jp/fembedded/index/miconkiso1.html 連載記事「マイコン制御基礎の基礎」 http://monoist.atmarkit.co.jp/fembedded/index/miconkiso2.html 連載記事「マイコン制御基礎の次」 http://monoist.atmarkit.co.jp/fembedded/index/miconkiso3.html
- zwi
- ベストアンサー率56% (730/1282)
もっと素朴なコンピュータであるマイコンをやってみるともう少し理解が進むかも知れません。C言語だけじゃなくアセンブラ言語も挑戦してみると良いでしょう。 H8マイコン。色んなOSが使えます。OSなしでもOKです。 http://monoist.atmarkit.co.jp/fembedded/index/h8.html http://monoist.atmarkit.co.jp/fembedded/index/cadh8road.html
- k_kota
- ベストアンサー率19% (434/2186)
プログラミング言語を勉強するのとコンピュータのハードの仕組みを勉強するのは別な話です。 情報系の大学ならやるべき内容だと思います。(パソコン教室ばっかりやってるのは大学としてはどうなのかね、と思う) そういう本やサイトはたくさんあると思いますが、知ってる範囲で説明します。 まず、コンパイルすると機械語のプログラムが出来ます。 実行時にはそれがメモリに展開されます。 メモリ上の機械語は0,1の並びです。 CPUは論理演算とか四則演算を行う所の他に、メモリ等外部機器に対して、入出力を行う所があります、あとクロックとかも受けてるはずです。 機械語の信号を受けるとメモリの情報を読み込んだりとか参照する所を変えたりとか地味な作業を繰り替えします。 例えばメモリの次のアドレスの値を1増やしたものを100番先に保存とか、実行ステップを200番先に飛ばすとか。 そんで、順次計算をしていきます。 その他ハードの制御とかもあります。 UNIXとかはC言語と深い関わりがあります。 確か、Cコンパイラを作って、それでUNIXを作るようになったとかだったと思いますので、それ以前は機械語とかアセンブラとかで作ってのでしょう。 プログラム内蔵方式とかで調べるといいですかね。
- lunarx
- ベストアンサー率39% (16/41)
まずはコンパイラがC言語からマシン語に翻訳します。(実際にはもっといろいろな事(字句解析から始まって)がされているが最終的な事として) >C言語や他のプログラミング言語を学んでいけば自ずと理解できるものなんでしょうか? 多分無理。 OS作るにはハードウェア(CPUなどの仕組み)の知識が必要になってくる。 後OSの機能についても知識が必要になる。(タスク管理やメモリ管理など) 後Windowsにおいて原則としてユーザが作成したアプリは直接ハードウェアの制御ができません。 APIを介して処理をする必要があります。 これが足枷になってWindows上のゲームがDirectX(その前にはWinGと言う物もあったが試験的要素の物だった)が出るまでMS-DOS上でのゲームが主流だった。(EAGE3Dの用に独自APIを搭載した物はあったが) MS-DOS当時はハードウェアを直接制御して描画処理を高速化することができた。
- ari-ari3
- ベストアンサー率40% (4/10)
プログラムのコードは、人が見て判断できる文字列です。 C言語ならC言語用のコンパイラが、このコードを実行可能な形式に置き換えるのですが、windows用のコンパイラであれば、windowsが実行(解釈)できる形式にコンパイルします。 windowsにとってのwindows用プログラム(ソフト)は、windowsのどの機能をどう実行するかの指示書のようなものです。 CPUやメモリなどハードウェアは実際には2進数のコードで命令され、その命令コードにあった動作をします。 その命令コードは、BIOSであったりwindowsであったり、windows を経由せずにマシン語のプログラムであったり、何かしらが直接制御します。 C言語など高等言語によるプログラミング時には、ハードウェアに直接命令を出しているのがどこなのか、どんな命令コードによって動いているのかを意識する必要がないのが高等言語の利点なのですが、その利点によって質問者さんがお悩みなのかと思います。 最近のPCの制御構造には精通していないのであまり具体的には分かりませんが、マシン語、アセンブラー言語などについてお調べになってみてはどうでしょうか。ハードウェアは具体的にどのように操作することができて、それを簡単に扱えるためにドライバソフトやOSやBIOSなどのソフトウェアがどのような役割を果たしているか、分かりやすくなるかもしれません。 下記のように1対1の関係で、仲介するのがC言語という1つのルールであれば、直接制御となり、「printf」というコードが来たら、その後に指定されたデータを表示する、という仕組みをハード側が持っている、という関係になります。 プログラマ→(C言語)→ PC 実際には下記のように途中に色々入りますので、それぞれの間にはそこで解釈可能な制御コードがやり取りされます。printfという命令コード自体をCPUは解釈できませんので、それぞれの箇所が解釈できる形式のコードに置き換えられながら最終的にハードウェアが制御され、結果を返します。 (すいません、windowsの先は適当に書いてますのでなんとなくイメージとしてでお願いします) プログラマ→(C言語)→コンパイラ→(実行形式ファイル)→windows→(API)→(マシン語)→CPU→(コード)→メモリ→ (中略) →(画面表示指示)→モニタ
- kmetu
- ベストアンサー率41% (562/1346)