C言語

C言語（シーげんご、）は、1972年にAT&Tベル研究所のデニス・リッチーが主体となって開発した汎用プログラミング言語である。英語圏では「C language」または単に「C」と呼ばれることが多い。日本でも文書や文脈によっては同様に「C」と呼ぶことがある。制御構文などに高水準言語の特徴を持ちながら、ハードウェア寄りの記述も可能な低水準言語の特徴も併せ持つ。基幹系システムや、動作環境の資源制約が厳しい、あるいは実行速度性能が要求されるソフトウェアの開発に用いられることが多い。後発のC++やJava、C#など、「C系」と呼ばれる派生言語の始祖でもある。
ANSI、ISO、またJISにより言語仕様が標準規格化されている。
特徴.
処理系の簡素化.
処理系の簡素化のため、以下のように安全性を犠牲にした仕様が多い。なお、ホスト環境やプログラムの内容によっては、以下に対して脆弱性対策を施したとしても実行速度の低下が無視できる程度であることも多く、言語仕様側の欠点とみなされることも少なくない。
コード例.
Hello worldプログラム.
C言語のHello worldプログラムは、ホスト環境を前提とするか、フリースタンディング環境を前提とするかで、方向性が異なる。ホスト環境を前提とする場合には、標準入出力の利用により、動作をすぐに確かめることができる。以下では、標準Cライブラリのヘッダcodice_12にて宣言されている、codice_13関数あるいはcodice_14関数を利用したものを例示する。
/* int puts(const char* s) を使う場合。 */
int main(int argc, char* argv[])
 puts("Hello, world!");
 return 0;
/* int printf(const char* format, ...) を使う場合。 */
int main(int argc, char* argv[])
 printf("Hello, world!\n");
 return 0;
