![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
プログラムがどこから始まるように実行ファイルを作るのかは、実行ファイルを最終的にまとめるリンカが設定します。 それを、C言語用に main 関数を呼び出すスタートアップから始まる様に、コンパイラドライバが、リンカに指定します。
スタートアップが、main 関数を呼び出す様にしているので、リンカは main 関数を探してリンクします。
また、main 関数が使う様にしている関数や変数も、リンカが探してリンクし、以下同様に、必要な物を探して実行ファイルにします。
これは、どういう意味でしょうか?教えていただけると幸いです。すみません。
コンパイラドライバとコンパイラは同じ意味でしょうか?main関数以降はプログラマが書くのですよね?教えていただけると幸いです。すみません。
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
そこに書いてあることは理解する必要はありません。
理解しなくてもプログラムは作成できます。
今は小学生が学校でプログラミング教育を受けている時代です。
わかる所だけやっていればよい、と考えましょう。
実際、ご質問のような文章を見たこともないし、理解もできないプログラマはたくさんいると思います。大昔のプログラム開発ではないのですから、分業です。
例えば、リンカを作るプログラマやコンパイラを作るプログラマはある程度知らないとできません。でもリンカやコンパイラを作ったことのあるプログラマはほとんどいないと思います。
No.5
- 回答日時:
>これは、どういう意味でしょうか?
非常に簡単なことです。
たとえばprintf()という関数をmain()の中で使う場合、printf()という関数の中身そのものはプログラマは書きません。実際にはライブラリの中に収録されています。ライブラリの中に収録されている関数をユーザプログラムが使用している場合に、リンカはそのプログラムの実体をリンクするのです。
もしこれを「非常に簡単なこと」と理解できないのであれば、掲題の質問に対するいかなる回答も、現在のあなたの知識では理解できません。
No.4
- 回答日時:
No.2です。
> スタートアップコードというのは何なのでしょうか?
> (←stdio.hなどに宣言される関数ですね)とはどういう事でしょうか?
端的にお答えします。
質問者様はC言語だけでなく、そもそもコンパイル言語を使用してソースコードを書き、それをコンパイル&リンクして実行ファイルを作成した経験がない方のようです。
一方、ご質問に引用(?)された文章は専門書などのものでかつ、運悪くあまり書き方がよろしくない本のようです。
ですのでご質問にある文章に出て来る専門用語などを実際の意味を含めて正しく理解するのはかなりハードルが高いとご理解されるのがよいでしょう。
まずは以下のように理解し、C言語の入門書などで実際のC言語の使い方、C言語で書いた簡単なプログラムの実行ファイルの作り方を勉強されるとよいかと存じます。
ーーーーー 説明 ここから ーーーーー
人がコンピューターである処理をするプログラムをC言語で書く際、処理を開始する最初の関数名はmain()と決まっていて、好きな名前を付けることはできない。必ずmain()でなければならない。
出来たプログラムは拡張子が.cのテキストファイルで保存する。拡張子以外のファイル名は自由である。
ただし、このファイルを直接実行することは出来ず、コンパイル・リンクと言う作業をし、人が読み事が出来るC言語をコンピューターが実行できる機械語に翻訳する必要がある。
機械語に翻訳されたプログラムは拡張子が.exeというファイルに保存するようコンパイル・リンクの作業を行う際に指定する。
なお、C言語に限らずプログラム中でキーボードからの入力や画面への出力などOS(オペレーティング・システム←WindowsやMacOSなどコンピューターというハードウェアがコンピューターとして動作するための各種処理を行うプおログラム)が提供する機能を使用する。
これにはコンパイルしたプログラムにOSが提供する機能を付加する処理が必要で、それを行うのが「リンク」と呼ばれる処理である。
ーーーーー 説明 ここまで ーーーーー
No.3
- 回答日時:
に書いている
https://atmarkit.itmedia.co.jp/ait/articles/1703 …
より引用
>「スタートアップの役割」
> 実際にはスタートアップは標準Cライブラリによって提供されているため、「一般プログラマは意識する必要は無い」。
初級程度のC言語技術では、リンクもスタートアップもライブラリも、意識する必要はありません。
普通にコンパイルすれば、スタートアップやライブラリとのリンクも自動で行なわれるからです。
中級以上になって、ライブラリとリンクはある程度意識する必要が出てきますが、それでも細かいところまで意識する必要はありません。
コンパイルのときに、ライブラリを指定するためにオプションを付ける、とかいった程度のことです。
スタートアップを気にしなければならないのは、本当に限られた人だけです。
本筋に関係無いことを気にしすぎです。
No.2
- 回答日時:
えっと。
。。質問者様はC言語で書かれたプログラムを読んで内容を理解できるスキルをお持ちでしょうか?
> main関数以降はプログラマが書くのですよね?
・・・ということはほぼC言語の知識は無いと思われますがどうなのでしょう?
その辺の情報が何もありませんため、どういう技術レベルでお話をしてよいのかがわかりません。。。
で。
あるプログラムをC言語で記述する場合、最初に起動される関数はmain()という決まりになっています。
ですからプログラムを書く人はmain()から書きます。
で。
プログラム言語の入門書の最初によくある「Hello World」と出力するだけのプログラムの様な至極簡単なプログラムならmain()関数だけで済みます。
少し大きなプログラムになるとmain()関数の中から別の関数を呼び出すようにし、それらの関数の処理内容も記述します・・・というか、設計段階でどういう処置を行う何という名前の関数を作るかといったことをしっかり設計し、それにしたがってプログラムを書きます。
で。
出来上がったらコンパイル&リンクを行って実行ファイルを作るわけですが、コンパイルは人が読める形のC言語のソースプログラムをアセンブリ言語に翻訳する作業です。
なお、今日一般的に使われている多くの言語のコンパイラーはアセンブリ言語を更に機械語に翻訳するアセンブルと呼ばれる作業も行います。
これで完成するのがオブジェクト・モジュールです。
で。
ここではまだ人が書いたmain()関数以下の内容を機械語に翻訳しただけで、入力や出力などシステムが用意している外部呼出しの関数(←stdio.hなどに宣言される関数ですね)に関する情報が組み込まれていません。また、ソースプログラムを記述したファイル・・・ファイルの拡張子が.cのファイルですね、これが複数ある場合などの相互の結びつけなどもできていません。
それらを行うのがリンカーです。
で。
上記の一連の流れをコントロールするのがコンパイル・ドライバーです。
代表例はgcc・・・ですね。
参考まで。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# C言語のwhileを含む関数について 2 2022/12/16 12:28
- C言語・C++・C# 競技プログラミングに関する質問です。 3 2022/04/03 19:51
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# 意味を教えてください main関数内で実行 if __name__ == "__main__": の 1 2022/05/24 12:35
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
gccでスタックオーバーフローの...
-
プロダクションコードとは?
-
マイコンからプログラムを読み...
-
COBOLのS9タイプからXタイプへ...
-
MSDOSでのプログラムについて
-
2値化した画像の黒い部分のピク...
-
遠方界のプログラム
-
DirectShowでのカメラ画像
-
vba listviewにおけるtextのAli...
-
プログラミングの問題と解答例...
-
c言語のサイコロを100回振って...
-
無限ループ中にある任意のキー...
-
VB6 画面サイズ変更について
-
Arduino nano(アルドゥイーノ ...
-
指定したフォルダーを最前面表...
-
Excel VBA で、データベースフ...
-
VB5.0のプログラムをXPで
-
Javaで、他のアプリケーション...
-
大学で、泡の粗大化のシミュレ...
-
アセンブリ言語でプログラムを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vba listviewにおけるtextのAli...
-
Webプログラムってネイティブア...
-
プロダクションコードとは?
-
指定したフォルダーを最前面表...
-
VBA
-
初級者の質問――time_tについて
-
Arduino nano(アルドゥイーノ ...
-
世界一美しいソースコード
-
2値化した画像の黒い部分のピク...
-
C言語primeについて
-
COBOLのS9タイプからXタイプへ...
-
無限ループ中にある任意のキー...
-
マイコンからプログラムを読み...
-
processingで雪が積もるような...
-
Excel VBA で、データベースフ...
-
openGLで物体を半透明にして表...
-
C言語→MATLABへの変換で、困っ...
-
三次元のグラフを書きたいので...
-
コンパイルエラーの意味
-
プログラムってコードに性格っ...
おすすめ情報
では、スタートアップコードとは、なんなのでしょうか?
C言語プログラマとしては、スタートアップコードは・・・ ・自分が書いたプログラムを、直接動かすために必要なライブラリ ・それはコンパイル後、リンカによって追加されるライブラリと書いていますが、どういう事でしょうか?教えていただけると幸いです。すみません。
main関数以降はプログラマが書くのですよね?プログラマが関数をリンカでリンクさせるのでしょうか?教えていただけると幸いです。すみません。
(←stdio.hなどに宣言される関数ですね)とはどういう事でしょうか?教えていただけると幸いです。すみません。