C言語

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内, 検索
C言語
パラダイム 手続き型
登場時期 1972年
設計者 デニス・リッチー
開発者 ベル研究所
型付け 弱い静的型付け
主な処理系 GCCMSVC
影響を受けた言語 B言語ALGOL
アセンブリ言語Pascal
影響を与えた言語 awkcshC++Objective-CD言語JavaJavaScriptLimbo
テンプレートを表示

C言語(Cげんご)は、1972年AT&Tベル研究所デニス・リッチー (Dennis M. Ritchie) が主体となって作ったプログラミング言語である。英語圏では単に C と呼称されており、日本でも文書や文脈によっては同様に C と呼称される。

UNIXの移植性を高めるために開発された経緯から、オペレーティングシステムカーネル向けの低レベルな記述ができることを特徴としている。

目次

[編集] 特徴

Cは手続き型言語であり、コンパイラ言語として設計された。Cは、自由度、実行速度、コンパイル速度などを追求したが、代わりにコンパイル後のコードの安全性を犠牲にもしているので、コンピュータ寄りの言語仕様になっている。

  • アマチュアからプロのエンジニアまで、非常にプログラマ人口が多い。Cは正負の両面含めてコンピュータの世界に大きな影響を及ぼしているが、最大の原因はそのプログラマ人口の多さであると言われている。
  • パソコンはもちろんのこと、組込み用マイコンから大型コンピュータまで、Cを使用できるプラットホームは多様である。また、仕様規格・派生言語も多い。
  • 採用されているソフトウェア分野が広い。あらゆる分野に対してある程度の言語適性があり、現実的な選択肢としてよく用いられる。発祥元であるUNIXの場合、大抵のことがスクリプト言語マクロプロセッサフィルタやそれらの組み合わせで処理できるため、うまく分野の棲み分けができていた面があったのだが、幅広い領域に移植された結果、適切でない分野にCが使われている場面もある。
  • 低水準な記述が出来る高級言語とも、高級言語の顔をした低級言語とも言われる。また、コーディング上の“自由度”が非常に高い。そのため良くも悪くも“何でも出来てしまう”パワフルさは多くのプログラマの支持を集める一方で、セキュリティー脆弱性や潜んだバグによる想定外の動作、コンパイラによる最適化の難しさ(そのためCはコンパイラ言語として決して高速ではない)といった欠点の原因ともなっている。
  • 商用・非商用を問わずコンパイラやC向けのエディタが豊富で開発環境が整備しやすい。

Cの主な特徴は以下の通りである(歴史的な経緯からBASICPascalと比較されることが多い)。

