- コンパイラの構造を読んで、自分なりにメモ
- コンパイラは何をするか
- 人間が書いたコードを機械が使うコードに翻訳する
- 内訳は
- 字句解析→構文解析→中間コード生成→最適化→コード生成
- それをしながら:
-
- プログラムの情報記帳をし
- エラーハンドリングをしてくれる
- コンパイルの実際
- ソースファイルをコンパイルしてなにをするか:
- 実行ファイルを作る(以下のようにして作られた再利用ファイルを読み込んだり、再利用ライブラリを読み込んだりしながら実行ファイルを作る)
- 再利用できるようなファイルを作る
- 再利用できるようなライブラリを作る
- 再利用ファイルの読み込みはインクルードと呼ばれ、ソースファイルに書く。そのインクルードされるべきファイルのパスを指定するのが、gccの-Iオプション
- 同様にライブラリの指定は-Lオプション
- コンパイルの用語、インクルードとか、再利用可能とかに慣れたら、こちらにある「こうするにはこうする」形式のサイトの方がわかりやすい
- さて。次のことができるはずだとわかった。やってみよう
- 単体コードファイルのコンパイル
- 実行可能ファイルをデフォルト名で作る
- と書くのであってと書くのではない、とか、namespaceって何?とはについてはこちら
#include <iostream>
using namespace std;
int main() {
cout << "Hello C++ World" << endl;
return 0;
}
$ g++ test1.cpp
-
-
-
- そうするとデフォルトでa.exeファイルができる。それを、カレントディレクトリにあるaとして実行する
$ ./a
Hello C++ World
$ g++ test1.cpp -o namaeshitei
-
-
-
- そうするとnamaeshitei.exeファイルができるので、それを実行すればよい
$ ./namaeshitei
Hello C++ World
-
-
-
- 数値を扱うプログラムとすれば、ソース内で整数を指定して、それを表示するプログラム
// this is test.cpp
#include <iostream>
#include <stdio.h>
int main(void){
int n = 3;
printf("%d\n", n);
return 0;
}
-
-
- 同じファイル内に関数を定義すれば…
- main()の中でmydouble()を使うので、mydouble()を先に書いて、main()を後に書く(らしい)
// this is test.cpp
#include <iostream>
#include <stdio.h>
int mydouble(int n){
int x;
x = n * 2;
return x;
}
int main(void){
int n = 3;
int x = mydouble(n);
printf("%d\n", x);
return 0;
}
-
-
- インクルード可能なファイルを作る
- 上記のmydouble()関数などを別ファイルに書くことにする。それをインクルードするには、まず、ヘッダファイルと言うものにする(こちら)
- 自作ヘッダファイルを作業ディレクトリに置いておく場合は、そこから探してもらうために# include "hoge.h"のようにする
- 作ったそれをインクルードしてコンパイルする
// this is test.cpp
#include <iostream>
#include <stdio.h>
#include "mydouble.h"
int main(void){
int n = 3;
int x = mydouble(n);
printf("%d\n", x);
return 0;
}
-
-
- 複数のファイルを使ってライブラリを作る
- 関数ファイルごとに中間処理をしておく(オブジェクトファイルを作る)と、コンパイルが速くなる。それらをライブラリとしてまとめておくとさらに便利
- 二つの関数ファイルmydouble.cppとmysquared.cppがあったときに、それをg++ の-cオプションでオブジェクトファイル mydouble.o,mysquared.oにしておく
int mydouble(int n){
int x;
x = n * n;
return x;
}
int mydouble(int n){
int x;
x = n * n;
return x;
}
$ g++ -c mydouble.cpp
$ g++ -c mysquared.cpp
-
-
-
- さらにライブラリ化する。libdbsq.aと言う名前で作るとdbsqライブラリということになる。つないでさらに使えるようにする
$ ar cru libdbsq.a mydouble.o mysquared.o
$ ranlib libdbsq.a
-
-
- とは言え、よくわかっていないので、「そもそもライブラリとは」→こちら(Sunの提供するコンパイラでの話なので、g++を使う場合と違うことに注意)
- これも参考…ヘッダファイルの書き方がわからない…
- 作ったライブラリを使ってコンパイルする