• ベストアンサー

cpu 機械語

cpu 機械語 私は工学部の出身ではないのですが、CPUは機械語を理解してコンピュータを動かすと聞いています。cpuはなぜ機械語を理解できるのでしょうか? 人間の脳とはちがうものだとは思うのですが・・・?CPUは人間が作り出したものであるなら、人間が分かりやすいC言語などを直接理解できるように開発すればいいのではないでしょうか? 根本的な質問かと思います。長くなってもかまいませんのでご意見お聞かせ下さい。 お願いします。

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

  • ベストアンサー
回答No.7

> CPUは機械語を理解してコンピュータを動かすと聞いています。cpuはなぜ機械語を理解できるのでしょうか? 多分「機械語」という言葉から間違ったイメージを持たれていると思います。機械語というのは人間が便宜上そう呼んでいるだけで別に言葉ではありません。 コンピュータの世界では2進法が使われていることはご存知ですよね。0と1を使って数字を表す訳ですが、この0と1の組み合わせは数字だけでなくコンピュータに対する命令を記述するのにも使われます。この場合先の回答にあるように0をOFF、1をONと考えると単なるスイッチの集合体と見なすことが出来ます。「010101・・・」という命令なら1番目のスイッチをOFF、2番目をON、・・・と設定した組み合わせをコンピュータに入力する訳です。それが終われば次の命令、つまり別のスイッチの組み合わせを入力し、これが延々と続きます。 コンピュータはこうしたスイッチの切替えで動くように設計された機械なのです。そういう設計になっているからにはこの機械語を無くすことは出来ません。C言語などのプログラム言語は人間が理解できる言葉からこのスイッチのパターンを作り出すための工夫です。 これも先の回答にありますが、Basicなどのようにプログラム言語で入力すれば動くようにすることも可能です。が、その場合実行するプログラムとは別に機械語への翻訳ソフトも動いているので動作が遅くなります。 > 人間が分かりやすいC言語などを直接理解できるように開発すればいいのではないでしょうか? ハードウェアレベルでプログラム言語を使えるようにするのは不可能でしょう。少なくとも私にはどうすればよいのか見当が付きません。仮に巨額の開発費と長い時間を費やして開発できたとしてもC言語用に開発されたものはC言語しか理解できません。従い他のプログラム言語用の翻訳ソフト(コンパイラー)を新たに開発する必要が出てきます。つまり基本的な仕組みは今と変わりません。

gklkjoo
質問者

お礼

みなさま本当にありがとうございました。非常に興味深く読ませていただきました。

その他の回答 (8)

  • Microstar
  • ベストアンサー率21% (289/1367)
回答No.9

ある大手電機メーカーでマイクロコンピュータのパターン設計をしたことがあります。 CPUはその中にあるイントラクションデコーダーが2進数のコードを読取って、あてはまる信号を出力して、動かすようになっています。 機械語というのは、多数の2進数のコードは読みづらいので、16進数に直したものです。 C言語は人間がプログラムしやすようにした言語ですので、実際はC言語、BASICは機械語へコンパイルして、メモリに登録して動かします。 もしC言語から機械語まで細かく人間が手作業で変換するとなると大変ですので、あるプログラムを使って、コンパイルしているのです。 人間の脳が処理できる理由はわからないので、その辺は他の回答に任せます。

  • u-bot
  • ベストアンサー率58% (1736/2988)
回答No.8

まず質問内容からすると人間の脳は言語をそのまま理解していると考えているようにみえます。 私はその仮定がまずおかしいと思います。 脳は神経ネットワークで構成されています。 神経から別の神経への情報伝達はシナプスから出た化学物質を受容体で受け取ることで行われています。 シナプスの分泌度量や神経の接続構造が個人によって異なるため思考の違いに現われます。 この内容を読んで人間は言語をそのまま理解していると思いますか? 受容体の働きは単純で化学物質に反応するかしないかなので、デジタルの0と1に似ています。 実際は受容体の個数が多いためアナログ的な反応になりますけど。 つまり極論を言えば人間の脳もCPUと同じ機械語レベル程度の簡単な処理で動いているのです。 しかし人間は自分の脳の中で起きている反応をそこまで分解して認知できないので一見言葉をそのまま理解しているように思えるのです。 では何故コンピュータが人間の脳のような動作ができないのか? それにはいくつか理由があります。 ・演算処理の速度と正確さを重視している ・命令通りに動作することを重視している ・脳を似せるだけの情報ネットワークを作り上げるのが現状は困難 ・効果的な学習機能(フィードバック制御)の論理が確立していない 人間の脳の構造に似せたニューロンネットワークによる人工知能の研究が一昔前に盛んでした。 しかし学習が安定しない、つまり学習を積み重ねても精度が向上せず逆に間違いが多くなるという問題を解決できず、今はあまり話題になりません。 まあ将来に期待というところです。 シナプスの解説 http://www.brain.riken.jp/jp/aware/synapses.html

