OSS開発ツール/コンパイラ
コンパイラー[編集]
GCC[編集]
GNU Compiler Collection(GCC)は、GNUプロジェクトが開発した最適化コンパイラーで、さまざまなプログラミング言語(C言語、C++、Fortran、Java、Ada etc.)、ハードウェア・アーキテクチャー、オペレーティングシステムに対応しています。フリーソフトウェア財団(FSF)は、GCCをGNU General Public License(GNU GPL)の下、フリーソフトウェアとして配布しています。GCCは、GNUツールチェーンの重要なコンポーネントであり、GNUおよびLinuxカーネルに関連するほとんどのプロジェクトの標準的なコンパイラーです。
LLVM/Clang[編集]
LLVMは、あらゆるプログラミング言語のフロントエンドと、あらゆる命令セットアーキテクチャーのバックエンドを開発するために使用できる、コンパイラーとツールチェーンの集合体です。
Clang は、C、C++、Objective-C、Objective-C++の各プログラミング言語と、OpenMP、OpenCL、RenderScript、CUDA、HIPの各フレームワークに対応したコンパイラーフロントエンドです。バックエンドにはLLVMコンパイラーインフラストラクチャを使用しており、LLVM 2.6以降、LLVMのリリースサイクルに組み込まれています。
プロジェクトの目的は、GCCに代わるコンパイラーを提供することで、例えば gcc ⇒ clang あるいは、 g++ ⇒ clang++ と単純に置き換えることが出来ます[1]。
GCCとCalngの比較 |
GCCとClangは、両方ともC、C++、Objective-Cおよびその他の言語のコンパイラです。両方のコンパイラには、多くの類似点がありますが、いくつかの重要な違いもあります。
以下に、GCCとClangの比較をいくつか挙げてみます。
以上のように、GCCとClangにはそれぞれ長所があります。どちらを使用するかは、プロジェクトのニーズによって異なります。しかし、両方とも高品質のコンパイラであり、多くの開発者にとって、どちらを選んでも遜色ない結果を得ることができます。 |
使用例[編集]
C言語[編集]
- hello.c
#include <stdio.h> int main(void) { printf("Hello, world\n"); }
- コンパイル
$ gcc hello.c -o hello
上記のコマンドは、「hello.c」という名前のC言語のソースコードファイルから、実行ファイル「hello」を生成します[2]。
-o hello
「」は、「生成するファイルの名前を hello にせよ」という意味です。
ソースコード自体は、『メモ帳』などテキストエディターで作成します。GNU/Linuxならば vi や emacs などのテキストエディタで記述します。
作成した実行ファイル hello
の実行は
$ ./hello
のように、実行ファイル名の前に ./ 補い『カレントディレクトリーにある hello を実行せよ』という意味になります[3]。
コマンドのに渡すパラメーターの順序は重要です。
$ gcc ソースコード側のファイル名 -o 出力側のファイル名
のような順序になります。
なお、
$ gcc -o hello hello.c
と -o hello の項を先行させるのは問題ありません。 ただし、追加のライブラリー(典型的には libm ⇒ -lm)をリンクする場合ライブラリーの指定位置は重要で、
$ gcc -o mathapp mathapp.c -lm
の様に末尾に付ける必要があります。
GCCのヘルプは
$ gcc --help
で見ることが出来ます。
GCCには、上記ヘルプで紹介される以外にも様々な機能や引数があります。詳細は、
$ info gcc
を参照してください。
引数[編集]
gccでよく使われるオプションとして -I, -L, -l, -c, -o などがあります。
- -I
- インクルードするヘッダーを探すディレクトリーを指定します。
- -L
- リンクを行なうライブラリーファイルのディレクトリーを指定します。
- -l
- リンクするライブラリーの名前を指定します。静的ライブラリの名前はlibxxx.aとなっているので、ファイルを指定するときには-lxxxの形で指定します(動的ライブラリーがリンクされる場合の規則はコンパイラー・リンカーのマニュアルを参照してください)。
- -c
- 実行形式ではなく、オブジェクトファイルを作成する事を指示します。暗黙の実行ファイル名は a.aout ですが -c の暗黙のファイル名は .c を .o に置き換えたもの(例: xyz.c ならば xyz.o)です。
- -o
- 出力するファイル名を指定します。
- -O
- 最適化を行います。
- -g
- デバッグシンボル付きでコードを生成します。
- -S
- -o と似ていますが、オブジェクトファイルではなくアセンブリ言語のソースコードを生成します。暗黙のファイル名は .c を .s に置き換えたもの(例: xyz.c ならば xyz.s)です。
C++[編集]
- hello.cpp
#include <iostream> int main(void) { std::cout << "Hello, world" << std::endl; }
- コンパイル
$ g++ hello.cpp -o hello
Likewise
Fortran[編集]
FORTRAN 77[編集]
- hello.f
C2345678901234567890 PROGRAM Hello WRITE(*,*) 'Hello World!' STOP END
- コンパイル
$ gfortran hello.f -o hello
Likewise
Fortran 90[編集]
- hello.f90
program hello write(*,*) 'Hello, World!' end program hello
- コンパイル
$ gfortran hello.f90 -o hello
Likewise
Ada[編集]
- hello.adb
with Ada.Text_IO; use Ada.Text_IO; procedure Hello is begin Put_Line ("Hello WORLD!"); end Hello;
- コンパイル
$ gnatmake hello.adb $ ./hello Hello WORLD! $
COBOL[編集]
- hello.cob
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO-WORLD. PROCEDURE DIVISION. DISPLAY "Hello, world!". STOP RUN.
- コンパイル
$ cobc hello.cob -o hello
Likewise