[編集] 自由度

  • 行番号を採用せず文の区切りを区切り記号 ; セミコロン で表し、改行文字にも空白にもトークンの区切りとしての意味しか持たせない「フリーフォーマット」という形式を採用している。
    • 記述作法について、しばしば議論の対象となり、本も多数出版されている。
  • ALGOLの思想を受け継いで構造化をサポートしており、手順を入れ子構造で示して見通しの良い記述をすることができる。原理的に無条件分岐goto文)を使用する必要が軽減されるため、スパゲティプログラムと呼ばれるような読みにくいプログラムになりにくい。
  • モジュール化ファイルを単位として可能。モジュール内だけで有効な名前を使うことが出来る。(スコープ
  • プログラムを関数戻り値つきのサブルーチン)に分離できる。関数の中では独立した変数が使用でき、データの流れがブロックごとに完結しデバッグが容易になる。また、多人数での共同開発の際にも変数名の衝突が回避できる(これらもCで始まったアイデアではない)。なおCではメインルーチンも関数の一つ(main関数)となっているため、プログラム中で再帰的にmain関数を呼ぶことも可能。(C++では不可能[1][2]
  • OS記述言語として設計されたため、高級言語であるがアセンブラ的な低レベルの操作ができる。ポインタ演算、ビットごとの論理演算、シフト演算などの機能を持ち、ハードウェアに密着した処理を効率よく記述できる。これはOSやドライバなどを記述する上では便利であるが、注意深く利用しないと発見しにくいバグの原因となる。
  • 配列とポインタとでは、宣言の仕方と領域確保の仕組みは異なっているが、配列アクセスそのものは、ポインタ演算および間接参照と同等である。
    • ポインタを配列表記でアクセスすることや、配列をポインタ表記でアクセスすることができる。(糖衣構文と呼ばれるもののひとつ)
  • ソースコードの記述に使われる文字セットはASCIIを標準としているが、他のISO 646でも書けるように、トライグラフと呼ばれる表記法も存在する。

[編集] アセンブラとのインターフェース

  • 多くの処理系がインラインアセンブラを搭載しているほか、アセンブラで出力したオブジェクトとのリンクが容易になっている。これにより速度が要求される部分だけをアセンブリ言語で記述するということが容易に行えることが多い。もっとも、アセンブラとのインターフェースに統一された仕様はなくCPUやOSなどが同一であっても移植性は低い。
  • RISC CPUには、アセンブラでの記述が難しく、Cでの記述を前提とするものも多い[要出典]

[編集] コンパイラ仕様

  • コンパイラの処理が1パスで済む仕様になっている。具体的には、変数はその使用より前に宣言をする必要があり、関数は宣言がないとint型が適用されるなど。(後継言語では記述によって先読みが必要になりうる)
  • 標準でマクロ記述やコンパイル条件の指定が出来るプリプロセッサを持ち (C Preprocessor) 、その名の通りコンパイル処理の前に実行される。

[編集] 処理系の簡素化

配列参照時の自動的な添字のチェックをしない
これを要因とする代表的なバグがバッファオーバーフロー(固定長のバッファをはみだして上書きが行われてしまう)である。標準ライブラリにはバッファオーバーフローを考慮していない関数があり、かつ多用されがちなため、しばしば脆弱性の原因となる。また、プログラムにより制御する事で可変長配列を可能にしている。
文字列を格納するための特別な型が存在しない
文字列にはchar型の配列やポインタを利用する。言語仕様上に特別な扱いはないが、ナル文字(ヌル文字、'\0')を終端とする文字列表現を使い、その操作をする標準ライブラリ関数が提供されている。これは実質的にメモリ領域のポインタアクセスそのもので、バッファオーバーランの元凶の1つとなっている。後継言語では文字列処理が特に強化されている場合が多い。
自動変数の自動的な初期化をしない
自動変数(静的でないローカル変数)は変数の中でも最も頻繁に用いられる。初期化しない変数の初期値は不定である。変数宣言・初期化の仕様による制限から、変数宣言の時点で初期化せず後で代入することで初期化に代えることが日常的で、誤って不定の値の変数を読み出すバグを作り込みやすい。なお自動変数の自動とは変数の領域の確保と開放が自動であるという意味であり、自動的に初期化されるという意味ではない。

[編集] その他

  • 文字の大文字・小文字が区別される。
  • 入出力を含め、ほとんどの機能をC自身で書かれたライブラリが提供する。すなわち、I/O関係は言語の外にある。このことは、Cが機種依存性が低い、I/O関係ライブラリをのぞいた部分は移植性(ポータビリティ)が高いことを意味する[要出典]。さまざまな機種があるUNIXの世界でCが普及した理由の1つである。
  • プログラムの実行に必要とするハードウェア資源が、(アセンブラよりは多いが)他の高級言語より少なくてすむため、現在さまざまな電化製品などの組み込みシステムにも使用されている。

[編集] コード例

Hello worldプログラム

CのHello worldプログラムには、入門書によって趣が異なるいくらかのバリエーションが存在する。Cライブラリのprintf関数を利用したものが最も一般的で、以下のようなものである。

#include <stdio.h>
 
int main(void)
{
  printf("Hello, World!\n");
  return 0;
}

ちなみにサンプルソース中の「\n」は改行を表す。 なお、printf関数は変数や書式化された文字列などが表示できる比較的高機能な出力関数である。

Cライブラリに含まれる、より単純なputs関数を用いた例を下に示す。

#include <stdio.h>
 
int main(void)
{
  puts("Hello, World!");
  return 0;
}

また、Cの仕様から言えば、puts関数に渡している引数は文字列ではなく文字列へのポインタである。引数に明示的に文字列へのポインタを指定した例を下に示す。

#include <stdio.h>
 
int main(void)
{
  char *str = "Hello, World!";
  puts(str);
  return 0;
}

文字列をchar型へのポインタではなく配列として扱った例を示す。

#include <stdio.h>
 
int main(void)
{
  char str[] = "Hello, World!";
  puts(str);
  return 0;
}

このように、Cの自由度の高さから多様な記述のHello World!プログラムが存在しうる。

[編集] 主な制御構造

[編集] 主な標準ライブラリ関数


[編集] 歴史

[編集] 誕生

Cは、AT&Tベル研究所のケン・トンプソン (Ken Thompson) が開発したB言語を改良して作られた(#外部リンクの「The Development of the C Language」参照)。

1973年、トンプソンとUNIXの開発を行っていたデニス・リッチー (Dennis MacAlistair Ritchie) はBを改良し、実行可能な機械語を直接生成するCコンパイラを開発した。UNIXは大部分がCによって書換えられ、その後にCは広く利用されるようになった。

[編集] UNIX環境とC

アセンブラとの親和性が高いためにハードウェアに密着したコーディングがやりやすかったこと、言語仕様が小さいためコンパイラの開発が楽だったこと、小さな資源で動く実行プログラムを作りやすかったこと、UNIX環境での実績があり、後述のK&Rといった解説文書が存在していたことなど、さまざまな要因からCは業務開発や情報処理研究でのシェアを増やしていった。特にメーカー間でOS・CPUなどのアーキテクチャが違うUNIX環境では再移植の必要性がしばしば生じて、プログラムをCで書いてソースレベル互換を確保することが標準となった。

[編集] パソコンの歴史とC

1980年代にROM-BASICを搭載するパーソナルコンピュータ(パソコン)が普及してBASICで初めてプログラミングに触れるプログラマが世界的に多数を占めるようになった。これらのパソコンの主流がROM-BASIC搭載機からMS-DOS実行機に移った1980年代後半には、当時パソコン向けのコンパイラとしては安価な2万円前後のコンパイラが存在した(Turbo C等)ことなどから、ユーザーが急増した。8ビットや8086系のパソコンへの移植は、ポインタなどに制限や拡張を加えることで解決していた。

[編集] 現在のC

1990年代中盤以降は、最初に学ぶプログラミング言語としても主流となった。GUI環境の普及とオブジェクト指向の普及によりC++JavaVisual Basic、各種スクリプト言語のシェアも増加したため、広く利用されるプログラミング言語の数は増える傾向にあるが、現在でもCは比較的移植性に優れた言語であり、業務用開発やフリーソフトウェア開発、C++などの実装が困難な組み込みなどの小規模のシステムで、幅広く利用されている。

[編集] Cの規格

[編集] K&R

1978年に出版された、リッチーとカーニハンの共著である「The C Programming Language」(いわゆる「K&R」)は、その後標準化がなされるまで実質的なCのリファレンスとして使用された。しかし、「The C Programming Language」の記述にはいくつか曖昧な部分が存在していた。そのため、Cが普及するに従い、互換性のない処理系が数多く誕生することとなった。

[編集] C89

そこで、ISOANSIは協同でCの規格の標準化を進め、1989年12月にANSIのANSI X3.159-1989, American National Standard for Information Systems -Programming Language-C が、1990年12月にISOの INTERNATIONAL STANDARD ISO/IEC 9899 : 1990(E) Programming Languages-C が発行された。ISO規格のほうが章立てが追加されており、その後ANSIもISO規格にならって章立てを追加した。それぞれ C89(ANSI C89)及びISO C90 という通称で呼ばれることがある。

日本では、これを翻訳したものが日本工業規格『JIS X3010-1993 プログラム言語C』として、1993年10月に制定された。

最大の特徴は、C++と同様の関数プロトタイプを導入して引数の型チェックを強化したことと、voidやenumなどの新しい型を導入したことである。一方、処理系に依存するとするに留めた部分も幾つかある(int型のビット幅、char型の符号、ビットフィールドエンディアン、シフト演算の挙動、構造体などへのパディング、等)。

また、型の大きさは厳密に決められてはおらず、バイト数はsizeof演算子で取得し、最大最小値はlimits.hで参照することとされている。もっとも、多くの処理系ではchar型は8ビット、short型は16ビット、long型は32ビットである。またAPIなどの呼び出しには、ヘッダでBYTEやWORDなどとtypedefした型を使用して回避するのが一般的になっている。char型以外で符号を明示しない場合はsignedになる。

規格上には、コメントのネストや、BCPL・C++タイプの一行コメント(//)は無いが、オプションでサポートした処理系も多い。

GNU C コンパイラを使って、C89規格に準拠したコンパイリングを行うことができ、下記のようにオプションを指定すれば良い。

$ gcc -ansi -pedantic -Wall -Wextra -Wstrict-prototypes \
 -Wmissing-prototypes -Wmissing-declarations \
 -fstrict-aliasing -Werror  my_program.c

[編集] C95

主として英語圏での利用を想定して制定されたC89に対して、主に国際化のためワイド文字版ライブラリを追加したAmendment1が1995年に発行された。

[編集] C99

1999年12月には、ISOで規格の改定が行われ、C++の機能のいくつかを取り込むことを含めた機能拡張がなされ ISO/IEC 9899:1999(E) Programming Language--C (Second Edition) が制定された。この版のCの規格を、通称としてC99と呼ぶ。

主な追加機能:

  • 変数宣言がブロックの先頭でなくても良くなった。
  • _Bool 型(予約語)が追加になり、#include <stdbool.h> により、bool 型が使えるようになった。
  • 64ビット整数値を保持できる long long int 型の追加。
  • // による1行コメント。
  • インライン関数(inline キーワード)。
  • 可変長配列(alloca 関数の代替)。


Intel C++ Compiler、GNU Cコンパイラ(gcc)などでC99がサポートされている。

日本では、日本工業規格 JIS X 3010:2003「プログラム言語C」がある。

[編集] 主なC処理系

現在はC/C++兼用となっている処理系が多い。

[編集] Windows,Linux,Unix用

Microsoft Visual C++
Windows系プラットフォーム用のC,C++,C++/CLI コンパイラ。C99は未サポート。x86,x64が主だがXbox 360, WindowsCE 等向けに PowerPC,ARM,MIPS,Itanium 等をサポートしたバージョンもある。以前(MS-DOS,Win16の頃)は MS-C の名だった。
GNUコンパイラコレクション (GCC)
C/C++以外の言語もサポートし、多数のCPUやOSに対応、組み込み向けも含む多様な開発に広く使われるオープンソースのコンパイラ。
clang
LLVM をバックエンドとして用いるオープンソースのC/C++/Objective-C コンパイラ。多数のCPUに対応。
Intel C++ Compiler
Intel製のx86,x64用C/C++コンパイラ。Windows/Linux/OS X向けがある。gcc 互換。
C++ Builder, Borland C/C++, Turbo C/C++
Windows用のx86 C/C++コンパイラ。C99は未サポート。過去MS-DOS用もあった。
Digital Mars C/C++
WindowsMS-DOSDOSエクステンダをターゲットとするx86用 C/C++コンパイラ。フリーソフト版もある。ウォルター・ブライト作で Datalight C,Zorland C,Zortech C/C++,Symantec C/C++ と変遷している。
Open Watcom C/C++
WindowsLinuxOS/2MS-DOSDOSエクステンダをターゲットとするx86用 C/C++コンパイラ。商用だったWatcom C/C++ がオープンソース化したもの。
Portable C Compiler
gccが普及する以前のunixにおける標準的 Cコンパイラ。現在はオープンソース

[編集] 組み込み用、8ビット・16ビットCPU用

CodeWarrior C/C++
組み込み向けやゲーム機開発向けのC/C++コンパイラ。Mac OS(68K,PowerPC)用として発祥、かっては Windows や BeOS,Palm開発用もあった。
LSI C
8080Z80用のLSI C-80(セルフ版・クロス版。現在はクロス版のみ)と、8086用のLSI C-86がある。8086では機能限定(スモールモデルのプログラムしか開発できず、デバッガがない)の「試食版」がフリーソフトで公開され、広く使われた。試食版は『C MAGAZINE』(2006年4月号で休刊)の付録フロッピーディスクCD-ROMにも収録されていた。
High C
元はx86向けでPC/AT互換機用だが80386のネイティブモードに対応したためFM TOWNSでも標準開発環境、「High C 386」として使用された。現在は各社RISC向け。
Lattice C
1980年代に、日本で高い普及率を見せたコンパイラ。解説書も多く出版されていた。日本での発売はライフボート。初期版はマイクロソフトCコンパイラ1.0として発売された。商用利用のできない個人向けの「personal」版も販売されており、これの価格は19800円であった[3][4]
Hitech-C
Z80PICなど。
IAR-C/C++
新旧の組み込み向けCPU各種を広くカバーする。現在は統合開発環境EW・SWに移行。
C compiler PRO68K
X68000用のK&R系Cコンパイラ。通称XC。X-BASICをコンパイルすることも可能だった。
BDS-C
CP/M(8080・Z80)用のサブセット(整数のみ)のK&R系 Cコンパイラ。現在はパブリックドメインソフトウェア
Quick C
MS-Cの廉価版[5]Visual C++ の Standard Edition に置き換わった[6]

[編集] 関連するプログラミング言語

[編集] 先祖

ALGOL
ヨーロッパ生まれのアルゴリズム記述言語。PascalやC言語などに影響を与えたとされる。
BCPL
MULTICSで作成された高級言語。
B言語
初期のUNIXで作成されたインタプリタ方式の高級言語。BCPLを元に作られ、Cの原型となった。

[編集] 拡張

C++
Cを拡張してオブジェクト指向化したもの。当初はCのスーパーセットだったが、現在は互換性は失われている。
Objective-C
Cを拡張してオブジェクト指向化したもの。CにSmalltalkのオブジェクトシステムを取り付けたような設計で、互換性は保たれている。Cからの拡張部分がC++と干渉しないため、C++と混在した記述が可能。
Cg
CをGPUでのグラフィック処理用に特化させたもの。NVIDIAによって開発された。
Cyclone
Cの上位互換セキュア実装。ポインタの扱い厳格化して安全面に配慮して拡張したもの。その他リージョンベースメモリー管理システム、正規表現、タグ付共用体などを追加している。

[編集] 関連

Pascal
教育向けの構造化言語の一つで、Cより先行して普及した。
Java
仮想機械方式のオブジェクト指向言語。
C#
仮想機械方式のオブジェクト指向言語。C・C++との互換性はない。Microsoftによって開発された。
D言語
Cの後継を目指している言語の一つ。C・C++との互換性はない。

[編集] 参考文献

2010年現在では、初心者向けのイラスト入り入門書やサブルーチンのサンプル集の他、組み込み機器の制御や科学技術計算など目的を特化した専門書なども多数発行されているので、学習者のレベルや目的にあった本を見つけるのが容易な言語の一つでもある。

プログラミング言語C Brian Kernighan、Dennis M. Ritchie著 石田晴久共立出版
K&R として知られているThe C Programming Language の邦訳。学習書ではなく言語の仕様書に近く、この本のみでの学習は難しい。
はじめてのC 椋田實著 技術評論社
1985年から改訂しつつ発行されている入門書。平易な内容とは言い難いが、駄洒落な題名と出版された当時は数少ないC言語の入門書だったため、初期からの利用者を中心に根強い人気がある。

[編集] 外部リンク

[編集] 脚注

  1. ^ ISO/IEC 14882:2003 3.6.1 "The function main shall not be used within a program."
  2. ^ JIS X 3014:2003 3.6.1 "関数mainは、プログラムの中で挙用してはならない。"
  3. ^ 脇英世(監修)、1987、『パソコンの常識事典』、日本実業出版社  339, 342. - 普及率、解説書の多さについて。
  4. ^ 長沢英夫(編)、1988、『パソコンベストソフトカタログ』、JICC出版局  201. - Personal版、解説書の多さについて。
  5. ^ “Microsoft Releases C Program Wares, Provides Rebates”. InfoWorld: p. 29. (November 9, 1987). http://books.google.pl/books?id=Sj0EAAAAMBAJ 
  6. ^ “Visual C++ adds Windows support”. InfoWorld: p. 17. (February 22, 1993). http://books.google.pl/books?id=vjsEAAAAMBAJ 
個人用ツール
名前空間
変種
操作
案内
ヘルプ
ツールボックス
他の言語