
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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ソフトの開発言語を調べる方法
-
unsigned long long 型のフォー...
-
PICでのI2C通信でのマスタ、ス...
-
VB6のコンパイラ
-
C言語の規格
-
トランジスタ技術9月号の第2章A...
-
リリースモードとデバッグモー...
-
組み込みソフト。ROM領域にデータ
-
cc と gcc の違い
-
PICマイコンのプログラムカウン...
-
コンパイラによって出力される...
-
AIXとCOBOLについて
-
オープン系とか、組込み系とか...
-
COBOLの論理演算子について質問...
-
C言語:OS移行時の注意点(Sola...
-
.netでの、VBと比べてのC++の優...
-
C言語
-
COBOLのALPHABET...
-
VC++の/Zm オプションについて
-
初心者に一番分かりやすいCO...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ソフトの開発言語を調べる方法
-
unsigned long long 型のフォー...
-
C++でデスクトップGUIアプリ開...
-
パーサとコンパイラの違いって?
-
printfなど、標準関数のソース...
-
COBOLの論理演算子について質問...
-
cc と gcc の違い
-
組み込みソフト。ROM領域にデータ
-
<conio.h>?
-
COBOLのALPHABET...
-
24bit サイズの変数
-
C++Builder → Visual C++ 移植...
-
リリースモードとデバッグモー...
-
PICでのI2C通信でのマスタ、ス...
-
VC++の/Zm オプションについて
-
bcpadのコンパイラのインストー...
-
『Bin』ディレクトリは何の略語?
-
C言語の規格
-
C言語はC言語でできている?
-
C言語でチェスを作ってみたいと...
おすすめ情報