アプリ版:「スタンプのみでお礼する」機能のリリースについて

プログラムはどうやって動いているのかを構造的に教えて下さい。
「プログラムは、メモリーにロードされ、CPUによって解釈・実行されます」とありますが
コンピュータの内部ではプログラムの正体はどんな物で
メモリとCPUはどんな構造をしていて
どうやってメモリに読み込んで、CPUはどうやってプログラムを解釈、実行しているのかを構造的に教えて下さい。

A 回答 (8件)

>コンピュータの内部ではプログラムの正体はどんな物で



CPUは膨大な数のスイッチと足し算引き算をする回路と、いろいろな制御情報を記録しておくレジスターなどで構成されています。プログラムの正体はメモリに書き込まれた機械語命令の羅列です。1。0のビットで表現されています。CPUはその機械語命令を読み取って、一つずつ順に実行します。スイッチをオンオフしたり、レジスターの中の情報で命令を発したり、レジスターに書き込まれた数字の四則演算などをします。そうやってプログラムを実行します。(これ以上簡単な説明を思いつかない)

>メモリとCPUはどんな構造をしていて

メモリは半導体集積回路で作られています。分かりやすく言えば、半導体で作られた莫大な数のオンオフのスイッチです。すべてのデーター(プログラムも)ば2進法の0,1の羅列で、オフが0で、オンが1です。
CPUも基本的には同じで、半導体集積回路です。オンオフのスイッチを論理的につないだ論理回路の構造になっています。世界最大のメーカーはインテルです。

>どうやってメモリに読み込んで、

CPUにローダーと言う機能があって、外部から(例えばディスク)読み取ったデーターをメモリに書き込みます。

>CPUはどうやってプログラムを解釈、実行しているのか

メモリの中の機械語命令(1.0の羅列)をCPUのレジスターに順に読み込んで、CPUが一つずつ順番に実行します。命令の実行は必ず機械語命令が書かれた順に一度にひとずつです。これは現在のコンピューターの最大の特徴です。同時に二つの命令を実行することはありません。現在のインテルのCPUなどは複数のCPUを組み合わせたもので(4コアとか)そう言う場合は、別々のCPUが同時に複数のプログラムを動かしますが、一つのCPUが動かす機械語命令は必ず一度に一つ限りです。
    • good
    • 0

まともに書くといくらでも書けるのでまあ適当に。



まずCPUの構造から。
その前提としてANDとかNOTといった論理ゲートがあって、それは今ならトランジスタの一種で作られているとかありますが、この辺省略します。

論理ゲートを組み合わせると論理回路が作れます。

論理回路には2種類あって、1つ目が組み合わせ回路。
これは入力のみに依存して出力が変わる回路。入力が変化するとすぐに出力が変化します。
例えば全加算器という回路は、2つの入力(8ビットなら計16本の線に掛かった電圧)に応じて、常にその和の値が出力されます。

2つ目が順序回路。
これは内部状態を持っていて、入力が同じでも出力が同じとは限りません。
例えばD-フリップフロップという回路は、入力の一方(クロック)が0から1に変化したときにもう一方(D)の値を出力し、変化が無いときはD入力に関わらず出力を保持します。

CPUにはクロックというものがあるのはご存知かと思いますが、これがCPUの中のD-フリップフロップ(など)に入力されているわけです。

CPUの中心部、ALU(Arithmetic and Logic Unito)と呼ばれる部分は、加算器や乗算器などがあり、またそのうちのどの回路に入力を渡すかを切り替えるマルチプレクサという回路もあります。これらがクロックに同期して動くので、演算回路やマルチプレクサへの入力が適切に与えられると、計算結果がクロックごとに出力の方に出てきます。

次に入出力。メモリからALU、ALUからメモリに情報が移動します。

メモリは、最近のはキャッシュが階層になっていたり、そもそもまじめに話すとメモリとレジスタの概念からになりかねないのでまあその辺は省略しまして、キャッシュもレジスタも全部メモリと考えます。
メモリの構造はSRAMとDRAM、あとROMとか広義にはハードディスクやSSDなどあって面倒なので、1つだけ説明しますとSRAMはD-フリップフロップです。
入力を与えておいてクロックを入れないと出力が保持されるので、これがすなわちメモリです。

