• ベストアンサー

プログラムは0と1でなぜ動く?改行もなし?(素人の疑問)

(1)プログラムは2進数の0と1で動いているそうなのですが、なぜパソコンは0と1が判断できるのでしょうか? (2)0と1しかないってことは、改行や空白も使えないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • jyuzou
  • ベストアンサー率41% (97/231)
回答No.6

専門ではないので、うさんくさい説明。 ●プログラムは2進数の0と1で動いているそうなのですが、なぜパソコンは0と1が判断できるのでしょうか? プログラムがコンパイルされて機械語になる。 プログラム上では改行しろとか、テキストを表示させろとか思いのまま。 そのコードがプログラミングのソフトウェアによって機械語に変換される。 機械語になったやつは直接コンピュータ上からハード的に実行できる。 例えば機械語のmovってコマンドもコンピュータ内部では010101とかの2進数で表示されてる。 これをコンピュータ内部で演算して命令を実行してる。 高級言語でプログラム →コンパイルで機械語 →機械語はコンピュータ上のどっかのメモリに010101などと羅列される →マイコンの中に機械語命令一覧が格納されているので、それと照らし合わせて、メモリに書かれた010101が何の命令なのか判断する。 →その命令にあった内容をハード的に実行し、結果を出力する(画面表示やメモリの移動等) 実際はOSが絡んでるし、もっと複雑だと思うけど、こんな感じ。 コンパイル http://e-words.jp/w/E6A99FE6A2B0E8AA9E.html 機械語 http://e-words.jp/w/E6A99FE6A2B0E8AA9E.html ●電気の高低で全部の数字を表現できても、なぜ足し算などの演算ができるのかが疑問なのです。 コンピュータ内部は2進数で考える。 たとえば 2+1=3 を2進数で書くと 10+01=11 となる。 どんなプログラミング上のどんな複雑な命令も、ハード的にはメモリの移動や演算(比較・乗算・加算など)しているだけ。 つまり、コンピュータのハード面では2進数で乗算・加算などの単純な演算を何回も(数億回も?)繰り返してるだけ。 上の例でいってる 10+01=11 は 1の位 0+1= 1 2の位 1+0=1 をしている。 ここで1の位の0+1=1の部分に着目する。 そしてこれを0+1の部分が2入力で、=1の部分を1出力と考える 0+1だとわかりづらいのでA+Bとする。 同様に=1を=Cと表現する。 つまり A+B=C となる。 ここで2入力1出力の表にしてみる。 A B | C=A+B ---+------ 0 0 | 0 0 1 | 1 1 0 | 1 1 1 | 1 これを論理演算のORという。 論理演算のORをハード的に実現するにはトランジスタやダイオードといった半導体を使う。 ここから半導体の中身の話になるけど、適当な説明でもうん百行の説明になるのでしない。 超適当な説明だと、電気はよく水の水位に例えられるから、それで説明。 2入力1出力の水路があるとする。 A--|    |----C B--| AとBの水路から水を流す(AとBは図でいう右向き一方通行で逆流はしない)。 このとき、Cの水位が一定になると警報がなる。 この警報を鳴らすという行為や一方通行を制御するのにコンピュータ上ではトランジスタっていうものを使っている。 もちろん実際のハードでは水位ではなく、電位(電圧レベル)で動いている。 ●プログラムがないのに演算ができるんですか!? ハードではプログラムの話は関係ない(いらない)。 例えば、上の例でAかBに1がきたら、Cに1を立てろっていうのはハードで事前に組むもので、(ユーザーによって)プログラムされたものではない。 上記例ではORだけだけど、実際にはこのような論理演算子が何万?と入っていて、もっと複雑な演算を実行している。 つまり、movやloadなどの機械語が実行される部分の関数を事前にハード的に作っておけば、ユーザーは入力と使う関数を選ぶだけで、あとはハード側で処理する。 結構がんばって説明したけど、たぶんこれ読んでも疑問はつきないと思う。 初歩の初歩をかじるだけでも簡単に一冊本が書ける。 疑問をそこそこのレベルで納得させるには大学で数年間勉強する必要がある。 とりあえず、お手軽にこんなの読めば? プログラムはなぜ動くのか ― 知っておきたいプログラミングの基礎知識 http://www.amazon.co.jp/exec/obidos/ASIN/4822281019/ コンピュータはなぜ動くのか~知っておきたいハードウエア&ソフトウエアの基礎知識~ http://www.amazon.co.jp/exec/obidos/ASIN/4822281655/

