teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

削除要求が通らなかったので、編集にて対応させていただきました。

2016/08/29 02:17

投稿

退会済みユーザー
answer CHANGED
@@ -1,31 +1,1 @@
1
- ###ファイル分割の話
2
- 喩えが良くないかも知れませんが、犬小屋のように設計書をわざわざ書き起こさなくても作れるような小さなプログラムであればどうでもいいのかもしれません。でも、数個以上のクラスで構成されるようになると、1つのファイルに全てを書くのはむしろしんどくなりますよね。つまり、プログラムの管理上の問題でソースファイルの分割は不可欠です。まずこれが大前提で、それはC(C++を含みますが、以後Cとします)でもC#でも同じですね。
3
-
4
- では、ソースファイルを分割する場合、Cの場合なぜヘッダーファイル、実装ファイルを分けることになるのか。
5
- C#だってファイルは分割されているのに、ヘッダーファイルがありません。
6
-
7
- ###ヘッダーファイルと実装ファイルに分ける話
8
-
9
- Cの場合のプログラムのビルドのプロセスは、.C(.CPP)ファイルごとにまずコンパイルし(複数のファイルを一度にコンパイラに指定しても、処理はファイル単位)、それぞれに対応する中間ファイル(.oファイル等)がはき出されます。最後にリンク処理が行われ、1つにまとめられて実行ファイル(等)が作られます。(もちろん処理系によって詳細は異なりますが、基本はこんな感じです)
10
-
11
- C#の場合、おそらくソースファイルの時点で1つにまとめられて一緒くたに処理されるのだと思うのです(済みません、確認は取れていません)。
12
-
13
- この違いは言語のできた時代も関係する思想の差によるものなのかも知れません。Cの場合、登場した時代はハードウェアのパワーやリソースが非常に限られていて、それらを節約することが大前提だったと思うのです。(ファイルをまとめるより別けてコンパイルした方がワーキングメモリが節約できる)
14
-
15
- このビルド方法は文法と一体になっているために、現在まで継承されいるのかもしれません。ただし、文法に影響を与えない範囲で、実際の処理系は密かに進化していて、たとえばVC++はプリコンパイル済ヘッダ、なんていう中間ファイルを使ったりしてビルド処理を速める工夫をしていたりします(副作用もあるのですが)。
16
-
17
- ビルド方法が文法と一体になっている、というのは、文法上でも定義と実装を別けるようになっていることです。C#やJavaはクラスを定義と実装に別けませんが、C++では特殊な用途の場合を除いてそのような書き方はしません。
18
-
19
- 他にもきっといろいろあるはずですが、省略して結論しますと、Cは文法そのものがヘッダーと実装ファイルを別ける前提になっている、と言えると思うのです。
20
-
21
- ###余談
22
-
23
- 潤沢なリソースが期待できる今の時代なら、たとえばCでもなにかプリコンパイルツールを作って分割されたソースを1つにまとめてしまう処理をすれば、ヘッダーと実装ファイルを別けなくてもうまくいくのかも知れません。
24
- でも、そうすると文法そのものにも影響が出てきてしまうと思われます。たとえばファイルスコープの概念が消えてしまったり(それだけならnamespace等別のスコープに自動的に変換してどうにかなるかもしれませんが)。
25
- 結局、そんなことまでして得られるメリットは何か? と考えると、それなら別な言語を使いましょう、という解決方法が適切になってくるように思えます。
26
- 高級言語ではなく、Cの中級言語(※)としての役割をも考えたとき、その考えを更に後押しするようにも思います。
27
- (※:Cはシステム記述言語でもあり、業務系指向とは言えないかも知れません。もちろん、業務系にも十二分に対応はできますが・・・)
28
-
29
- ###長々書きましたが
30
-
31
- もし間違っている点があれば遠慮無くご指摘いただけたらと思います。
1
+ 削除させていただきました。

3

()書き追加

2016/08/29 02:17

投稿

退会済みユーザー
answer CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  C#の場合、おそらくソースファイルの時点で1つにまとめられて一緒くたに処理されるのだと思うのです(済みません、確認は取れていません)。
12
12
 
13
- この違いは言語のできた時代も関係する思想の差によるものなのかも知れません。Cの場合、登場した時代はハードウェアのパワーやリソースが非常に限られていて、それらを節約することが大前提だったと思うのです。
13
+ この違いは言語のできた時代も関係する思想の差によるものなのかも知れません。Cの場合、登場した時代はハードウェアのパワーやリソースが非常に限られていて、それらを節約することが大前提だったと思うのです。(ファイルをまとめるより別けてコンパイルした方がワーキングメモリが節約できる)
14
14
 
15
15
  このビルド方法は文法と一体になっているために、現在まで継承されいるのかもしれません。ただし、文法に影響を与えない範囲で、実際の処理系は密かに進化していて、たとえばVC++はプリコンパイル済ヘッダ、なんていう中間ファイルを使ったりしてビルド処理を速める工夫をしていたりします(副作用もあるのですが)。
16
16
 

2

誤字修正や若干の追記

2016/08/21 10:49

投稿

退会済みユーザー
answer CHANGED
@@ -22,8 +22,9 @@
22
22
 
23
23
  潤沢なリソースが期待できる今の時代なら、たとえばCでもなにかプリコンパイルツールを作って分割されたソースを1つにまとめてしまう処理をすれば、ヘッダーと実装ファイルを別けなくてもうまくいくのかも知れません。
24
24
  でも、そうすると文法そのものにも影響が出てきてしまうと思われます。たとえばファイルスコープの概念が消えてしまったり(それだけならnamespace等別のスコープに自動的に変換してどうにかなるかもしれませんが)。
25
- 結局、そんなことまでして得られるメリット何か? と考えると、それなら別な言語を使いましょう、という解決方法が適切になってくるように思えます。
25
+ 結局、そんなことまでして得られるメリット何か? と考えると、それなら別な言語を使いましょう、という解決方法が適切になってくるように思えます。
26
- 高級言語ではなく、Cの中級言語としての役割をも考えたとき、その考えを更に後押しするようにも思います。
26
+ 高級言語ではなく、Cの中級言語(※)としての役割をも考えたとき、その考えを更に後押しするようにも思います。
27
+ (※:Cはシステム記述言語でもあり、業務系指向とは言えないかも知れません。もちろん、業務系にも十二分に対応はできますが・・・)
27
28
 
28
29
  ###長々書きましたが
29
30
 

1

誤字修正

2016/08/21 10:45

投稿

退会済みユーザー
answer CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  ###ヘッダーファイルと実装ファイルに分ける話
8
8
 
9
- Cの場合のプログラムのビルドのプロセスは、.C(.CPP)ファイルごとにまずコンパイルし(複数のファイルを一度にコンパイラに指定しても、処理はファイル単位)、それぞれに対応する中間ファイル(.oフィある等)がはき出されます。最後にリンク処理が行われ、1つにまとめられて実行ファイル(等)が作られます。(もちろん処理系によって詳細は異なりますが、基本はこんな感じです)
9
+ Cの場合のプログラムのビルドのプロセスは、.C(.CPP)ファイルごとにまずコンパイルし(複数のファイルを一度にコンパイラに指定しても、処理はファイル単位)、それぞれに対応する中間ファイル(.oファイル等)がはき出されます。最後にリンク処理が行われ、1つにまとめられて実行ファイル(等)が作られます。(もちろん処理系によって詳細は異なりますが、基本はこんな感じです)
10
10
 
11
11
  C#の場合、おそらくソースファイルの時点で1つにまとめられて一緒くたに処理されるのだと思うのです(済みません、確認は取れていません)。
12
12