dポイントプレゼントキャンペーン実施中!

プログラムがどこから始まるように実行ファイルを作るのかは、実行ファイルを最終的にまとめるリンカが設定します。 それを、C言語用に main 関数を呼び出すスタートアップから始まる様に、コンパイラドライバが、リンカに指定します。
スタートアップが、main 関数を呼び出す様にしているので、リンカは main 関数を探してリンクします。
また、main 関数が使う様にしている関数や変数も、リンカが探してリンクし、以下同様に、必要な物を探して実行ファイルにします。
これは、どういう意味でしょうか?教えていただけると幸いです。すみません。
コンパイラドライバとコンパイラは同じ意味でしょうか?main関数以降はプログラマが書くのですよね?教えていただけると幸いです。すみません。

質問者からの補足コメント

  • うーん・・・

    では、スタートアップコードとは、なんなのでしょうか?
    C言語プログラマとしては、スタートアップコードは・・・ ・自分が書いたプログラムを、直接動かすために必要なライブラリ ・それはコンパイル後、リンカによって追加されるライブラリと書いていますが、どういう事でしょうか?教えていただけると幸いです。すみません。

    No.1の回答に寄せられた補足コメントです。 補足日時:2021/08/22 15:31
  • うーん・・・

    main関数以降はプログラマが書くのですよね?プログラマが関数をリンカでリンクさせるのでしょうか?教えていただけると幸いです。すみません。

    No.2の回答に寄せられた補足コメントです。 補足日時:2021/08/22 21:35
  • うーん・・・

    (←stdio.hなどに宣言される関数ですね)とはどういう事でしょうか?教えていただけると幸いです。すみません。

      補足日時:2021/08/22 22:42

A 回答 (6件)

そこに書いてあることは理解する必要はありません。


理解しなくてもプログラムは作成できます。
今は小学生が学校でプログラミング教育を受けている時代です。
わかる所だけやっていればよい、と考えましょう。
実際、ご質問のような文章を見たこともないし、理解もできないプログラマはたくさんいると思います。大昔のプログラム開発ではないのですから、分業です。
例えば、リンカを作るプログラマやコンパイラを作るプログラマはある程度知らないとできません。でもリンカやコンパイラを作ったことのあるプログラマはほとんどいないと思います。
    • good
    • 0

>これは、どういう意味でしょうか?



非常に簡単なことです。
たとえばprintf()という関数をmain()の中で使う場合、printf()という関数の中身そのものはプログラマは書きません。実際にはライブラリの中に収録されています。ライブラリの中に収録されている関数をユーザプログラムが使用している場合に、リンカはそのプログラムの実体をリンクするのです。

もしこれを「非常に簡単なこと」と理解できないのであれば、掲題の質問に対するいかなる回答も、現在のあなたの知識では理解できません。
    • good
    • 1

No.2です。



> スタートアップコードというのは何なのでしょうか?

> (←stdio.hなどに宣言される関数ですね)とはどういう事でしょうか?

端的にお答えします。

質問者様はC言語だけでなく、そもそもコンパイル言語を使用してソースコードを書き、それをコンパイル&リンクして実行ファイルを作成した経験がない方のようです。
一方、ご質問に引用(?)された文章は専門書などのものでかつ、運悪くあまり書き方がよろしくない本のようです。
ですのでご質問にある文章に出て来る専門用語などを実際の意味を含めて正しく理解するのはかなりハードルが高いとご理解されるのがよいでしょう。

まずは以下のように理解し、C言語の入門書などで実際のC言語の使い方、C言語で書いた簡単なプログラムの実行ファイルの作り方を勉強されるとよいかと存じます。

ーーーーー 説明 ここから ーーーーー

人がコンピューターである処理をするプログラムをC言語で書く際、処理を開始する最初の関数名はmain()と決まっていて、好きな名前を付けることはできない。必ずmain()でなければならない。
出来たプログラムは拡張子が.cのテキストファイルで保存する。拡張子以外のファイル名は自由である。
ただし、このファイルを直接実行することは出来ず、コンパイル・リンクと言う作業をし、人が読み事が出来るC言語をコンピューターが実行できる機械語に翻訳する必要がある。
機械語に翻訳されたプログラムは拡張子が.exeというファイルに保存するようコンパイル・リンクの作業を行う際に指定する。

