OSS開発ツール/コンパイラ
< OSS開発ツール
コンパイラー
編集OSSの開発に用いられるコンパイラーは、プロジェクトのニーズや開発者の好みによって異なります。
以下に、一般的なコンパイラーとそれぞれの主なユースケースをいくつか挙げます。
- GCC(GNU Compiler Collection)
-
- 主なユースケース:C、C++、Fortran、Adaなどのプログラミング言語で書かれたプロジェクトや、多言語のプロジェクトで広く使用されています。
- 特徴:広範囲な言語サポート、豊富な最適化オプション、多くのプラットフォームでのサポート。
- Clang
-
- 主なユースケース:C、C++、Objective-C、Objective-C++などのプロジェクトや、速度や静的解析などの特定のニーズを持つプロジェクトで使用されます。
- 特徴:高速コンパイル、豊富な警告メッセージ、静的解析ツールの統合、近代的なC++言語機能のサポート。
- LLVM Compiler Infrastructure:
- 主なユースケース:コンパイラーの開発、静的解析ツール、コード生成など、LLVMをバックエンドとして利用するツールやプロジェクトで使用されます。
- 特徴:モジュール化された設計、柔軟性、多様な最適化手法、複数の言語に対するサポート。
- Rust Compiler
-
- 主なユースケース:Rust言語で書かれたプロジェクトで広く使用されています。
- 特徴:メモリ安全性、スレッド安全性、並行性を強調し、安全性とパフォーマンスを両立させることに焦点を当てています。LLVMをバックエンドとして利用しています。
これらのコンパイラーは、それぞれ異なる特徴や利点を持ち、プロジェクトの要件や開発者の好みに応じて選択されます。
GCCとClangの比較
GCCとClangは、両方ともC、C++、Objective-Cおよびその他の言語のコンパイラです。両方のコンパイラには、多くの類似点がありますが、いくつかの重要な違いもあります。
以下に、GCCとClangの比較をいくつか挙げてみます。
- 速度: Clangは、コンパイル時間の面でGCCよりも高速です。特に大規模なプロジェクトでは、ClangがGCCよりも効率的であることがあります。
- エラーメッセージ: Clangは、よりわかりやすく、詳細なエラーメッセージを生成します。これは、開発者が問題をより早く修正できるようにするために役立ちます。
- 規格準拠: Clangは、C++11およびC++14の規格により準拠しています。GCCもこれらの規格に準拠していますが、Clangの方がより厳密に遵守しているとされています。
- 機能拡張: GCCは、多くの機能拡張をサポートしており、柔軟性が高く、カスタマイズが可能です。一方、Clangは、機能の追加や改善をより簡単に実現できるように設計されています。
- ライセンス: GCCはGNU General Public License(GPL)でライセンスされており、GCCに変更した場合、変更箇所を開示する必要があります。一方、Clangは、University of Illinois/NCSA Open Source Licenseでライセンスされており、商用ソフトウェアに自由に使用することができます。
使用例
編集C言語
編集- hello.c
#include <stdio.h> int main(void) { printf("Hello, world\n"); }
- コンパイル
$ gcc hello.c -o hello
上記のコマンドは、「hello.c」という名前のC言語のソースコードファイルから、実行ファイル「hello」を生成します[1]。
-o hello
「」は、「生成するファイルの名前を hello にせよ」という意味です。
ソースコード自体は、『メモ帳』などテキストエディターで作成します。GNU/Linuxならば vi や emacs などのテキストエディタで記述します。
作成した実行ファイル hello
の実行は
$ ./hello
のように、実行ファイル名の前に ./ 補い『カレントディレクトリーにある hello を実行せよ』という意味になります[2]。
コマンドのに渡すパラメーターの順序は重要です。
$ 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