回答No.6

考え方を変えてみて下さい 人間の脳だって直接C言語を理解出来るわけじゃありません 言語を見てそれを動作に置き換えて理解しているだけです もしかしたら脳の内部では機械語みたいなものに置き換えて 動作しているかもしれませんよ コンピューターだってC言語のソースを入れると自分の動作に 変換して実行しています 人間の脳だって電気信号ですので基本は同じですよ 人間の脳だって元は何も理解していません 学習という名前の記憶をすることで言葉や動作を覚えて それを元に動いているだけですね コンピューターだって記憶している内容によって動きます コンピューターがマシン語を理解できるのは 最初からそのように回路を作っているし 内部に最初から小さなプログラムも入っています 言語なんて多種多様ありますので どれかに特化したCPUを作っても不便なだけです それよりもマシン語を理解出来るようにして 多種多様な言語はコンパイルって方式を採用する方が 汎用性がありますね

  • unipoco
  • ベストアンサー率56% (58/103)
回答No.5

CPUが理解できるのは電気信号Hi/Lowの2個です。機械語と呼ばれているものも人間が電気信号を読めないので2進数でHi/Lowを表したものや、2進数を4個セットにして16進数表記にしたものです。ってことで、CPUが機械語を理解できているわけではなく、信号のHi/Lowを読み込んでいるだけなんです。読み込んだ信号によって決められた動作をします。動作の内容は命令セットによって決められています。 もっと人間が理解しやすい言語を直接読めるようにするには如何すればいいのか…そもそも、Hi/Lowしか解らないから駄目なんだと思う。文字数の少なそうなやつ、アルファベット26文字、数字0-9まで10文字、これを理解するのには36種類の電気信号を読み取れないと駄目ですね。んー… 多分無理。

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.4

極く簡単に言うとCPUと機械語は同時に設計されます。 と言うことでCPUと機械語は分離不可能な関係です。 これがCPUを最も効率よく働かせる方法です。 実はBASICのようにインタープリターと言って 人間の書いた言語をそのままコンパイル無しに 実行する方法もあるのですが話しにならない位 遅いのです。 例えれば通訳を何人も介して会話をするようなものですね。 人間にわかりやすい言語と機械にわかりやすい言語の間に 大きな隔たりがあるので この溝を埋めるのにコンパイルと言う方式をとって 両方幸せにしているのです。 余談ですが、コンピュータの黎明期にはプログラムや データはスイッチでコンピュータに入力していました。 機械語でプログラムを組んでそれを入力すると言う 気の遠くなるような仕事でした。 当時はそれが当たり前と思って仕事してましたが。 恐らく信じてもらえないでしょうね。

  • Caryo_t
  • ベストアンサー率45% (112/246)
回答No.3

例え話となり、失礼かもしれませんが、コンピュータをオルゴール考えれば理解していただきやすいかと思います。 CPUをオルゴールの鍵盤とするなら、電気信号は、オルゴールのトゲトゲした回転体です。ただし、この回転体はとても簡単なつくりをしていて、トゲが数本しか生えていません。 そんな回転体でも、ぐるっと回せばオルゴールは鳴ります。もちろん、回転体を取り替えれば別の音が鳴ります。さらに、音を繋ぎ合わせれば曲だって奏でられます。でも、これはオルゴールが曲を「理解している」わけではありません。 さて、このオルゴールですが、曲を奏でるたびに回転体を取り替えるのは大変です。そこで、回転体を予め沢山用意しておき、これを「自動取替え装置」が入れ替えてくれるようにしたとしましょう。これで随分楽になります。 ただ、自動取替え装置に入れるための回転体は、前もって自分で並べておかなければいけません。たとえば「エリーゼのために」を奏でたければ、その音符の数だけ並べます。この作業は、まさに職人技です。だって、どの回転体が、どの音に対応しているのか理解していなければいけないからです。ともあれ、こうやって並べられた多くの回転体の集まりが、機械語です。そして、自動取替え装置がソフトウェアというわけです。 さて、こうして少しは便利になったオルゴールですが、残念ながらオルゴールごとに、それぞれオリジナルの自動取替え装置(ソフトウェア)が必要だというネックがあります。だって、大きなオルゴールと小さなオルゴールでは、鍵盤の大きさも回転体の大きさもバラバラなんですから(コンピュータで言うならば、CPUの能力が違えば、行なえる処理が違ってくるということです)。 そこで、楽譜を書いてやれば、あとはそれを元にして、オルゴール&自動取替え装置にピッタリ合った回転体を自動的にセットしてくれる「全自動楽譜解釈装置」が開発されるわけです。この装置、漢字で書くと長いので、解釈するという意味の英語を使って「インタプリタ」と呼ばれています。 こうすると、人間が解りやすく書いた楽譜を、インタプリタが回転体のセットとして組み立ててくれて、それを自動取替え装置がオルゴールの鍵盤に送るという流れが完成するわけです。 以上が、プログラムで処理を行なう(楽譜で曲を鳴らす)ということです。 楽譜をオルゴールの鍵盤に押し付けても、曲は鳴りません …などと最後に付け加えるのは蛇足というものですね。 もちろん、本物のオルゴールであれば、楽譜っぽいものが読めるものもあります。しかし、その場合には、そのオルゴール専用の楽譜が必要になります。つまり、また職人技が必要なのです。こういった悪循環を避けるために、人間は楽譜を描くことに専念し、あとはインタプリタが機械語に翻訳する仕組みを採用しているのです。 オルゴールの鍵盤は、

