
A 回答 (11件中1~10件)
- 最新から表示
- 回答順に表示
No.11
- 回答日時:
コンパイラは、人間が分かる言葉で書かれたソースコードを機械語に変換するソフトウェアです。
同じ結果が得られるような機械語コードを作成するという意味では、コンパイラによって出来上がるバイナリコードは異なって然りと思います。
No.2の方の回答に「書き方はいくつかあるでしょ?」とご指摘があるとおり、
例えば、
a = 0;
のようなCのコードがあり、内部的にはアキュムレータに0を代入する場合、
mov eax,0
の他に、
xor eax,eax
という記法もあります。
上記の例では、ほとんどのコンパイラは後者のコードを吐き出すと思いますので例としては適当ではないかもしれませんが、
同じ処理を行うにしてもコンパイラによって最適化の手法が違えば当然違う機械語コードが作成されるということです。
さらに、同じコンパイラでも、最適化オプションによって出力される機械語コードは異なります。
No.10
- 回答日時:
> コンパイラから出力されたバイナリデータがなぜ正確に周辺機器、例えばディスプレイなどに反映するのですか?
そこら辺を理解するには、カーネル、システムコール、リングプロテクション、
デバイスドライバあたりを理解する必要があります。
質問者さんの感じでは、
その前段としてマルチタスクとコンテキストスイッチについても
理解されたほうがいいと思います。
上記はこんな場で説明できるものではないので、
まずは調べてください。
調べた上でわからないことを聞くようにしてください。
上記のあたりに関してはバイナリコードはシステムコールを発行しているだけです。
コンパイラはシステムコールを発行するように翻訳しているだけです。
No.8
- 回答日時:
>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の命令を使ってしまうコンパイラもいたりします。
バージョンによっても結果が変わったりしますので、「コンパイラを変えても一意なコンパイル結果を得られると保証できるプログラムなんて書けるの?」と逆に質問したい位です。

No.7
- 回答日時:
No6さん>-度10行たらずでもよいから、マシン語でプログラム書いてみたらいかがですか?
いいですね。
たとえば「値を10倍する」方法、10進数なら1桁左シフトするだけですが
2進数なレジスタではそうはいきません。
簡単なところでは「10回加算する」
すこしアクロバチックなところでは
「3回バイナリシフトして得た8倍値と、1回バイナリシフトして得た2倍値を
加算する」とかもあります。
命令セットに乗算命令があるCPUなら、「10倍に乗算する」ことも可能です。
実現手段は複数あるんですよ。
>CPU(の周りの周辺機器)の構造を考慮してコンパイラは作られたのですよね?
だとしたらコンパイラの出力するバイナリコードは直接の関係は無いのは何故ですか?
どこが疑問だかわかりません。
繰り返し書いてるように「やり方は複数ある(唯一でない)から」。
>私みたいな人間にわかりやすく教えて頂けないでしょうか?
>どうかよろしくお願いします。
いちいち1段階ごとに理由を求めてるとこの世界は理解が進まないでしょう。
当面は「こういう性格のもの」と、ブラックボックス扱いにでもして、次段階に進むほうが
現実的です。
もっと詳しく学習が進めばおのずとわかります。
No.6
- 回答日時:
う~ん-度10行たらずでもよいから、マシン語でプログラム書いてみたら
いかがですか?
そんな考え吹き飛びますよ。
自分の頭でっかちさに呆れる筈です。
1から10までの和を計算するなんていかがでしょう。
さて、ル―プカウンタはどのレジスタにしますか?
あなたの考えが正しければ選ばなくても初めから
決まっているはずです。
No.5
- 回答日時:
> CPU(の周りの周辺機器)の構造を考慮してコンパイラは作られたのですよね?
周辺機器なんて考慮していません。CPUの構造ってのはなんでしょうか。
コアの数とかパイプラインの段数とかでしょうか。
コンパイラが考慮するのは命令セットだけです。
どこからそんなトンデモ知識を仕入れらたのでしょうか?
それから、
本などの知識にあたって、わからないことがあって
始めてここに聞くならともかく、
なんでもかんでもここに聞くのだと、
終いに誰からも相手にされなくなりますよ。
だったら、プログラムをコンパイルして
コンパイラから出力されたバイナリデータがなぜ正確に周辺機器、例えばディスプレイなどに反映するのですか?
コンパイラでない、何が以上の事を可能にしているのですか?
出力されるバイナリデータが正しく行き届かないと意味がないと思います。

