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

コンパイラによって出力されるバイナリデータは違うのでしょうか?
同じCPUでVSとgccを使った際に得られる実行ファイルの中身が違う理由がわかりません。同じCPUならば出力される実行ファイル(バイナリデータ)は同じでないのですか?
コンパイラとCPUの関係がイマイチわかりません。
わかりやすく教えて頂けないでしょうか?どうかよろしくお願いします。

A 回答 (11件中1~10件)

コンパイラは、人間が分かる言葉で書かれたソースコードを機械語に変換するソフトウェアです。


同じ結果が得られるような機械語コードを作成するという意味では、コンパイラによって出来上がるバイナリコードは異なって然りと思います。

No.2の方の回答に「書き方はいくつかあるでしょ?」とご指摘があるとおり、
例えば、
 a = 0;
のようなCのコードがあり、内部的にはアキュムレータに0を代入する場合、
 mov eax,0
の他に、
 xor eax,eax
という記法もあります。

上記の例では、ほとんどのコンパイラは後者のコードを吐き出すと思いますので例としては適当ではないかもしれませんが、
同じ処理を行うにしてもコンパイラによって最適化の手法が違えば当然違う機械語コードが作成されるということです。
さらに、同じコンパイラでも、最適化オプションによって出力される機械語コードは異なります。
    • good
    • 0

> コンパイラから出力されたバイナリデータがなぜ正確に周辺機器、例えばディスプレイなどに反映するのですか?



そこら辺を理解するには、カーネル、システムコール、リングプロテクション、
デバイスドライバあたりを理解する必要があります。
質問者さんの感じでは、
その前段としてマルチタスクとコンテキストスイッチについても
理解されたほうがいいと思います。
上記はこんな場で説明できるものではないので、
まずは調べてください。
調べた上でわからないことを聞くようにしてください。

上記のあたりに関してはバイナリコードはシステムコールを発行しているだけです。
コンパイラはシステムコールを発行するように翻訳しているだけです。
    • good
    • 0
この回答へのお礼

どうもありがとうございます

お礼日時:2018/05/07 02:27

>CPU(の周りの周辺機器)の構造を考慮してコンパイラは作られたのですよね?



いいえ、周辺機器が変わる度にコンパイラも変わるなんて
恐ろしいことは今時誰も考えません。

そういうのはライブラリが請け負うのですよ。

兎に角、何処から仕入れてきたか知りませんが、
その妄想のようなトンデモ知識を投げすてて、
基本の基本から正しい知識を学びましょう。
    • good
    • 1
この回答へのお礼

そうします。
どうもありがとうございます。

お礼日時:2018/05/02 22:30

>No.7さん。


そうですね。色々遊べそうな楽しい条件ですね。
まずデータの表現形式も決まっていいないのでバイナリで表す必要もそもそもないですね。
2ビットコンピュータで10倍するだけならパック10進かアンパック10進という手も。

ここまではちょっと遊びの範疇ですが、IntelのCPUを考えても足し算の演算命令だけでもたくさんあります。

単純加算だけでも32Bit加算だけではなく64Bit加算や16bit加算や8Bit加算もあります。
そしてそれぞれに符号付、符号なしといった概念もあります。
また、SSEの様なSIMD系命令でも加算ができるものがあります。
Intel AVXにはさらに長いビット長のSIMDができる加算命令があります。
更には、内臓GPUにも複数加算できる命令があります。

また、単純な足し算だけであればこの程度で済みますが、掛け算と足し算が連続するような処理であれば、FMAの様に複合命令が用意されている物もあります。
更に更に、レジスタに格納された値をメモリを書き戻す際に破壊的に行うか、非破壊的に行うかも考慮しないといけないので、3+1を私の無い頭で考えただけでも20以上はやり方が思いつきます。

また、C言語の世界でははっきりしているデータ型もバイナリの世界ではかなりあいまいに扱われる、Int32だと明示的に指定してもスコープが関数内に限定したりすると64bitでやった方が内部的な動作が早いという理由だけで平然と64bitの命令を使ってしまうコンパイラもいますし、内部的な範囲でしか使っていないし16bitでオーバーフローする可能性が無いからメモリ節約のためと16bitの命令を使ってしまうコンパイラもいたりします。
バージョンによっても結果が変わったりしますので、「コンパイラを変えても一意なコンパイル結果を得られると保証できるプログラムなんて書けるの?」と逆に質問したい位です。
    • good
    • 0

No6さん>-度10行たらずでもよいから、マシン語でプログラム書いてみたらいかがですか?