noname#124808
noname#124808
回答No.2

cpuはなぜ機械語を理解できるのでしょうか? >>機械語の命令を実行するように作ってあるのがCPUです。 人間の脳とはちがうものだとは思うのですが・・・? >>人間の脳のように知能は持ちません。命令を実行するだけです。 OSがコンピュータへの入出力やデータの保存やプログラムの実行を管理しています。 言語は、OS上で動作するように作られたものです。 人間が分かりやすいC言語などを直接理解できるように開発すればいいのではないでしょうか? >>C言語は、機械語を人間が理解しやすいようにするための言語のうちの一つです。 なお、プログラミング言語はたくさん有ります。 C言語で書いたソースプログラムは、一端機械語変換(コンパイル)して、 OSの機能やライブラリなどとリンクさせることにより、初めて、 一つの実行できるプログラムになります。 C言語を直接実行するようなシステムを作成しても何の意味も有りません。 時間の無駄遣いをするだけですね。

  • heyboy
  • ベストアンサー率21% (1852/8728)
回答No.1

考え方がそもそも間違っていますよ CPUはどのアドレスの数値を足したり引いたりアドレスの数値を 交換などの作業をしているに過ぎません それをOSやプログラミング言語で人間にわかりやすくしているだけです。

関連するQ&A

  • CPUによって機械語だかアセンブリ言語が違うという

    CPUによって機械語だかアセンブリ言語が違うという解説をしている記事があったんですが CPUによってというのは、 intel sandylakeとAMD ryzen 3700x と使い分けろ という意味ではなく 32bit対応CPUintel pentiumと64bit対応CPUintel sandylake とで使い分けろという意味ですか?

  • ポケコンの機械語(マシン語)

    1986年に工学社より「シャープポケットコンピューター機械語活用マニュアル」という本が出ておりますが、シャープのポケコンのどの機種の機械語について書かれているか、また内容・項目はどんな感じなのかをご存知の方はお教えください。 以上、よろしくお願いいたします。

  • コンパイルしたらマシン語になる?

    基本的な質問かもしれないのですが: ●プログラミング言語をコンパイルしたらマシン語になるのでしょうか? ●マシン語になるとしたら、なぜ、Windowsのgccでコンパイルした実行ファイルはUnix上で動かないのでしょうか? C言語などのプログラミング言語は人間が理解できる言葉で書かれていて、これをマシン(例えばIntelのCPU)が理解できる言葉に変換するのが「コンパイル」だと今まで私は理解していました。だから、IntelのCPU上でコンパイルした場合、他のCPUでは動かないのだと納得していました。 しかし、IntelのCPUが理解する言葉になるのであれば、WindowsでコンパイルしてもUnixでコンパイルしても IntelのCPUの言葉になっている点で変わりがないような気がします。しかし、Windowsでコンパイルした実行ファイルはUnixでは動かないですよね。私は根本的な勘違いをしていると思うのですが、それが何かを教えて頂けると幸いです。

  • コンピュータの発展について

    特にパソコンについて。 新しいCPUやOSが開発されるたびに思うのですが、過去のソフトウェア財産が足かせになって、斬新で高性能なCPUやその他のハードウェアの開発の進展が遅れていると思うのですが、実際はどうなのでしょうか。 私はコンピュータの技術者ではありません。 8086時代のアセンブラや、昔のC言語、8ビットのZ80の機械語しか知らない過去の人間です。今風のコンピュータ関連で理解できるのはPICマイコンくらいです。 しかし、現在のWindowsXPや、おそらくVistaの次のOSでも、昔作成したプログラムがエミュレータなしで動作すると思われます。ある意味驚きです。 このような遺産の引継ぎは新しい技術の開発にどのように影響しているのでしょうか?大変興味あります。

  • C言語をCPUに読み込ませるためには、 C言語か

    C言語をCPUに読み込ませるためには、 C言語からアセンブリ言語にコンパイルして、 アセンブリ言語からアセンブルして機械語2進数にしてCPUに読み込ませるという 2段階をしないといけないんですか? 下記の画像のように説明している動画がありました

  • CPUの構造を理解する意味は?

    CPUの構造を理解する意味は? よくプログラムの勉強をするときにCPUの内部構造である制御装置、演算装置、レジスタなどの解説があって、さらにそれらがどういう繋がりがあって、どうお互いを利用しているか、ということを説明する本に出会います。 しかし実際アセンブリ言語で開発しようという人間以外に、誰がこの知識を必要とするのか全くわかりません。 C言語以上の高級言語を使用するのであればこれらの知識は不要ですよね?? ※C言語の勉強でメモリーの構造を理解する必要があるのはわかります。

  • 機械の開発を思いついたけど今後どうしたらいいかわかりません

    機械の開発を思いついたけど今後どうしたらいいかわかりません ある簡単な機械を思いつきました。こういうモノが世の中にあったらいいなーみたいな感じのものです。それを作りたいんですが、工学部をでているわけではないので、機械の組み付けなど全くわかりません。どこかに依頼したいのですが、どうやって機械を組み付けてくれる会社を探したらいいんでしょうか?

  • 機械語に直すことについて。

    (機械語データ) (アセンブリ言語) b8 57 61 6b 61 mov $0x616b6157,%eax 53 push %ebx 50 push %eax ba 04 00 00 00 mov $0x4,%edx bb 01 00 00 00 mov $0x1,%ebx b8 04 00 00 00 mov $0x4,%eax 89 e1 mov %esp,%ecx cd 80 int $0x80 58 pop %eax 31 c0 xor %eax,%eax 5b pop %ebx c3 ret これのintと movとxor の機械語が分かりません。後、retの機械語が、farなのかnearなのかも分かりません。教えていただけないでしょうか?すみません。

  • 最初のアセンブラ

    人間がハンドアセンブル際にアセンブリ言語と機械語の対応表を見比べて翻訳する作業を、コンピュータの黎明期に機械語で最初に作られたアセンブラはどのように行っていたのかということを教えて下さい。 プログラミング言語の歴史を考えてみると、(フォン・ノイマン型)コンピュータの黎明期では全てのプログラムは最初人間が直接真空管やディップスイッチのオン/オフを切り替えることで、機械語でプログラムを入力していたと思います。その後アセンブラが開発されたことで、人間はパンチカードやカセットテープなどを通してアセンブリ言語でプログラミングを行えるようになったと聞きました。 アセンブリ言語は機械語と1対1で結びついたもので、アセンブラはアセンブリ言語を機械語に翻訳するのだと言うことは分かります。しかし、パンチカードやカセットテープで入力したアセンブリ言語も、コンピュータにとっては根本的には0/1(スイッチのオン/オフ)という点では変わりはなく、最初のアセンブラはその0/1をどのようにして正しい機械語の0/1に変換することが出来たのでしょうか? 少し質問の意味が分かりにくいかもしれませんが、例えば MOV B, A //Bレジスタの内容をAレジスタに送る といったアセンブリ言語は、機械語では 01000000 に相当するかもしれません。しかしコンピュータがパンチカードを読み込んだ時点では 01010100 といった信号として入力されるとしたら、機械語で最初にアセンブラを作成した人はどのようにしてそれを適切な機械語(ここでは01000000)に翻訳出来たのでしょうか? 想像では最初に機械語で非常に超簡単なアセンブラの原型とも言えるプログラムを作って、それを元にした簡単なアセンブリ言語(の原型)でより高度なアセンブラを作る、といったことを繰り返していまのアセンブラが開発されていったと思いますが、では最初のアセンブラの原型とはメモリ上ではどのように実現されていたのか、ということが気になったので質問させていただきました。アセンブリ言語で実際にプログラムのイメージはこんな感じでは?ということを書いて下さっても構いません。 よろしくお願い致します。

  • 半導体が機械語を出力する仕組みを教えて下さい。

    半導体の元となるシリコンやゲルマニウムが電流が流れることによって、パソコンなど人間が理解できる言語に到達するまでの過程がよくわかっておりません。 機械語→アセンブリ言語(低級言語)→プログラミング言語(高級言語) という簡単な流れは知っているのですが、機械語より前の過程がわかりません。 学生時代電波について軽く習ったときに、電波は波を流した瞬間と流していない瞬間?で0と1を区分すると聞いた覚えがあります。 半導体でも同様に電流を制御することによっても同じことをしているのでしょうか。 仮に電流の放出の状態によって0と1を区分しているとして、そこから 人間が理解できる文字、少なくとも0や1を表示するためにはメモリに0と1を覚えさせなければいけないと思うのですが、ただの物体にどうやって文字を覚え込ませるのでしょうか。 おそらく所々歯抜けのような状態で質問しているものと思いますが、初学者向けに関連書籍やWebページなどあればご教授願いたいです。