GNUツールチェインに関する世界観です。libcやMakeやUNIXシステム管理も参照のこと。
GNUによるコンパイラ。
Wikipedia
ソースコード
gccはC言語のコンパイラ。Cも参照のこと。
例:
gcc -o hoge hoge.c
hoge.cをコンパイル・リンクして、実行ファイルhogeを作成する。
g++はC++のコンパイラ。C++も参照のこと。
C++の場合:
g++ -o hoge2 hoge2.cpp
詳しくは以下を参照のこと。
gfortranはFortranのコンパイラ。FORTRANも参照のこと。
GCCではFortranもコンパイルできる:
gfortran hoge3.f90
詳しくは以下を参照のこと。
このほか、GCCではObjective-C、Ada、Go、Dなどをコンパイルできる。Objective-CやGoも参照のこと。
また、GCCのフロントエンドとして、PascalをコンパイルできるGNU Pascalコンパイラが知られています。Pascalを参照のこと。
自分の書いたブログ「神々とともに生きる詩人」2021/02/08より。
基本は
gcc -o hoge hoge.c
デバッグ情報を付加してhoge.oとlibm.aをリンクする場合は以下のようにする(ライブラリlibmをリンクする時はlibを削除して-lmとする):
gcc -g -o hoge -lm hoge.o
gccのデフォルトの最適化は-O2。-O3とするとより強固な最適化をする。
gcc -Eでプリプロセスのみを行う。gcc -Sでアセンブリ言語までを出力する。gcc -cでオブジェクトファイルまでを出力する。
UNIXシステム管理(2.コンパイラ)も参照のこと。
-Wallで警告オプションをすべて有効にできる。
-g3とすると、デバッグ情報の付加に加え、gdbでマクロも使えるようになる。
-Lや-Iを使うことで、ライブラリやインクルードヘッダを別のディレクトリから探せるようになる。
オプション | 説明 |
---|---|
-c | ソースファイルのコンパイルのみを行う。(オブジェクトファイルを作成する。) |
-o hoge.o | ソースファイルをコンパイルしてその結果をhoge.oとする。 |
-O0 | 最適化をすべて無効とする。 |
-O1 | 特定の最適化を無効とする。 |
-O2 (または -O) | 標準の最適化を行う。デフォルト設定。 |
-O3 | 標準よりも強力な最適化を行う。 |
-g | 吐き出されるバイナリにデバッグ情報を付加する。 |
-g3 | 吐き出されるバイナリにデバッグ情報を付加する。gdbでマクロも使えるようになる。 |
-Wall | コンパイル時に警告されるすべての警告オプションを有効にする。 |
-lm | ライブラリとリンクを行う。mはライブラリの名前(libm.a)を意味する。 |
-Ldir | ライブラリを探すための場所となるディレクトリを追加する。 |
-Idir | ヘッダファイルを探すための場所となるディレクトリを追加する。 |
共有ライブラリ・ヘッダファイルについてはLinux 共有ライブラリやLinux ヘッダファイルを参照のこと。
gccを使う際の注意点として、ソースファイルやライブラリの名前を並べる際に、必ず、関数を使うソースファイルが前で、関数が使われるソースファイルが後になるように引数を書かないといけない。
なので、もしlibmの関数を使うmain.cファイルがあるとしたら、
gcc -o hoge main.c -lm
とする。-lmをmain.cよりも先に書いてはいけない。
(ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道を参考に執筆しました。)
gccリンク集:
Linux 共有ライブラリとLinux ヘッダファイルとUNIXシステム管理(2.コンパイラ)を参照のこと。
GCCは、「フロントエンド - 最適化部(中間コード) - バックエンド」という設計をしている。
機構 | 説明 |
---|---|
フロントエンド | さまざまなプログラミング言語を中間コードに変換する。 |
バックエンド | 中間コードをさまざまなプラットフォームやCPUのアセンブリ言語に変換する。 |
こうすることによって、フロントエンドとバックエンドの部分を開発するだけで、さまざまなプログラミング言語とさまざまなCPUプロセッサ向けの機械語に対応できる。
フロントエンドを作るだけで新しいプログラミング言語(自作のプログラミング言語の場合も含む)にも対応でき、バックエンドを作るだけで新しいCPUプロセッサに対応できる。
そのため、新しいプログラミング言語を作りたい場合は、GCCのフロントエンドだけを開発すれば良い。
フロントエンドは構文解析のbisonや字句解析のflexというツールが使われている。
GCCでは、中間形式としてRTLを使用し、段階的に中間コードを作成・最適化する。
GCC 4から、GENERICとGIMPLEの2種類の新しい中間形式が追加された。まず、GENERIC(フロントエンドのツリー構造を保持したままの形式)→GIMPLE(ツリーの最適化SSAを行うための形式)→その後にRTLの最適化となる。
中間コードと最適化については、Wikipediaの記事が参考になる。
GCCはmacOSでも動かすことができ、Xcodeを導入すると自動的にgccがインストールされる。
また、Windows版としてMinGWがあり、Visual Studioの代替C/C++コンパイラとして利用できる。
以下の書籍が参考になります。
クロスコンパイルとは、組み込みシステムなどで、x86のパソコンから別のCPUアーキテクチャ向けのバイナリ実行ファイルを出力すること。
PowerPC向けのクロスコンパイルを行いたい時は、「--target=powerpc-elf」をつけてgccやbinutilsをビルドし、できたpowerpc-elf-gccコマンドでCのソースファイルをコンパイルすればよい。
$ powerpc-elf-gcc -nostdlib -g -O hoge.c
のようにビルドする。gccやbinutilsをビルドする際、targetを変えるだけで別のアーキテクチャ向けにビルドできる。
CPUアーキテクチャやPowerPCや移植性も参照のこと。
LLVM/Clangは新しいC/C++など向けのコンパイラ。gccを置きかえるのではないかと期待されている。Linuxでも使えるし、Macや*BSDなどでも最近使われるようになってきている。
LLVM/Clangも参照のこと。
コンパイラを作る時に使われる技術。字句解析器・構文解析器を自動作成する。
lexのGNUによる実装がflex、yaccのGNUによる実装がbison。
lexとyaccを上手く使うことで、プログラミング言語を手軽に自作することができる。
コンパイラ開発も参照のこと。
GNUを参照のこと。
libcを参照のこと。
デバッグ(gdb)を参照のこと。
Gentooも参照のこと。
バイナリ(オブジェクトファイル)系のユーティリティ。たとえば、アセンブラasやリンカldが含まれる。
GNUで翻訳のために使われているライブラリ。
Wikipedia
ソースコード
UNIXシステム管理(タイムゾーンとロケール)を参照のこと。
m4はマクロ言語で、Sendmailの設定ファイルやautoconfなどで使われている。
groffはGNUによるroff/troff形式のドキュメントの実装。manページの整形に使われている。
TexinfoはGNUによるinfoページに使われているドキュメント形式。ノードを分けてリンクからアクセスすることができる。
Linuxコマンド(ドキュメント)やXMLと文書形式を参照のこと。
僕の持論として、「コンパイラだけはフリーでなければならない」というのがあります。
それは、「プログラミングは、万人に手段が平等に与えられるものでなければ、万人がコンピュータを使ってプログラミングすることができない」からです。
Windowsのフリーソフトには、Visual C++で作られたソフトウェアが多いですが、この場合、ソースコードをコンパイルしたり、自分で作ったり開発に参加するためには、Visual C++を買わなければなりません。
たとえ、ソフト自体がフリーであっても、それを作るための手段はフリーではないのです。
GNUというプロジェクトが、コンパイラなどの開発ツールから始まり、GNU OSが実用化される以前から、「フリーなコンパイラ」として有名だったのは、その理由があると思います。みんな、開発ツールがフリーでほしかったのです。だから、GNUはGNU OSが完成する前から、UNIXで使える開発ツールとして有名になったのでしょう。そして、さまざまな人間に改良され、Linuxカーネルの開発者がLinuxの上でのコンパイラや標準のツールなどとして使うに至ったのでしょう。
コンパイラがフリー(無料)であることは、教育においても良い効果を発揮します。誰もが、コストを支払わずにプログラミングの勉強や入門ができます。また、自由という側面で言えば、ソースコードが公開されているため、ただWindows APIを使うだけではなく、自分でコマンドやライブラリのソースコードを見ることができます。これはプログラミングの学習環境として、とても優れています。Pythonなどもオープンソースですが、コンパイルした実行ファイルを簡単に再配布できる、という点で言えば、コンパイル言語の優位性も依然としてあるでしょう。ですが、Linuxをインストールせず、Windowsのままで実行ファイルが作れる、Windows APIやVisual C++のライブラリを完備した互換コンパイラとライブラリがあれば良いのですが、そこまですると、逆にMicrosoftの開発意欲を損ねてしまうでしょう。
本当は、コンパイラが有料であることは良い側面もあります。コンパイラは、プログラミング界でもっとも作るのが難しいソフトウェアのひとつです。オープンソースでは作れない領域でも、Microsoftなら作れるでしょう。ですが、PHPやRubyを見るように、言語処理系の流行はオープンソースの機運に乗っているように思います。Rustなどが最たる例でしょう。
後日注記:MicrosoftはWindowsに標準でVisual Studioを含めるようにすれば良いと思います。短期的な利益は少なくなるかもしれませんが、Windowsアプリケーションを開発する人が増えて、Windowsエコ・システムは拡大し、Windowsアプリケーションは豊かになるでしょう。
C/C++など、多言語に対応したフリーのコンパイラ集。
Emacs電子書棚さんというサイトが、GNU関連のツールやEmacsの情報としてとても参考になります。