いいですね。

たとえば「値を10倍する」方法、10進数なら1桁左シフトするだけですが
2進数なレジスタではそうはいきません。
簡単なところでは「10回加算する」
すこしアクロバチックなところでは
「3回バイナリシフトして得た8倍値と、1回バイナリシフトして得た2倍値を
加算する」とかもあります。
命令セットに乗算命令があるCPUなら、「10倍に乗算する」ことも可能です。

実現手段は複数あるんですよ。


>CPU(の周りの周辺機器)の構造を考慮してコンパイラは作られたのですよね?
だとしたらコンパイラの出力するバイナリコードは直接の関係は無いのは何故ですか?

どこが疑問だかわかりません。
繰り返し書いてるように「やり方は複数ある(唯一でない)から」。

>私みたいな人間にわかりやすく教えて頂けないでしょうか?
>どうかよろしくお願いします。

いちいち1段階ごとに理由を求めてるとこの世界は理解が進まないでしょう。
当面は「こういう性格のもの」と、ブラックボックス扱いにでもして、次段階に進むほうが
現実的です。

もっと詳しく学習が進めばおのずとわかります。
    • good
    • 0
この回答へのお礼

そうします。
どうもありがとうございました。

お礼日時:2018/05/02 19:25

う~ん-度10行たらずでもよいから、マシン語でプログラム書いてみたら


いかがですか?
そんな考え吹き飛びますよ。

自分の頭でっかちさに呆れる筈です。

1から10までの和を計算するなんていかがでしょう。
さて、ル―プカウンタはどのレジスタにしますか?

あなたの考えが正しければ選ばなくても初めから
決まっているはずです。
    • good
    • 2

> CPU(の周りの周辺機器)の構造を考慮してコンパイラは作られたのですよね?



周辺機器なんて考慮していません。CPUの構造ってのはなんでしょうか。
コアの数とかパイプラインの段数とかでしょうか。

コンパイラが考慮するのは命令セットだけです。
どこからそんなトンデモ知識を仕入れらたのでしょうか?

それから、
本などの知識にあたって、わからないことがあって
始めてここに聞くならともかく、
なんでもかんでもここに聞くのだと、
終いに誰からも相手にされなくなりますよ。
    • good
    • 4
この回答へのお礼

だったら、プログラムをコンパイルして
コンパイラから出力されたバイナリデータがなぜ正確に周辺機器、例えばディスプレイなどに反映するのですか?
コンパイラでない、何が以上の事を可能にしているのですか?
出力されるバイナリデータが正しく行き届かないと意味がないと思います。

お礼日時:2018/05/02 18:26

学校の課題とかで、一つの課題に対してそれを処理するコードを書いた場合、人それぞれの個性があってコードは同じにならないじゃないですか。

それと同じくコンパイラにも個性があって、同じコードを食わせた場合に吐き出すバイナリは異なります。

これがアセンブラだと、アセンブルコードと機械語命令は一対一に対応するから差は出ないけど、高級言語で書かれたコードをコンパイルした場合、1行のコードは数10行や数100行(あるいはそれ以上)の機械語命令になります。単純なループ一つをとっても、変数をメモリのどこに配置するのか、どのレジスタを使うのか…みたいにいろんなやり方があり得ますよね?異なるコンパイラ作者が書いたものなのに、それら一字一句が同じになるなんてことの方がおかしいですよ。
    • good
    • 0

コンパイラが出力するバイナリコードとCPUには直接の関係はありません。


コンパイラは高級言語をマシン語に翻訳するソフトウェアです。
コンパイラに内在する翻訳ルールに従って高級言語のプログラムを
x86_64命令やx86命令のバイナリコードに変換しています。
だから、x86_64 cpu上で動作するWindowsやLinux環境で、
Arm32バイナリを生成するコンパイラもあります。

コンパイラによって翻訳のルールが違うので、
バイナリコードが違う、それだけです。
    • good
    • 0
この回答へのお礼

!?
CPU(の周りの周辺機器)の構造を考慮してコンパイラは作られたのですよね?
だとしたらコンパイラの出力するバイナリコードは直接の関係は無いのは何故ですか?
私みたいな人間にわかりやすく教えて頂けないでしょうか?
どうかよろしくお願いします。

お礼日時:2018/05/02 07:10

なぜ「同じCPUならば出力される実行ファイルは同じ」と思ったのかがわからない. C だって


「変数 x の値を 1 増やす」
ときに書き方はいくつかあるでしょ?
    • good
    • 0

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