bavarois
質問者

お礼

回答ありがとうございます。 うっすらなるほどという感じですが、一番わかりやすい説明でした。 ありがとうございました!

その他の回答 (7)

  • Interest
  • ベストアンサー率31% (207/659)
回答No.8

ANo.4=Interestです。 ANo.6 の回答がすごくわかりやすいですね。 ANo.4 での私の回答は、話を飛ばしすぎていた感があります。 あらためて、順を追って説明します。 (1)情報の表現方法 あらゆる情報を数字で表すことができます。そして、コンピュータ内部ではこの数字を2進数で扱います。 例1: 10進数の5 = 0101 文字の場合は、ASCIIコードやJISコードなどのルールに従って文字を数字で表現します。 例2: アルファベットの A = 01000001 例3: 改行 (CR) = 00001101 例4: 空白 (SP) = 00010000 (これが、ANo.1の方が答えてくださった内容です。) (2)コンピュータのハードウェア コンピュータは主に、  CPU、主記憶装置(メモリ)、入出力装置、補助記憶装置(HDDなど) で構成されています。プログラム(命令)やデータは主記憶や補助記憶に記憶されており、CPUは読み込んだ命令に従って処理を実行します。 (CPUは電源が入ったときにどこから最初に命令を読み出すかを知っています。) 主記憶(メモリ)はトランジスタ、抵抗、コンデンサの組み合わせでできており、2進数で表された命令やデータを電圧の高/低で記憶しています。 (3)CPUの役割 CPUがやっていることは基本的に、  命令を読み込む → 演算する → 命令を実行する です。命令は主記憶(メモリ)から読み込みます。演算は、トランジスタによる論理回路で構成した演算装置(ALU http://ja.wikipedia.org/wiki/ALU)で行います。 論理回路(の加算器の例)については、ANo.6 の方の説明にあるとおりです。 命令の実行結果ですが、 a) 主記憶からデータ(命令)を読み込む b) 主記憶にデータを書き込む c) 入力装置(正確には入力ポート)から電圧の高/低を読み込む d) 出力装置(正確には出力ポート)に電圧の高/低を書き込む のいずれかです。入出力装置に対する読み書きも、主記憶に対する読み書き同様、0と1の組み合わせで行います。(ICの黒い箱から生えている沢山の足の電圧が高くなったり低くなったりすることを想像してください。) > プログラムがないのに演算ができるんですか!?  すでに述べましたが、CPUは電源が入ったら最初に実行すべき命令がどこに入っているかを知っています。パソコンの場合はBIOSなどが絡んで複雑ですので、比較的単純なマイコンで説明しますと、CPUは電源が入ると最初にメモリの一番最初に入っている命令を読みに行きます。(このアドレスをリセットベクターといいます。)ここには本当に実行すべき命令(プログラム)がメモリのどこから始まっているかを書いておきます。そうすることで、CPUに電源が入ったらどの命令を最初に実行するかを指定することができます。 ということで、CPUはメモリに記憶されたプログラム(命令)に従って動作しています。

参考URL:
http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF
bavarois
質問者

お礼

回答ありがとうございます。 う~ん、やっぱりむずかしいです。

  • hawkwind
  • ベストアンサー率34% (160/469)
回答No.7

>電気の高低で全部の数字を表現できても 一応、そこは理解できましたか。 そこの感覚がつかめれば、後の理解は割合と早いです。 ただ、まだ開眼していないというか、 自分で電気回路をつくってしまった方が納得できると思います。 例えば豆電球を用意して、豆電球のオン・オフと+、-の組み合わせで、 答えとなる豆電球が正しく点灯するにはどうするかです。 それが把握できたら、豆電球の数を増やして(桁数を上げる) 2進数2桁の場合はどうかと考えます。 ハード的に電気の動きが理解できれば、いやでも分かるでしょう。

bavarois
質問者

お礼

回答ありがとうございます。 豆電球はもうちょっと勉強してから取り組んでみたいです。 ありがとうございました!

  • hawkwind
  • ベストアンサー率34% (160/469)
回答No.5

これは・・・! 私が中学1年のときに陥ったのと同じ疑問です。 懐かしいので思わず答えます。 0と1が電圧の高低で区別しているのは、他の方の指摘通りです。 それにトランジスタが絡んでいることも、その通りです。 0と1しかありませんが、 桁をつけることで全部の数字を表現できます(ここが重要) 10進数だって0~9の9個しかありませんが、 10の位や100の位を利用して、どんな大きな数字もできるでしょ パソコンで動いているものは、全部数値で置き換えられます。 mp3の音楽だって、DVDの動画だって、全部0と1から表現されます。 ここの部分をクリアすると、 次はアナログとデジタルで、アナログって何だ??と悩むことになっています。

bavarois
質問者

お礼

回答ありがとうございます。 電気の高低で全部の数字を表現できても、なぜ足し算などの演算ができるのかが疑問なのです。 m(_ _)m

  • Interest
  • ベストアンサー率31% (207/659)
回答No.4

コンピュータがどうやって動いているか考えて見ましょう。 コンピュータを形成する最も基本的な素子は、トランジスタです。 ごく簡単に言うと、トランジスタはスイッチの役割を果たします。このトランジスタを用いると論理回路を作ることができ、論理回路を用いて2進数の演算を行ったり、情報を記憶したりできます。(実際の回路はトランジスタだけでなく、抵抗やコンデンサも含まれています。) デジタルな電子回路でできているコンピュータはこの論理回路で動いており、論理(真=1、偽=0)を電圧レベルで判断しています。 プログラムなどの情報や命令はメモリの中に0(低い電圧)と1(高い電圧)の組み合わせで記憶されており、CPUはこの0と1の組み合わせを読み込んで、命令に従った演算を行ってます。これが(1)の答えです。(CPUは電圧レベルで0と1を判断しているわけです) (2)の答えですが、コンピュータ内部では文字を0と1の組み合わせで作った文字コードで扱っているため、改行も空白も0と1の組み合わせで表現されています。

bavarois
質問者

お礼

回答ありがとうございます。 う~ん、難しくなってきました。 「トランジスタを用いた論理回路で2進数の演算を行ったりできます。(実際の回路はトランジスタだけでなく、抵抗やコンデンサも含まれています。)」 ↑この中に答えが入っているような気がしますが・・・。 簡単にまとめると、「トランジスタを用いた論理回路に電気を流し、01010101・・・1010110・・・(on/off)を繰り返すと足し算や引き算などの演算ができる」ということですか??? その時、プログラムは??? まさか!プログラムがないのに演算ができるんですか!?

noname#14768
noname#14768
回答No.3

実際に0と1ではなく、電極のON/OFFで判断してます。 それを分かりやすいように0と1で表してます。 (2)が、どういうことからでた疑問かわかりませんが、 例えば、「あ」という文字も0と1で表現できます。 難しい話は省きますが、0と1の組み合わせのパターンで文字を表現してます。 なので、改行も空白もそのパターンの一部として存在するので使えるということになります。

bavarois
質問者

お礼

回答ありがとうございます。 電極のON/OFFでなぜ動くのでしょうか・・・。

  • 2531kbps
  • ベストアンサー率13% (183/1333)
回答No.2

マシン語の解説を見ればわかります。 http://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%B7%E3%83%B3%E8%AA%9E この解説は体系的にまとまっているので、 私が説明するよりも数段分かりやすいです。

bavarois
質問者

お礼

回答ありがとうございます。 参考URLでもわかりませんでした。m(_ _)m

回答No.1

 0と1と言っても、ホントに0と1だけではなくて、 何桁かまとめて使っています。  たとえば、文字コードは8桁か16桁の0か1なんです。 改行であれば、8桁の  00001010(行を変える)  00001101(行頭に戻す) この2つです。 空白は、00010000です。 全角文字を表すときは、さらに16桁を組み合わせて判別 していますよ。

bavarois
質問者

お礼

回答ありがとうございます。 (2)の答えがわかりました。 新たに、00001010で行を変えることができるのか、00001101で行頭に戻ることができるのかという疑問が・・・。

関連するQ&A

専門家に質問してみよう