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

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

コンパイラー[編集]

GCC[編集]

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
ウィキペディアLLVMの記事があります。

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

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]

使用例[編集]

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;
コンパイル
$ gcc hello.adb -o hello

Likewise

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開発ツール/コンパイラ」は、まだ書きかけです。加筆・訂正など、協力いただける皆様の編集を心からお待ちしております。また、ご意見などがありましたら、お気軽にトークページへどうぞ。