なお、C言語に限らずプログラム中でキーボードからの入力や画面への出力などOS(オペレーティング・システム←WindowsやMacOSなどコンピューターというハードウェアがコンピューターとして動作するための各種処理を行うプおログラム)が提供する機能を使用する。
これにはコンパイルしたプログラムにOSが提供する機能を付加する処理が必要で、それを行うのが「リンク」と呼ばれる処理である。

ーーーーー 説明 ここまで ーーーーー
    • good
    • 3

https://oshiete.goo.ne.jp/qa/12512455.html
に書いている
https://atmarkit.itmedia.co.jp/ait/articles/1703 …
より引用

>「スタートアップの役割」
> 実際にはスタートアップは標準Cライブラリによって提供されているため、「一般プログラマは意識する必要は無い」。


初級程度のC言語技術では、リンクもスタートアップもライブラリも、意識する必要はありません。
普通にコンパイルすれば、スタートアップやライブラリとのリンクも自動で行なわれるからです。

中級以上になって、ライブラリとリンクはある程度意識する必要が出てきますが、それでも細かいところまで意識する必要はありません。
コンパイルのときに、ライブラリを指定するためにオプションを付ける、とかいった程度のことです。

スタートアップを気にしなければならないのは、本当に限られた人だけです。



本筋に関係無いことを気にしすぎです。
    • good
    • 4

えっと。

。。
質問者様はC言語で書かれたプログラムを読んで内容を理解できるスキルをお持ちでしょうか?

> main関数以降はプログラマが書くのですよね?

・・・ということはほぼC言語の知識は無いと思われますがどうなのでしょう?
その辺の情報が何もありませんため、どういう技術レベルでお話をしてよいのかがわかりません。。。

で。
あるプログラムをC言語で記述する場合、最初に起動される関数はmain()という決まりになっています。
ですからプログラムを書く人はmain()から書きます。

で。
プログラム言語の入門書の最初によくある「Hello World」と出力するだけのプログラムの様な至極簡単なプログラムならmain()関数だけで済みます。
少し大きなプログラムになるとmain()関数の中から別の関数を呼び出すようにし、それらの関数の処理内容も記述します・・・というか、設計段階でどういう処置を行う何という名前の関数を作るかといったことをしっかり設計し、それにしたがってプログラムを書きます。

で。
出来上がったらコンパイル&リンクを行って実行ファイルを作るわけですが、コンパイルは人が読める形のC言語のソースプログラムをアセンブリ言語に翻訳する作業です。
なお、今日一般的に使われている多くの言語のコンパイラーはアセンブリ言語を更に機械語に翻訳するアセンブルと呼ばれる作業も行います。
これで完成するのがオブジェクト・モジュールです。

で。
ここではまだ人が書いたmain()関数以下の内容を機械語に翻訳しただけで、入力や出力などシステムが用意している外部呼出しの関数(←stdio.hなどに宣言される関数ですね)に関する情報が組み込まれていません。また、ソースプログラムを記述したファイル・・・ファイルの拡張子が.cのファイルですね、これが複数ある場合などの相互の結びつけなどもできていません。
それらを行うのがリンカーです。

で。
上記の一連の流れをコントロールするのがコンパイル・ドライバーです。
代表例はgcc・・・ですね。

参考まで。
この回答への補足あり
    • good
    • 0
この回答へのお礼

スタートアップコードというのは何なのでしょうか?教えていただけると幸いです。すみません。

お礼日時:2021/08/22 21:24

はい。


main()関数をプログラマが用意しておけば、
それを起動するところまではコンパイラ(とリンカ)
とOSがちゃんとやってくれるということです。

一度、アセンブラでプログラムを作ってみては?
EXEヘッダとか自作すれば仕組みが解ると思います。
この回答への補足あり
    • good
    • 1
この回答へのお礼

では、スタートアップコードとは何でしょうか?教えていただけると幸いです。すみません。教えていただけると幸いです。すみません。

お礼日時:2021/08/22 15:28

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