なぜOSごとにC/C++を再コンパイルする必要があるのですか?[重複あり]
質問
これはどちらかというと理論的な質問です。私は、低レベルのプログラミングに大きな関心を持つ、コンピュータサイエンス専攻です。私は、ボンネットの下で物事がどのように動作するかを見つけることが大好きです。私の専門はコンパイラの設計です。
とにかく、最初のコンパイラーに取り組んでいるとき、ちょっと混乱するようなことが起こっています。
C/C++ でプログラムを書くとき、人々が知っている伝統的なことは、コンパイラが魔法のように C/C++ コードをそのマシン用のネイティブコードに変えてしまうということです。
しかし、ここで何か腑に落ちないことがあります。x86 アーキテクチャをターゲットとして C/C++ プログラムをコンパイルした場合、同じプログラムは同じアーキテクチャの任意のコンピューターで実行できるように思われます。しかし、そうはならない。OS X や Linux、Windows 用にコードを再コンパイルする必要があります (さらに 32 ビットと 64 ビットの場合にも再コンパイルが必要です)。
なぜこのようなことが起こるのか、不思議に思っています。C/C++ プログラムをコンパイルするとき、CPU アーキテクチャ/命令セットをターゲットにしないのでしょうか? そして、Mac OS と Windows OS は、まったく同じアーキテクチャで実行することができます。
(Java や類似のものが VM や CLR をターゲットにしていることは知っているので、これらはカウントされません)
もし私がこれでベストショットの答えを出したとしたら、C/C++ は OS 固有の命令にコンパイルされなければならないと言うでしょう。しかし、私が読んだすべてのソースは、コンパイラーはマシンをターゲットにしていると言っています。ですから、私は非常に混乱しています。
どのように解決するのですか?
<ブロッククオートC/C++のプログラムをコンパイルするとき、CPUアーキテクチャ/命令セットをターゲットにしないのですか?
いいえ、そうではありません。
つまり、はい、あなたはCPU命令セット用にコンパイルしているのです。しかし、それは すべて コンパイルがすべてではありません。
最も単純な "Hello, world!" プログラムを考えてみましょう。このプログラムが行うのは
printf
を呼び出すだけですよね?しかし、"printf" 命令セットのオペコードはありません。では...一体何が起こるのでしょうか?
これはCの標準ライブラリの一部なんだ。その
printf
関数は文字列とパラメータに対して何らかの処理を行い、そして...それを表示します。どうやって表示するんだ?それは、文字列を標準出力に送るからです。OK...誰がそれを制御するのですか?
オペレーティングシステムです。そして、quot;standard out"オペコードもありませんから、standard outに文字列を送るには、何らかの形でOSの呼び出しが必要です。
そして、OSコールはオペレーティングシステム間で標準化されていません。C や C++で独自に構築できなかったことを行う、ほとんどすべての標準ライブラリ関数は、少なくともその仕事の一部を行うために OS と話をすることになります。
malloc
? メモリはあなたのものではない、OSのものであり、あなたは
もしかしたら
を持つことが許されています。
scanf
? 標準入力はあなたのものではなく、OSのものであり、あなたはそこから読み取ることができるかもしれません。といった具合です。
標準ライブラリはOSのルーチンの呼び出しから構築されています。そして、これらのOSルーチンは移植不可能であり、したがって、標準ライブラリの実装も移植不可能である。そのため、あなたの実行ファイルには、これらの非ポータブルな呼び出しが含まれています。
そしてその上、OS によって "executable"が何であるかの考え方が異なります。
のように見えます。
. 結局のところ、実行可能ファイルは単なるオペコードの束ではありません。
static
変数はどこに保存されると思いますか?OS によって実行ファイルを起動する方法は異なりますし、実行ファイルの構造はその一部です。
関連
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み] C++で仮想関数が必要な理由とは?
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】'cout'は型名ではない
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】システムが指定されたファイルを見つけられませんでした。