OSS開発ツール/コンパイラ

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動

コンパイラー[編集]

GCC[編集]

Wikipedia
Wikipedia
ウィキペディアGNUコンパイラーコレクションの記事があります。

GNU Compiler Collection(GCC)は、GNUプロジェクトが開発した最適化コンパイラーで、さまざまなプログラミング言語(C言語C++FortranJavaAda etc.)、ハードウェア・アーキテクチャー、オペレーティングシステムに対応しています。フリーソフトウェア財団(FSF)は、GCCをGNU General Public License(GNU GPL)の下、フリーソフトウェアとして配布しています。GCCは、GNUツールチェーンの重要なコンポーネントであり、GNUおよびLinuxカーネルに関連するほとんどのプロジェクトの標準的なコンパイラーです。

LLVM/Clang[編集]

Wikipedia
Wikipedia
ウィキペディアLLVMの記事があります。

LLVMは、あらゆるプログラミング言語のフロントエンドと、あらゆる命令セットアーキテクチャーのバックエンドを開発するために使用できる、コンパイラーとツールチェーンの集合体です。

Wikipedia
Wikipedia
ウィキペディアClangの記事があります。

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

  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」を生成します[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

脚註[編集]

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