[質問]
電気信号は「0」「1」の2つしか認識できないのに、どうしてCPUの命令セットや機械語、アセンブラ、C言語、HTMLなどの文字を認識させることができてのですか?どうしたらそんなことができるようになるのですか?
[私のベストアンサー]
CPUは「認識」なんかしていませんよ。
より原始的な自動機械であるオルゴール、あれは、音楽を認識しているわけでもなく、さらには「音」を認識しているわけでもなく、単に特定の位置に突起のある原盤(っていうのかな?)に板が引っかかって弾かれて音が出る、それだけの機械です。結果として音楽を奏でているわけですが、しかしそれは「演奏」とは言い難いのでは。
CPUも一緒。ある電気的なレベルの組み合わせが与えられたら決まった動作をすることになっている機械でしかないのです。決まった入力を与えると決まった結果が得られるとしても、機械は認識も理解もしていません。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/27 10:53
2020/05/27 13:07
2020/05/27 13:11
2020/05/31 13:29
退会済みユーザー
2020/06/02 09:11
2020/06/04 13:21
回答15件
0
ベストアンサー
CPUは「認識」なんかしていませんよ。
より原始的な自動機械であるオルゴール、あれは、音楽を認識しているわけでもなく、さらには「音」を認識しているわけでもなく、単に特定の位置に突起のある原盤(っていうのかな?)に板が引っかかって弾かれて音が出る、それだけの機械です。結果として音楽を奏でているわけですが、しかしそれは「演奏」とは言い難いのでは。
CPUも一緒。ある電気的なレベルの組み合わせが与えられたら決まった動作をすることになっている機械でしかないのです。決まった入力を与えると決まった結果が得られるとしても、機械は認識も理解もしていません。
投稿2020/05/30 23:47
総合スコア7703
0
中国語の部屋というたとえ話がわかりやすいかと思います。
ごく大雑把に言えば、「このビット列」が来たら「こういうことを行う」というのがひたすら並んでいます。CPUを外から見ている人間は、それを「命令」とよぶ、というだけの話です。
投稿2020/05/27 12:31
総合スコア146018
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/27 12:43
2020/05/27 12:49
2020/05/27 12:55
2020/05/30 12:43
2020/05/30 13:42
2020/05/30 13:49
2020/05/30 13:51
2020/05/30 13:57
2020/05/30 14:26 編集
2020/05/30 14:25
2020/05/30 14:31 編集
2020/05/30 14:32
2020/05/30 14:38
2020/05/30 14:41
2020/05/30 15:55 編集
2020/05/31 13:30
0
CPUの仕組みをちゃんと理解しようとすると、アナログ回路の知識から必要です。論理ゲートでは抽象度が高すぎます。大学のコンピュータ・サイエンス系の学部だと実際にそこからやらされます。IntelとかでCPUの設計している人たちも基本的にそこから把握しています(もちろん役割分担はあるので、ロジックレイヤでやってる人たちは物理層の人たちと比べれば「詳しくない」みたいなのはあり得ますが)。
ということで、バイポーラトランジスタでAND, OR, NOTを書くとどんな感じなのかを置いておきます。トランジスタ選んで定数決めないと実際には動かないし、そもそも実用的ではない(使えなくはないが、今どきのCPUではまず使われないという回路)ものなので、あくまでも抽象的な一例として捉えてください。
それぞれの回路の一番上に電源が繋がっています。普通は5Vとか供給します。で、下に置いてあるのはトランジスタと抵抗の記号です。トランジスタのベースに繋がっている抵抗はベース電流の大きさを決めるためのもの、ANDとORではエミッタ、NOTではコレクタに繋がっている抵抗はこれとコレクタ-エミッタ間の抵抗(というと語弊があるが、要するに導通の度合い)とで分圧回路を構成するためのものです。とりあえず、トランジスタは導通したときは分圧抵抗よりはるかに低い抵抗値になり、導通していないときははるかに高い抵抗値になると捉えておけば今はオッケーです。
A, Bが入力になり、ここに電圧をかけてやります。そうするとベースに電流が流れて、トランジスタが導通しそうになります。しそうになる、というのは、そもそもベース電流すら流れてくれない場合もあるからです。ANDの場合は、二つのトランジスタが導通したときにYが引っ張られて上に上がります(VBEがあるので電源電圧よりは低い電圧になりますが)。ORはどちらかのトランジスタが導通すればいけます。NOTはむしろエミッタ接地回路と捉えた方が解説を見つけやすいと思います。
ロジック回路では入力電圧はハイとローだけ考えます。ハイは電源電圧、ローは0Vと普通は考えますが、実は電源電圧まで上がらなかったり0Vまで下がらなかったりすることがおうおうにしてあります。でも、スレッショルド電圧という概念を導入して、その電圧未満ならロー、以上ならハイとかみなすことにします。ANDというのはAとBにハイを入れたときだけYがハイになる回路です。ORはAかBどちらかハイになっていればYもハイになる回路です。NOTはAをハイにするとYがロー、AをローにするとYがハイという回路です。要するに、電圧がハイかローかで状態を表すということです。
とりあえずこれくらいの道具立てがあれば、NANDが作れて、ラッチ、フリップフロップとかにだっていけます(こんなの組み合わせるよりもっと効率のいい組み方は幾らでもあるのですが)。頑張ればトランジスタと受動部品を山ほど買ってきてCPUを作ることは現実に可能です、というかその世代の人は大半が鬼籍に入ってるくらいのコンピュータ黎明期の時代だと実際にそれで作っていたそうです。今でも電子工作でやる人がいますが、よほどの猛者というかただの変態です(褒め言葉)。
TTLでCPUを作る組立てキット・トランジスタでCPUを作る組立てキット・TK-80互換マイコン組立キット・Z80マイコンボード・BASIC制御マイコンボード
トランジスタでコンピュータを作るキット---CPUもメモリもトランジスタで製作
さすがにトランジスタだときつすぎるので、汎用ロジックICくらいでやるのが一般的です。この分野の日本語の名著があるので、買って読んでみるとイメージが深まるかもしれません。
投稿2020/05/30 18:13
総合スコア30935
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/01 03:56
2020/06/02 16:57
2020/06/03 15:12 編集
2020/06/02 19:24
0
なぜ、「0」「1」の2つしか認識できないCPUが、CPUの命令を認識することができるのでしょうか?
CPUの命令や扱うデータはすべて 0 と 1 で表現されているからです。
#追記
質問が変わったので、コメントはしていますが、後で見る人のために、回答にも追記しておきます。
なぜ「数字」「文字」「記号」「区切り」など電気信号以外の「情報」という形式で認識できるのか?
01の並びを、それらのものと認識しているのはCPUではなくて、プログラマーなどの人間です。
CPUは01の並びの意味に関知しません。
一部、01の並びを数値表現と見做して演算する命令や、真偽値と見做して論理演算を行う命令もありますが、とある01の並びにどの命令を使うかは人間の判断なので、人間が意味を決めていることに違いはありません。
投稿2020/05/27 11:37
編集2020/05/28 11:35総合スコア85901
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/27 11:47
2020/05/27 11:57
2020/05/27 12:21 編集
2020/05/27 12:20
2020/05/27 12:37
2020/05/27 13:07
2020/05/27 13:30
2020/05/27 13:36
2020/05/30 06:17
2020/05/30 11:00
2020/05/30 11:51
2020/05/30 11:55
2020/05/30 12:16 編集
2020/05/30 12:17
2020/05/30 12:27
2020/05/31 13:30
0
CPUに「0」「1」の組み合わせで「命令?」「値?」「役割?」を一覧表のように設定することができるのか?なぜ「数字」「文字」「記号」「区切り」など電気信号以外の「情報」という形式で認識できるのか?
最近のCPUだと複雑になってるので、内部構造が分かりにくいかもです。ちょっと不古めのCPU(Z80 etc)の解説とかが良い?
「機械語 命令セット」とか(googleお勧め)で検索するとそれっぽいのがあるでしょうか?
まず、CPUは 0/1 しか認識できないというのは違います。例外はありますが、複数の 0/1 のセット(On/Off)を同時に認識します。32bit CPUならば、32個。(何が 32bit CPUかと言う定義はちょっと置く) この場合、同時に入る 32bit(個)の On/Off の組合せが、CPUの命令となります。
CPUの動作としては、この32bitのデータを次々と読み込むことで、CPUへの命令と認識します。
では、この次々と読み込むためにはどうするか? 読み込む場所を示すためのデータを別の (例えば) 32bitの On/OffでCPUは出力します。(読み込みアドレス) 一組の32bitを読み込んだら、次の32bitを読み込みます。これを繰り返す事で、CPUは、CPUへの命令を取り込みます。
(現実のCPU(ハードウェア)では、データ入力/出力、アドレス出力が同じだったり、違ったり、または? なんて事も)
「命令?」「値?」「役割?」
これは、読み込んだ命令(上記だと 32bitのデータ何個か)を見てCPUが判断します。(→ 命令セット)
「数字」「文字」「記号」「区切り」
こちらは、CPUの判断と言うよりは、解釈する方の問題。 CPUにできるのは、ある入力(例えば、11000111)に対し、決まった規則に基づいた出力(例えば、00111000) を出力すること。これが、数字なのか、文字なのかは、(多くの)CPUでは不明です。(例えば、C言語では、文字 'A' × 10ができます) データを扱う側(プログラム言語とか)で決定します。
こんなところでしょうか。
投稿2020/05/27 12:38
総合スコア6385
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/30 06:17
2020/05/30 06:33
2020/05/30 07:25 編集
2020/05/30 07:25
2020/05/30 08:22
2020/05/31 13:30
0
ほとんど回答は出きっているように思えますが、少し付け加えたいのでひとつだけ。
どうやら、01と命令の間にあるものが何か知りたいとのことで。これにCPUの動作の点から回答したいと思います。
まず、本題から言うと、010110...のような0と1の組み合わせが命令として認識されるのは、命令デコーダが01のパターンに従って多様な制御信号を出力するからです。
以下蛇足
※これから説明することはごく単純なCPUについてであり、現代のCPUは高速化などの背景からもっと複雑です
参考: https://plaza.rakuten.co.jp/cpu4edu/4003/
参考: http://www7b.biglobe.ne.jp/~yizawa/design_cpu/index.html
CPUは、クロックが来るたびに、(基本的には)「フェッチ」、「デコード」、「実行」、「ライトバック」のどれか一つの動作をします。
※ただし、現代のコンピュータはこれらを同時に行うことができます
「フェッチ」は、メモリからCPUにある命令レジスタ(IR)へ、決まったビット数のデータを読み込みます。ビット数は32bitCPUなら32bitといった感じです。
「デコード」は、IRに格納されているデータがどんな命令を表しているか判別します。命令レジスタにあるデータを命令デコーダに通すと、そのビット列がどのような動作を表しているかに従って、制御信号が出力されます。
「実行」は、制御信号によって様々な処理を行います。例えば演算命令であるという信号が1なら演算ユニットからの計算結果を通したり、プログラムカウンタ(PC)をインクリメントしたりします。
「ライトバック」は、制御信号がレジスタへ出力することを示しているならレジスタへ書き込んだり、メモリ出力があればメモリに書き込んだりします。
CPUはこのサイクルを延々と回すことで動いています。
ちなみに、CPUは命令を読み込む時、それが実際には命令なのかデータなのかはわかりません。とりあえず命令と仮定して読み込み、そのまま実行します。なので、データを書き換える命令を使って次に実行される命令を書き換えるといったことも(基本的には)可能です。もちろん、命令と間違えてデータを実行して変な動作になる・・・とかも起こりえます。
※ただし、現代的なOS(オペレーティングシステム)では命令とデータでメモリのどの領域を使うかが分かれており、命令の領域を書き換えようとするとOSが感知して強制終了したりします。すごいですよね。
投稿2020/06/29 17:12
編集2020/06/29 17:20総合スコア212
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/01 15:55
2020/07/01 23:29
2020/07/02 00:05
2020/07/06 22:04
2020/07/06 22:04
2020/07/06 23:13
0
実に面白いオープンクエスチョンだと思います。解決済の質問に回答するのは無粋ですが、逐次マジレスさせていただきますので楽しんでいただければと思います。
CPUは、なぜ命令を認識できるのか?
タイトルからして興味深いです。CPUは命令を認識します。なぜかというとCPUの設計者がそういう機械を作ったからです。認識するとはどういうことでしょうか。認識するというのは「分かる」ということではないでしょうか。もう少し具体的に言うと「噛み砕いて理解する」ということなのですが、「理解する」ということより「噛み砕いて」のほうが重要です。人間がある物事を理解するということは、ある物事を他の物事に分解できたということです。しかし物事を基本的なことに分解していくと、実は分かっているというよりも分かっている気になっていることのほうが多いです。
例えば、数学というのは厳密な学問ですが、基本的な数学の考え方は、少ない公理(前提)から出発して結論を導き出すということです。ここで数学の公理というものは理不尽です。それ自体は説明されないからです。それ自体は読者が納得しなければならない、納得できなければその先には進めない、というようなものです。
その視点で見ると、人文科学の分野においても「基本的」で「当たり前」なことが多く、その事自体は説明されていないことがあります。辞典などで説明を参照しようとすると循環参照におちいることが多かったりします。
電気信号は「0」「1」の2つしか認識できないのに、どうしてCPUの命令セットや機械語、アセンブラ、C言語、HTMLなどの文字を認識させることができてのですか?
他の回答者様もおっしゃっていたことですが、電気信号を1つだけでなく、まとまりで見ることで実現させています。0または1の信号のことをビット(bit)と言います。8個の信号をひとまとめにして1バイト(byte)と言います。これは1980年台あたりでは「8ビットを1バイトにする」ということは当たり前でなく、「5ビットを1バイトにする」「7ビットを1バイトにする」といったこともたびたびあったようです。現在においては1バイトは8ビットです。
「CPUの命令セットや機械語、アセンブラ、C言語、HTMLなどの文字を認識させることができるのか」ということですが、まず、CPUはそのCPU特有の命令セットしか認識しません。機械語というのは命令セットとほぼ同義です。アセンブリ言語は機械語に対応したテキスト表現です。ここで重要なのはテキスト表現というのはASCII, Shift_JIS, UTF-8などの文字コードによるデータのことです。アセンブリ言語は人間が認識するものでありCPUが認識するものではありません。アセンブリ言語で記述されたソースプログラムはアセンブラによって機械語に変換することができます。C言語のソースプログラムも同様にテキスト表現であり、コンパイラによって機械語に変換することができます。HTMLはブラウザ上で組版を行うためのマークアップ言語です。組版というのは文章を見やすくするために文字を大きくしたり左寄せ、右寄せなどをおこなったりすることです。
結論です。CPUは機械語を認識します。アセンブラ、コンパイラ、ブラウザは機械語であり、実行できるデータ、つまりソフトウェアと呼ばれています。CPUはアセンブリ言語、C言語、HTML言語を認識しません。
どうしたらそんなことができるようになるのですか?
どうしたらそのようなことができるのか。それは、システムを正しく設計することです。システムというのは仕組みのことですが、CPUやソフトウェアなどを含んだもののことを言います。具体的には「Windows PC」や「Macbook Pro」、スマートフォンなどがそれに該当します。
どうすればシステムを正しく設計することができるか。それは既存のシステムを少しずつ拡張・改変していくことです。それはさかのぼればパスカルの機械式計算機などに行き着くわけですが、まさに機械式計算機はオルゴールと同様の機構を備えているというわけです。
投稿2020/06/02 12:51
総合スコア667
0
あなたがキーボードの「A」のキーを押したとき何が起こるでしょうか。一例を示しましょう。
0. キーボードからUSBケーブルを通じて「00011100(0x1C)」(*1)というデータが送られます。
0. CPUはこれをWindowsなどのOSに教えます。OSはこれを「01000001(0x41)」(ASCIIコード)に変換します。(Shiftキーが押されていたか、caps lockされていたとしましょう)
0. OSはさらに現在アクティブなアプリケーション(例えばエディタ)に「01000001(0x41)」を伝えます。
0. エディタは「01000001(0x41)」に対応したフォントの画像を表示するように、OSに依頼します。
0. OSはフォントデータから「01000001(0x41)」に対応した画像のビット列を読み出して、ビデオメモリに書き込みます。
0. ビデオメモリに書き込まれたビット列は、ビデオカードからHDMIケーブルを通じてディスプレイに送られ、そこでピクセルごとにそれぞれ光ります。
このプロセスを通じて一切「A」が出てこないことに注意してください。キーボードもCPUもOSもディスプレイも、扱うデータを「A」だとは思っていません。何らかのビット列を命令通り処理しているだけです。
キーボードの「A」という刻印のキーを押したあなたが「『A』を入力した」と思い、ディスプレイの光の形を見てあなたが「この形はアルファベットの『A』だ」と認識しているのです。
このような人と機械の協調がうまく働くように、先人たちによってコード体系やハードウェアとOSの連携が設計されているのですね。
*1)スキャンコード。キーボードのキー位置に番号を振ったもの。
投稿2020/06/02 09:48
総合スコア10
0
あなたの疑問に完璧に答えてくれる書籍がありますので紹介させてください
「コンピュータシステムの理論と実装 モダンなコンピュータの作り方」オライリージャパン
半導体素子のレベルから始めて最終的にプログラミング言語を解して動作するアプリケーションを作るところまでを解説してくれる良書です
投稿2020/06/02 08:40
総合スコア30
0
考え方が逆です。
命令をCPUに埋め込んだ結果、命令コードが決まり、それを人間がわかりやすいように一覧表を作っているだけです。
例えば、電球とスイッチが3組あったとして、3本の線各々に電気を通すとスイッチが繋がり電球が光り、電気を止めるとスイッチが外れ電球が消えるとします。
この場合、全点灯が111、全消灯が000になり、これ以外の数字の命令も決まります。
ただ、この場合でも、CPUは命令を解釈して実行している訳ではなく、コードのままに信号のOn/Offを決めているだけです。
また、CPUは、「数字」「文字」「記号」「区切り」を区別しません。
電気信号の組(2進数のデータ)を指定箇所とやり取りするだけです。
出力装置やプログラム内のルールで、その意味が変わりますが、CPUはその差を認識しません。
文字コードというの聞いたことがあるかと思いますが、人間が文字だと思っているデータも、内部的には文字コードという数字でしかなく、CPUにとっては、電気信号の組です。
投稿2020/05/28 11:21
編集2020/05/29 16:03総合スコア1750
0
CPUとして、論理回路による演算装置を考えた場合
「CPUなどの機械は「0」「1」の2つしか認識できません」
この表現は、とある省略があります。
正確には、「「0」「1」のデータが どこから、あるいは何番目に入力されたかを認識する事ができます。」
前者の「どこから」については自明かと思いますので割愛します。
「何番目」については、カウンタ回路とクロック回路での同期を行うことで可能です。
(チューリングマシン的な入出力を考える時に必要なだけで、実際には前者によって複数本の0or1を同時に入力しています。)
これにより、複数の0or1情報をまとまった値として扱っているように見せることができます。
どの階層の話なのかわかりませんが、電気信号云々から論理回路的な話をしてみましたが
もっと電気信号よりの論理ゲートの仕組み的な話でしょうか?
投稿2020/05/28 07:48
総合スコア15149
0
CPUに「0」「1」の組み合わせで「命令?」「値?」「役割?」を一覧表のように設定することができるのか?なぜ「数字」「文字」「記号」「区切り」など電気信号以外の「情報」という形式で認識できるのか?
CPUという機械が認識しているモノとプログラム(を書いた人間)が認識しているモノの区別が付いていないようです。
CPUに対しては、「命令」と「値」の区別しか意味を持ちません。(「値」の中で「アドレス」を別と見ることもできるかもしれない)
CPUの内部を簡単に説明しますと、
まず算術演算や論理演算をするユニット、Arithmetic Logic Unit(ALU)があります。ANDやOR等の論理ゲートでできています。
ALUにレジスタやメモリから線をつないで値を入れ、どの演算をするかの信号を入れると、求める結果が出るので、それをレジスタやメモリにつなぎます。
ここで、ALUにどのレジスタやメモリのアドレスからつなぐかを切り替える回路があります。これも論理ゲートでできています。
ALUの演算を切り替える信号や、ALUへの入力を切り替える信号が、「命令」(機械語)です。メモリから別の経路を通ってつながっています。
というわけで、CPUにとって値と命令は、入れる口が違うので区別されます。これをCPUが値と命令を認識していると言うこともできるでしょう。
命令を入れる口から「『値』だとあなたが思っているもの」を入れたとしてもそれは命令として解釈されます。
その他の、数と文字の違いなどはプログラムでの区別です。これを認識しているのはプログラムを書く人間です。
投稿2020/05/28 00:56
総合スコア3047
0
ざっくり言うと「そういう回路になっている」からです。
0,1のこの組み合わせが来たら足し算をする回路を動かす、あの組み合わせが来たらメモリからデータを読む回路を動かすみたいな感じです
投稿2020/05/27 12:45
総合スコア13553
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/27 12:58
2020/05/27 13:12 編集
2020/05/27 13:12
2020/05/31 13:30
0
1桁では2通りの値しかありません。ただし、複数の桁数を使えば複数の値を作り出すことができるからです。
私達も0-9の10通りのみの記号でこれ以上の数字を使っています。
投稿2020/05/27 10:54
総合スコア4830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/27 11:42
2020/05/27 12:24
2020/05/27 12:51
2020/05/27 13:28
2020/05/30 06:17
2020/05/31 13:30
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。