質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

Q&A

解決済

4回答

1584閲覧

Cのコンパイラは、C->アセンブリ->機械語 の順番でコンパイルしているのでしょうか?それとも、C->機械語 と一発でコンパイルしているのでしょうか?

raise_a_hand

総合スコア26

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

コンパイラ

コンパイラは、プログラミング言語で記述したソースコードを、コンピュータの実行形式であるオブジェクトコードに変換するプログラムです。

0グッド

2クリップ

投稿2019/10/28 12:09

表題の通りになります。

もし、メジャーなCコンパイラがいくつかあり、それによって仕様が分かれるようであれば、
それぞれのコンパイラがどちらの仕様なのか教えていただけると、大変助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takasima20

2019/10/28 13:39

昔の牧歌的な環境だったらCコンパイラはアセンブラトランスレータ的なものだったかもしれませんが、最近の高度な環境だとそうそうのんきなこともしてらんないのかなあって気はしますねえ。
guest

回答4

0

ちゃんと調べてませんが、
アセンブラソースと、機械語は1対1対応するので、「人間が読みたいからアセンブラソースをファイルとして出力してくれ」というオプションを指示しない限り、アセンブラソースは生成する意味がないでしょう。意味がないことはしないと思います。

投稿2019/10/28 12:39

otn

総合スコア84538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

clangは、C→中間言語→LLVM→リンカ→機械語
・・・実際は、ほとんどがLLVMの仕事だと思う・・・

投稿2019/10/28 12:38

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

C->アセンブリ->機械語 の順番~~です。~~でコンパイルするものは少なくありません。例えば

  • GCC
  • リッチーが作った最初のCコンパイラ
  • ジョンソンのPCC(Portable C Compiler)
  • 私が仕事で使っていたマイナーなCコンパイラ

などです。ジョンソンのPCCは多くのCコンパイラが参考にしたと聞くので、同様の実装は少なくなかったはずで、私が使ったコンパイラもそのひとつだったかもしれません。

どのコンパイラにもアセンブリコードを生成させるオプションがあります。~~それが何よりの証拠です。~~例えばGCCだと -S オプションがそうです。

もっというと、プリプロセッサがソースを書き変える段階(前処理フェーズ)もあって、プリプロセスした結果を生成させるオプションがあったりします。GCC だと -E オプションです。

投稿2019/10/28 14:41

編集2019/11/01 01:24
rubato6809

総合スコア1380

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2019/10/31 12:30

コンパイラにアセンブラ出力のオプションがあると言っても、必ず、アセンブラ出力する必要はありません。そのまま、オブジェクトを出力すれば、良いだけです。
rubato6809

2019/10/31 12:56

それは違うと思う。Cコンパイラの実装に依ると思いますが、 (a) 一時ファイルにアセンブリコードを生成し、アセンブルしたら一時ファイルを消す。この場合、オプション指定があればファイルを消さない、という方式。少なくともK&R当時のコンパイラはこのやり方でした。 (b) 一時ファイルを作るのではなく、オンメモリでアセンブルするものもありうると思う。この場合はオプション指定があればオンメモリの内容をファイルに出力すればよい。 いずれにしても、オブジェクトを生成するのはアセンブラの役割であるはず。即ち、ファイルとして残らなくても一旦アセンブリコードを生成する。それがコンパイラの構成として理にかなっていると思います。
rubato6809

2019/10/31 12:58

逆に伺いますが、アセンブリコードを経ずにオブジェクトを作っているという具体的な証拠はありますか? その場合、オプション指定で生成するアセンブリコードは、どのようにして作るのですか?
Zuishin

2019/10/31 13:32

それこそ話が逆でしょう。この回答は、どのコンパイラも必ずアセンブリコードを作っているという回答ですが、その具体的証拠はありますか? 世界中のコンパイラ、少なくとも主要コンパイラのすべてがコンパイル時に必ずテキストを内部で作成している証拠が無い限り、この回答は単なるあてずっぽうの域を出ません。 アセンブリコードはテキストです。これを経ることで効率は落ちます。gcc のようにアセンブラを呼びだすことを前提にしているコンパイラならともかく、ワンパスコンパイラがわざわざテキストを作成する意味はありません。構文ツリーから直接機械語を生み出すロジックを組むことは可能であり、効率的であり、理にかなっています。そこまで忌避される理由がありません。
Zuishin

2019/10/31 13:42

なお Visual Studio は主要コンパイラの一つに数えられると思いますが、C++ をコンパイルするのに機械語と IL の二種類のパターンを出力することができます。これらは相互互換性がありません。したがって、機械語を作るために IL が必要ということは一切ありません。ならば、テキストとバイナリの二種類の出力ができるとしても、片方を作るためにもう片方を経なければならない理由もないはずです。
Zuishin

2019/10/31 23:31 編集

Excel はデータを xlsx として出力することも csv として出力することもできます。 しかしそれは Excel が xlsx を出力する際に一度 csv に変換している証拠にはなりません。 もし仮にそのようなことをしているとしたら、内部構造を一度 csv というテキストに変換し、データ構造を解析し直して元の内部構造を復元し、そこからバイナリを生成していることになります。非常に非効率なやり方です。 ツールが複数あって、あるツールは csv を出力することしかできず、あるツールは csv を xlsx に変換することしかできないとしたら、多少の非効率は目をつぶってもそのような処理をすることもあるでしょう。 gcc はそれを行っています。 なお、本筋とはやや外れますが、csv は xlsx の情報の多くをそぎ落としているので、元の xlsx を復元することはできません。これは一度 csv に変換していない証拠になります。
rubato6809

2019/11/01 01:18

回答を修正しました。ご指摘ありがとうございます。
guest

0

まあ、大半が、

C->アセンブリ->機械語

でしょう。と思ったが、、、アセンブリを出力してないな。
オブジェクト(今は何がメジャー? ELP?) で出力して、他のライブラリとかとリンク。
なぜかと言うと、大抵のCコンパイラに、アセンブラ出力のオプションがあるから。

投稿2019/10/28 12:16

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問