コンパイラー

編集

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の比較をいくつか挙げてみます。

  1. 速度: Clangは、コンパイル時間の面でGCCよりも高速です。特に大規模なプロジェクトでは、ClangがGCCよりも効率的であることがあります。
  2. エラーメッセージ: Clangは、よりわかりやすく、詳細なエラーメッセージを生成します。これは、開発者が問題をより早く修正できるようにするために役立ちます。
  3. 規格準拠: Clangは、C++11およびC++14の規格により準拠しています。GCCもこれらの規格に準拠していますが、Clangの方がより厳密に遵守しているとされています。
  4. 機能拡張: GCCは、多くの機能拡張をサポートしており、柔軟性が高く、カスタマイズが可能です。一方、Clangは、機能の追加や改善をより簡単に実現できるように設計されています。
  5. ライセンス: GCCはGNU General Public License(GPL)でライセンスされており、GCCに変更した場合、変更箇所を開示する必要があります。一方、Clangは、University of Illinois/NCSA Open Source Licenseでライセンスされており、商用ソフトウェアに自由に使用することができます。
以上のように、GCCとClangにはそれぞれ長所があります。どちらを使用するかは、プロジェクトのニーズによって異なります。しかし、両方とも高品質のコンパイラであり、多くの開発者にとって、どちらを選んでも遜色ない結果を得ることができます。

使用例

編集

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)です。
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

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!
$
hello.cob
      IDENTIFICATION DIVISION.
      PROGRAM-ID.  HELLO-WORLD.
      PROCEDURE DIVISION.
          DISPLAY "Hello, world!".
          STOP RUN.
コンパイル
$ cobc hello.cob -o hello

Likewise

脚註

編集
  1. ^ プラットホーム独自のルールで、 hello.com や hello.exe のファイル名で実行ファイルが生成されるかもしれません。
  2. ^ MS-DOSのCOMMAND.COMやWindowsのCMD.EXEは、環境変数PATHの内容に関わらず実行ファイル検索パスに . が含まれているので、./ を 補う必要はありませんが、PS(PowerShell)の場合は、./ でカレントディレクトリーにある事を明示する必要があります(PATHにカレントディレクトリーを追加することはセキュリティー上避けるべきです)。
このページ「OSS開発ツール/コンパイラ」は、まだ書きかけです。加筆・訂正など、協力いただける皆様の編集を心からお待ちしております。また、ご意見などがありましたら、お気軽にトークページへどうぞ。