コンパイラ

  • コンパイラの構造を読んで、自分なりにメモ
  • コンパイラは何をするか
    • 人間が書いたコードを機械が使うコードに翻訳する
      • 内訳は
        • 字句解析→構文解析→中間コード生成→最適化→コード生成
    • それをしながら:
        • プログラムの情報記帳をし
        • エラーハンドリングをしてくれる
  • コンパイルの実際
    • ソースファイルをコンパイルしてなにをするか:
      • 実行ファイルを作る(以下のようにして作られた再利用ファイルを読み込んだり、再利用ライブラリを読み込んだりしながら実行ファイルを作る)
      • 再利用できるようなファイルを作る
      • 再利用できるようなライブラリを作る
    • 再利用ファイルの読み込みはインクルードと呼ばれ、ソースファイルに書く。そのインクルードされるべきファイルのパスを指定するのが、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++を使う場合と違うことに注意)
      • これも参考…ヘッダファイルの書き方がわからない…
      • 作ったライブラリを使ってコンパイルする