メモリからの出力をALUに入れると計算結果が出てくるので、それをまたメモリに書き込んだりするのがCPUの動作です。このへんの制御もそれ用の回路があって動いていますが省略します。

さてここで質問文の中の
> プログラムは、メモリーにロードされ
この部分ですが、HDDという一種のメモリからメインメモリやキャッシュメモリという別のメモリに移動しているだけなので、本質ではありません。上で省略したところです。

あとはプログラムの解釈あたりですが、本質はメモリからの出力をALUに入れてその出力をメモリに書き込むだけです。
もう少し詳しく書くと
・次にメモリのどの位置を読むかがプログラムカウンタという特別なメモリに書いてあります。
・プログラムカウンタからの出力に応じて、メモリに信号が入力され、指定された位置のメモリの内容(※)が出力されます。
・その内容に応じてALUで行う演算が変わります。
・ALUからの出力をメモリのどこに書き込むかも上の※に書いてあります。

で、上の「※」が、「機械語」と呼ばれる命令で、この命令がいくつも集まったものが「プログラムの正体」です。
機械語の1つの命令の内容は、例えば一番上のビットが1なら加算器が動いて0なら乗算器が動くとか、2番目のビットで結果の書き出し先を選ぶとか、そのような指示や、ALUに渡す値が書かれていたりします。
    • good
    • 1

No.6回答者です。


説明不足と間違いがあったようです。

今から25年前組み込み用4bitマイコンのパターン設計をやったのは本当です。大手電機メーカーでの話です。
先の回答はハードからの視点で回答したもので、ソフト関係は別の部署がやっていたので、あまり詳しくないです。そのせいか勘違いがあったようです。お詫びします。

さて、2進数のプログラム化にした命令コードをROMからインストラクションデコーダーへ読み込ませて動作させています。

2進数化にするまでは、それに適したプログラム言語からマシン語に装置を使って変換してました。紙テープを使っていた頃の話です。今はどのようにやっているのかはやめているので、わかりません。

そのことを訂正します。
    • good
    • 0

以前マイコンの配線設計関係の仕事をしたことがあります。



CPUをどうやって動かしているのかというと、16進数のマシン語(プログラミング言語から変換された後)データをインストラクションデコーダで一致したものだけ各方面へ信号を流すようにしています。
逆に、一致していない場合は流さないようにしています。
もう1つは、CPUを動かしているクロック信号をずらして、φ1でブロック回路へ信号を入力、φ3でブロック回路から信号出力して、信号が流れるように仕組んでいます。

それでCPUが動作できるようになっています。
    • good
    • 1

&hc9



頑固親父のラーメン屋が客に帰れというのを
Z80 CPUであれば、&hc9と表現するであろう…

「それではわからない」と言われて、通訳を立てても
RETとか、JRNZとか言い出すのがCPUの常で

簡単に、人とCPUがわかりあうことはできない。


もっとも最初にCPUが行なう処理は
メモリーアドレスの0番地にあるデータを自動的に読み込むことです。

その結果として、BIOSが機能し
BIOSを介してHDDへのアクセスが行われ…

HDDからデバイスドライバーが読み込まれることで
BIOSからデバイスドライバーへと、HDDアクセスの手段が切り替わったりなんかしつつ
段階的に、より複雑なソフトを積み重ねていくようになっています。


最初に読み込まれる命令は、&hc9のような、ごくごく原始的な命令で
これを人が扱いやすくしたのが、RETやJRNZのようなニーモニックです。

アセンブラプログラミングは、ニーモニックで記述していましたが
その前の段階には、ハンドアセンブルと呼ばれる原始的な記述方法があり
そういう経験がある人は、二重数年経てなお、00c9が帰れってことくらい覚えていたりします。

&hc9は、本質的には16進表記した数字でしか無いんですけどね。

ようするに、ごくごく原始的なところから見れば
CPUは数字以外、何も扱えないわけです。


それを数字として扱う場合と、命令として扱う場合を切り替える機構や
数字を一次的に保持するレジスターと、レジスター同士やレジスターとメモリーの間で
計算を行なう命令など、そして動作を制御する命令といったものが基礎的な仕組みです。