上記サンプルソース中のエスケープシーケンス codice_15は改行（ラインフィード）を表す。
上記のコードでは main 関数を として定義したが、代わりに と書いてもよい。
Pythonのような言語と異なり、実行可能なプログラムを作成するには関数のようなエントリーポイントを定義する必要がある。また（"Hello world" プログラムでは利用しないが）変数の値を標準出力へ出力するには 関数より 関数の利用が適しているが、 は書式文字列中に指定できる変換指定子を処理するために などに比べて仕様が複雑なため、取り扱いに注意を要する。
歴史.
誕生.
C言語は、AT&Tベル研究所のケン・トンプソンが開発したB言語の改良として誕生した（#外部リンクの「The Development of the C Language」参照）。
1972年、トンプソンとUNIXの開発を行っていたデニス・リッチーはB言語を改良し、実行可能な機械語を直接生成するC言語のコンパイラを開発した。後に、UNIXは大部分をC言語によって書き換えられ、C言語のコンパイラ自体も移植性の高い実装のPortable C Compilerに置き換わったこともあり、UNIX上のプログラムはその後にC言語を広く利用するようになった。
ちなみに、「UNIXを開発するためにC言語が作り出された」と言われることがあるが、「The Development of the C Language」によると、これは正しくなく、経緯は以下の通りである。C言語は、当初はあくまでもOS上で動くユーティリティを作成する目的で作り出されたものであり、OSのカーネルを記述するために使われるようになるのは後の展開である。
UNIX環境とC言語.
アセンブラとの親和性が高いために、ハードウェアに密着したコーディングがやりやすかったこと、言語仕様が小さいためコンパイラの開発が楽だったこと、小さな資源で動く実行プログラムを作りやすかったこと、UNIX環境での実績があり、後述のK&Rといった解説文書が存在していたことなど、さまざまな要因からC言語は業務開発や情報処理研究での利用者を増やしていった。特にメーカー間でオペレーティングシステムやCPUなどのアーキテクチャが違うUNIX環境では再移植の必要性がしばしば生じて、プログラムをC言語で書いてソースレベル互換を確保することが標準となった。
C言語誕生時の環境と他言語との比較.
C言語の開発当初に使われた入力端末はであったことが知られている。
ASR-37は1967年制定の旧ASCII ISO R646-7bitにもとづいており、「codice_23」および「codice_24」の入力を行うことができたが、当時は一般的に使われていた入力端末ではなかった。
当時PDP-11の入力端末として広く使われていたのはASR-33であるが、これは1963年制定の旧ASCIIであるASA X3.4に準拠しており、「codice_23」や「codice_24」の入力を行うことはできなかった。
このことは、ブロック構造に「codice_23」や「codice_24」を用いるC言語（さらに元をたどればB言語）は、当時の一般的な環境では使用不可能であったことを示している。
これは、C言語はその誕生当初にあっては一般に広く使われることを想定しておらず、ベル研究所内部で使われることを一義的に考えた言語であったという側面の表れである。
これに対し、PascalやBASIC等の当初から広く使われることを想定した言語では、ブロック構造に記号を用いずにcodice_29とcodice_30をトークンとして用いることや、コメント行を表す際に開始トークンとしてcodice_31という文字列を用いることなど、記号入力に制約がある多くの入力端末に対応できるように配慮されていた。この頃の他の言語やOSで大文字と小文字の区別をしないものが多いのも、当時は大文字しか入力できない環境も少なくなかったことの表れである。
このような事情のため、C言語が普及するのは、ASCII対応端末が一般化した1980年代に入ってからである。
現在、ブロック構造の書式等で、codice_32形式のC言語と、codice_33等を使用する他の言語との比較において優劣を論じられることがあるが、開発時の環境等をふまえずに現時点での利便性のみで論じるのは適切ではない場合があることに留意が必要である。
PCとC言語.
1980年代に普及し始めたパーソナルコンピュータ (PC) は当初、8ビットCPUでROM-BASICを搭載していたものも多く、BASICが普及していたが、1980年代後半以降、16ビットCPUを採用しメモリも増えた（ROM-BASIC非搭載の）PCが主流になりだすと、Turbo CやQuick Cといった2万円程度の比較的安価なコンパイラが存在したこともあり、ユーザーが急増した。8ビットや8086系のPCへの移植は、ポインタなどに制限や拡張を加えることで解決していた。
現在のC言語.
1990年代中盤には、最初に学ぶプログラミング言語としても主流となった。また、同時期にはゲーム専用機（ゲームコンソール）の性能向上とプログラムの大規模化、マルチプラットフォーム展開を受け、メインの開発言語がアセンブラからC言語に移行した。
1990年代後半から2000年代以降は、PCのさらなる性能向上と普及、GUI環境やオブジェクト指向の普及、インターネットおよびウェブブラウザの普及、スマートフォンの普及に伴い、より高水準で開発効率の高い言語やフレームワークを求める開発者が増えたことにより、C++、Visual Basic、Java、C#、Objective-C、PHP、JavaScriptなどが台頭してきた。広く利用されるプログラミング言語の数は増加傾向にあり、相対的にC言語が使われる場面は減りつつある。特にアプリケーションソフトウェアなどの上位層の開発には、C言語よりも記述性に優れるC++、Java、C#などC言語派生の後発言語が利用されることが多くなっている。資源制約の厳しかったゲーム開発においても、ハードウェアの性能向上やミドルウェアの普及により、C++やC#などが使われる場面が増えている。速度性能や省メモリが特に重視されるシステムプログラミングに関しても、伝統的にC/C++の独壇場だったが、新規コードではより安全性の高いRustを導入する事例が現れている。
しかし、C言語は比較的移植性に優れた言語であり、個人開発／業務用開発／学術研究開発やプロプライエタリ／オープンソースを問わず、オペレーティングシステムやデバイスドライバーなどの下位層、クロスプラットフォームAPIの外部仕様、C++やJavaなどの高水準言語の処理系および実行環境の実装が困難な小規模の組み込みシステムなどを中心に、2021年現在でも幅広く利用されている。
プログラミング入門者にとっては、Python、JavaScript、Swift、Kotlinなどのように、インタラクティブな対話環境（REPL、インタプリタ）が利用でき、抽象化が進んでおり、煩雑なメモリ管理が不要で、危険な機能を制限した高水準言語のほうが学習・習得しやすいが、コンピュータの動作原理やハードウェア仕様を理解するには、Cのような原始的な言語を用いたほうがかえって分かりやすいケースもある。
規格.
K&R.
米国国家規格協会（ANSI）による標準化が行われるまで、1978年出版のデニス・リッチーとブライアン・カーニハンの共著『The C Programming Language』が実質的なC言語の標準として参照されてきた。C言語は発展可能な言語で、K&Rの記述も発展の可能性のある部分は厳密な記述をしておらず、曖昧な部分が存在していた。そのためC言語が普及するとともに、互換性のない処理系が数多く誕生した。
C89/C90.
そこで、ISO/IEC JTC1とANSIは協同で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/IEC規格のほうが章立てを追加しており、その後ANSIもISO/IEC規格にならって章立てを追加した。それぞれC89 (ANSI C89) およびISO/IEC C90という通称で呼ぶことがある。
日本では、これを翻訳したものを『JIS X 3010-1993 プログラム言語C』として、1993年10月に制定した。
最大の特徴は、C++と同様の関数プロトタイプを導入して引数の型チェックを強化したことと、codice_34やcodice_35などの新しい型を導入したことである。一方、「処理系に依存するものとする」に留めた部分も幾つかある（codice_6型のビット幅、codice_10型の符号、ビットフィールドのエンディアン、シフト演算の挙動、構造体などへのパディング等）。
規格では以下の3種類の自由を認めている部分がいくつかある。
これにより、プラットフォームやプロセッサアーキテクチャとの相性による有利不利が生じないような仕様になっている。
8ビット/16ビット/32ビットなど、レジスタ幅（ワードサイズ）の異なるプロセッサ (CPU) に対応・最適化できるようにするため、組み込み型の情報量（大きさ）や内部表現にも処理系の自由を認めている。型のバイト数はcodice_38演算子で取得し、各型の最小値・最大値はcodice_39で定義されているマクロ定数で参照することとしている。ただし、1バイトあたりのビット数は規定されていない。codice_40すなわちcodice_10型が1バイトであることは常に保証されるが、8ビット（オクテット）とは限らない。実際のビット数はcodice_42マクロ定数で取得できる。とはいえ、現実の多くの処理系ではcodice_10型は8ビットである。また、その他の整数型については、codice_44、codice_45、codice_46、という大小関係が定められているだけである（符号無し型も同様）。多くの処理系ではcodice_47型のサイズは2バイト（16ビット）であるが、codice_6やcodice_49のサイズはCPUのレジスタ幅などによって決められることが多い。codice_6型、codice_47型、codice_49型で符号を明示しない場合はcodice_53を付けた符号付き型として扱われる。しかしcodice_10型に関しては、codice_53（符号付き）にするか、それともcodice_56（符号無し）にするかは処理系依存である。codice_10型、codice_58型、codice_59型はそれぞれ異なる型として扱われる。
規格上には、BCPLやC++形式の1行コメント（codice_60）は無いが、オプションで対応した処理系も多く、gccやClangはGNU拡張codice_61でサポートしている。
GNU Cコンパイラ や Clang では、codice_62（またはcodice_63もしくはcodice_64）をつけることにより、GNU拡張を使わないC89規格に準拠したコンパイルを行うことができる。加えて、codice_65をつければ診断結果が出る。商用のコンパイラではWatcom Cコンパイラが規格適合の比率が高いと言われていた。現在Open Watcomとして公開している。
C89には、下記の追加の訂正と追加を行った。
C99.
1999年12月1日に、ISO/IEC JTC1 SC22 WG14 で規格の改訂を行い、C++の機能のいくつかを取り込むことを含め機能を拡張し、ISO/IEC 9899:1999(E) Programming Language--C (Second Edition) を制定した。この版のC言語の規格を、通称としてC99と呼ぶ。
日本では、日本産業規格 JIS X 3010:2003「プログラム言語C」がある。
主な追加機能：
C99は下記の訂正がある。
C11.
2011年12月8日に"ISO/IEC 9899:2011"（通称 C11）として改訂された。改訂による変更・追加・削除機能の一部を以下に記述する。
C11はUnicode文字列（UTF-32、UTF-16、UTF-8の各符号化方式）に標準で対応している。そのほか、codice_76式、C++と同様の無名構造体・無名共用体、排他的アクセスによるファイルオープン方法、quick_exitなどのいくつかの標準関数などを追加した。
また、codice_77関数指示子を追加した。codice_77は従来処理系ごとに独自に付加していた属性情報（たとえばgccではcodice_79）を標準化したもので、「呼び出し元に戻ることがない」という特殊な関数についてその特性を示すためにある。codice_20文を持たない関数という意味ではなく（規格ではcodice_20文を持たなくとも、関数の最後の文の実行が終われば制御は呼び出し元に戻る）、この指示が意味するものは、当該の関数、ないしその内部から呼び出している関数の実行中に、必ずcodice_82やcodice_83を実行したり、例外などで終了する、あるいは、codice_84による大域ジャンプで抜け出す、継続渡しスタイル変換されたコードである、などのために、絶対に制御が呼び出し元に戻らない、という関数を指示するためにある。そのような関数は、スタックに戻りアドレスを積む通常の呼び出しではなく、スタックを消費しないジャンプによって実行できる。
アラインメント機能、codice_85型やC言語ネイティブの原始的なスレッド機能などを省略可能な機能として規格に組み込んだ。また、C99では規格上必須要件とされていた機能のうち、複素数型と可変長配列を省略可能なものに変更した。これらの省略可能な機能はC11規格合致の必須要件ではないので、仮に完全に規格合致の処理系であっても、対応していないかもしれない。C11規格では、省略可能な機能のうちコンパイラがどれを提供しているかを判別するために利用できる、テスト用のマクロを用意している。
これにより、codice_86関数は廃止されている。
C17.
2018年に"ISO/IEC 9899:2018"（通称C17またはC18）として改訂された。仕様の欠陥修正がメインのマイナーアップデートである。
主なC言語処理系.
大抵の処理系はC言語とC++両方をサポートしている。C言語とC++の共通部分を明確にし、二つの言語の違いに矛盾が生じないようにすることが課題になっている。
関連する主なプログラミング言語.
継承・拡張・サブセット.
その他にも、OpenGLシェーダー言語であるGLSL、DirectX（Direct3D）シェーダー言語であるHLSL、OpenCLカーネル記述言語であるOpenCL-Cなど、C言語の文法的特徴を取り入れた派生言語やDSLが多数存在する。
参考文献.
2015年現在、初心者向けのイラスト入り入門書やサブルーチンのサンプル集の他、組み込み機器の制御や科学技術計算など目的を特化した専門書なども多数ある。便利な機能の説明はあっても、学習者の水準や目的にあった本を見つけるのは必ずしも容易でない。オープンソースのCコンパイラ、OSも大規模なものがあり、直接読み始めるのは困難になっている。オープンソースのOSの小規模なものから始めるとよい。