No.4
- 回答日時:
学校の課題とかで、一つの課題に対してそれを処理するコードを書いた場合、人それぞれの個性があってコードは同じにならないじゃないですか。
それと同じくコンパイラにも個性があって、同じコードを食わせた場合に吐き出すバイナリは異なります。これがアセンブラだと、アセンブルコードと機械語命令は一対一に対応するから差は出ないけど、高級言語で書かれたコードをコンパイルした場合、1行のコードは数10行や数100行(あるいはそれ以上)の機械語命令になります。単純なループ一つをとっても、変数をメモリのどこに配置するのか、どのレジスタを使うのか…みたいにいろんなやり方があり得ますよね?異なるコンパイラ作者が書いたものなのに、それら一字一句が同じになるなんてことの方がおかしいですよ。
No.3
- 回答日時:
コンパイラが出力するバイナリコードとCPUには直接の関係はありません。
コンパイラは高級言語をマシン語に翻訳するソフトウェアです。
コンパイラに内在する翻訳ルールに従って高級言語のプログラムを
x86_64命令やx86命令のバイナリコードに変換しています。
だから、x86_64 cpu上で動作するWindowsやLinux環境で、
Arm32バイナリを生成するコンパイラもあります。
コンパイラによって翻訳のルールが違うので、
バイナリコードが違う、それだけです。
!?
CPU(の周りの周辺機器)の構造を考慮してコンパイラは作られたのですよね?
だとしたらコンパイラの出力するバイナリコードは直接の関係は無いのは何故ですか?
私みたいな人間にわかりやすく教えて頂けないでしょうか?
どうかよろしくお願いします。
No.2
- 回答日時:
なぜ「同じCPUならば出力される実行ファイルは同じ」と思ったのかがわからない. C だって
「変数 x の値を 1 増やす」
ときに書き方はいくつかあるでしょ?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 画像編集・動画編集・音楽編集 PowerDirector21 動画出力時のCPU稼働率が急に下がってしまう原因を教えてください 2 2023/03/30 20:54
- CPU・メモリ・マザーボード 昨日SSDを増設したら、PCが点かなくなりました。 ※BIOS画面にも行けません。 OSの入ったスト 6 2022/08/15 10:53
- CPU・メモリ・マザーボード CPUがメモリ上に書かれている命令を実行した後の流れについての質問です。 1 2023/05/05 01:18
- その他(OS) windows11非対応のインストール 3 2022/10/26 07:12
- CPU・メモリ・マザーボード AMD Ryzen3700X 付属のCPUクーラー性能はいかほどか? 2 2022/05/16 21:19
- BTOパソコン 就職決まって「実際来週の月曜から勤務」落ち着いた時お祝いてわけではないですがずっとゲーミングPC買う 1 2022/07/08 03:13
- CPU・メモリ・マザーボード パソコンでCPUとメモリー、優先は? 11 2023/01/11 17:19
- Windows 8 Windows11 本物❓ 不思議です。 6 2022/03/24 14:27
- CPU・メモリ・マザーボード パソコンのCPUクーラーが頑張りすぎてうるさい 7 2022/11/05 04:03
- C言語・C++・C# exeファイルが作れない(windows10) 6 2022/08/13 08:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Out Of Near Heap Space?
-
templateクラスの宣言と定義を...
-
MPI プログラム
-
C言語でのコンパイラの作成方法
-
C言語について!
-
if文の論理積について
-
パーサとコンパイラの違いって?
-
C言語の2進数表記
-
コンパイラの設定
-
Linux用のC/C++のツール
-
switch文caseについて
-
コンパイラによって出力される...
-
Visual Studioについて。
-
confiureのオプションについて
-
未使用引数の注意文出力を回避...
-
C言語:OS移行時の注意点(Sola...
-
BCC で Cannot open file: wind...
-
C言語はC言語でできている?
-
GCCのコンパイラに関して、パス...
-
リリースモードとデバッグモー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ソフトの開発言語を調べる方法
-
unsigned long long 型のフォー...
-
C++でデスクトップGUIアプリ開...
-
COBOLの論理演算子について質問...
-
組み込みソフト。ROM領域にデータ
-
printfなど、標準関数のソース...
-
cc と gcc の違い
-
リリースモードとデバッグモー...
-
パーサとコンパイラの違いって?
-
AIXとCOBOLについて
-
<conio.h>?
-
COBOLのALPHABET...
-
VC++の/Zm オプションについて
-
C++Builder → Visual C++ 移植...
-
C言語の規格
-
COBOLの論理演算子について
-
変数の内容がコロコロ変わる、...
-
Macで使えるC言語のコンパイラ...
-
PICでのI2C通信でのマスタ、ス...
-
最初に使う変数のゼロクリアに...
おすすめ情報