もうC言語が、OS開発などで標準的な開発言語となって久しいので
ニーモニックとかアセンブラを使う機会は、ほとんどの人には無いでしょう。

それより下の部分を、どこまで理解する必要があるかは
場合によるでしょうが、技術書を読んで
工学系大学などで学ぶといったことでなければ
充分な情報を得ることはできないし、こういったサイトでは無理があります。


C言語などでは、ライブラリーやフレームワークといったソフトウェア群を組み合わせることで
新規に書くコードを少なく抑えることが一般化されています。
そして、関数とよばれるソフトウェア群があることによって、より省力化されています。

こういった性質を以って、C言語などは高級言語と呼ばれています。

開発言語が高度化するほど、省力化が進み、複雑な機能を簡単に利用できるようになりました。
その積み重ねで、今のコンピューターの発展があるわけです。


ライブラリーなどは、今でも速度向上のために
アセンブラーで書かれている部分もあるかもしれませんが
そこは、アセンブラーが得意な人がいてやっているわけで
誰もが、高速化のためにはアセンブラーを使えるようにならなければ…なんて時代は終わりました。

でも、最終的な実行ファイルとしては、数字だけが並び
それを読み込んだCPUが、それぞれの意味を読み解いて
それをプログラムとして実行するわけです。


パソコンがなぜ2進数なのかも、わかりにくい話かもしれませんが
これは、電圧の強弱を、二段階だけにわけて処理するためです。
これを三段階にわけるとなると、精度が非常に難しくなりますし
二段階でも、オーバークロックのようなことをやると、信頼性(安定性)が落ちます。

二進数を扱う仕組みだからこそ、CPUの中には
ビット演算と呼ばれるような仕組みも用意されていて
たとえば、ビットを右にシフトすると、数字が2倍になったりします。

初期のCPUでは、&b00000001 x 2を処理するよりも
ビットシフトで&b00000010にするほうが速いので
ソフトウェアの高速化のために、ビットシフトを使ったりもしました。
(2進数はずらすと二倍か半分になるという性質は知らない人も多いかもしれませんね)

今は、CPUにはSIMDやSSE3のような機構が追加されていて
CPUの命令自体も、非常に多様化していますが
そういったものは、CPUの基本的な機構に
特殊な処理のための、専用の回路を設けることによって実現されています。

そのため、CPUの回路規模は拡大し続けていて
それをプロセスルール(配線の大きさ)が小さくなることによって
より小さく高密度になり、それによって高速化や省電力化も進んでいます。
    • good
    • 0

プログラムは、CPUが解読出来る機会命令(機械語)になっており、データと同じ様に、メモリに格納されています。



モリは、0,1を記憶するビット列の集合体で、一般的には機械語は特定のビット数(8ビット、16ビット、32…など)で一つの命令を表しています。

CPUはリセット後(電源投入後)、特定のメモリのアドレスから命令を読み出し、デコーダと呼ばれる解析機で命令の内容を解析し、演算や判定や制御などの実行を行い、演算結果を出力したり判定により次の処理を決めたり、入出力信号をON/OFFしたりします。
一つの命令が終わると次の命令をメモリから呼び出します。

ここで書けるのはこの位でしょうか。

大昔にこの辺りの本(下記)で勉強したのですが今は絶版の様ですね。基礎的なことであれば、内容的には今でも通用すると思いますし、計算機の歴史なども分かり易く書いているので、こんな様な本を読んでみることをお勧めします。
http://www.amazon.co.jp/%E5%B2%A9%E6%B3%A2%E8%AC …
    • good
    • 0

プログラムソース(c言語など)


⇒コンパイラがマシン語に変換
⇒マシン語(x86など)をメモリに一時保管
⇒保管された命令をCPUが読み込む
というだいたいの流れです。
なおでx86は32bitのマシン語で32bitCPUが対応するという形ですね。
    • good
    • 0

>プログラムの正体はどんな物


命令文のかたまり
>メモリとCPUはどんな構造
メモリには番地がCPUにはレジスタがあってそこにデータを格納する
    • good
    • 0

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