C言語
C言語（シーげんご）は、幅広い分野で多目的に用いられている古典的かつ世界で最も普及したプログラミング言語である。機械語コードとの対応が比較的容易に推測できるハードウェア寄りの低水準言語であり、基幹系システムや動作環境の厳しいソフトウェアの開発に用いられる事が多い。パソコン、スパコンから機器組込システム、マイクロコントローラまで、C言語のコード資産が蓄積されている環境は多岐に渡る。言語仕様としてはフロー制御とスコープおよび構造体などの書式を持ち、構造化されたプログラミングが可能である。
C言語は、1972年にAT&Tベル研究所所属の計算機科学者デニス・リッチーによって制作された。開発元英語圏での名称はアルファベット一文字の「C」であり、その由来は同僚が作ったB（B言語）の次であるからというものだった。当初はUnix用のプログラム開発が主な用途であったが、その利便性が注目された事で学術機関からソフトウェア業界へも広まった。1980年代に入ると様々なコンピュータアーキテクチャに適用されて人気を博し、プログラミング言語の中心的存在となった。それに伴い数多くの開発元からC言語コンパイラが販売されたので、1989年にANSIがコンパイラ規格の標準化を行い、その後はISOによってもC言語開発環境の規格が制定された。
ホスト環境やプログラムの内容によっては、以下に対して脆弱性対策を施しても実行速度の低下が無視できる程度であることも多く、欠点とみなされることも少なくない。
C言語のプログラムには、ホスト環境を前提とするか、フリースタンディング環境を前提とするかで、方向性が異なる。入門書によって趣が異なるいくらかの方向性が存在する。ホスト環境を前提とする場合には、標準入出力の利用により、動作をすぐに確かめることができる。標準Cライブラリのcodice_6関数 (ヘッダーファイルcodice_7にて宣言) を利用したものを例示する場合、以下のようなものがある。
ここでサンプルソース中の「codice_8」は改行を表す。なお、codice_6 関数は変数や書式化された文字列などが表示できる比較的高機能な出力関数である。C言語として可変引数である特殊なmainとprintfを使っていることにより、C言語の関数プログラミングに対する誤解を生む原因にもなっている。C言語は、AT&Tベル研究所のケン・トンプソンが開発したB言語の改良として誕生した（#外部リンクの「」参照）。
1972年、トンプソンとの開発を行っていたデニス・リッチーはB言語を改良し、実行可能な機械語を直接生成するC言語のコンパイラを開発した。後に、は大部分をC言語によって書き換えられ、C言語のコンパイラ自体も移植性の高い実装のに置き換わったこともあり、UNIX上のプログラムはその後にC言語を広く利用するようになった。
ちなみに、「UNIXを開発するためにC言語が作り出された」と言われることがあるが、「The Development of the C Language」によると、これは正しくなく、経緯は以下の通りである。C言語は、当初はあくまでもOS上で動くユーティリティを作成する目的で作り出されたものであり、OSのカーネルを記述するために使われるようになるのは後の展開である。
アセンブラとの親和性が高いために、ハードウェアに密着したコーディングがやりやすかったこと、言語仕様が小さいためコンパイラの開発が楽だったこと、小さな資源で動く実行プログラムを作りやすかったこと、UNIX環境での実績があり、後述の といった解説文書が存在していたことなど、さまざまな要因からC言語は業務開発や情報処理研究での利用者を増やしていった。特にメーカー間でオペレーティングシステムやCPUなどのアーキテクチャが違う 環境では再移植の必要性がしばしば生じて、プログラムをC言語で書いてソースレベル互換を確保することが標準となった。
1980年代に普及し始めたパーソナルコンピュータ(PC)は当初、8ビットCPUでを搭載していたものも多く、が普及していたが、1980年代後半以降、16ビットCPUを採用しメモリも増えた（ 非搭載の）PCが主流になりだすと、2万円前後の安価なコンパイラが存在したこともあり、ユーザーが急増した。8ビットや8086系のPCへの移植は、ポインタなどに制限や拡張を加えることで解決していた。
1990年代中盤以降は、最初に学ぶプログラミング言語としても主流となった。また、90年代中盤にはゲーム専用機（ゲームコンソール）の性能向上とプログラムの大規模化、マルチプラットフォーム展開を受け、開発言語がアセンブラからC言語に移行した。GUI環境の普及とオブジェクト指向の普及により 、、C++、、、などの言語の利用者も増加したため、広く利用されるプログラミング言語の数は増加傾向にある。現在でもJava, C#, C++などC言語派生の後発言語を含めて、C言語は比較的移植性に優れた言語であり、業務用開発やフリーソフトウェア開発、C++などの実装が困難な組み込みなどの小規模のシステムで、幅広く利用されている。
リッチーとカーニハンの共著である「」1978年を出版。その後標準ができるまで実質的なC言語の標準として参照。C言語は発展可能な言語で、この本の記述も発展の可能性のある部分は厳密な記述をしておらず、曖昧な部分が存在していた。C言語が普及するとともに、互換性のない処理系が数多く誕生した。これはプログラミング言語でしばしば起こる現象であり、C言語固有の現象ではない。
そこで、ISO/IEC JTC1とは協同でC言語の規格の標準化を進め、1989年12月にが
を、1990年12月にISOがを発行した。ISO/IEC規格のほうが章立てを追加しており、その後もISO/IEC規格にならって章立てを追加した。それぞれC89 ( C89) 及びISO/IEC C90という通称で呼ぶことがある。
日本では、これを翻訳したものを日本工業規格『JIS X3010-1993 プログラム言語C』として、1993年10月に制定した。
最大の特徴は、C++と同様の関数プロトタイプを導入して引数の型チェックを強化したことと、codice_17やcodice_18などの新しい型を導入したことである。一方、処理系に依存するとするに留めた部分も幾つかある（codice_19型のビット幅、codice_20型の符号、ビットフィールドのエンディアン、シフト演算の挙動、構造体などへのパディング等）。
16ビット/32ビットCPUの両方に対応できるようにするため、定義しないことを決めている未定義、定義したもののどれにするかを決めていない未規定、処理系ごとに決めて文書化する処理系定義など、CPUとの相性による有利不利が生じないような規定になっている
型の大きさは16ビット/32ビットCPUの両方に対応できるように決めている。バイト数はcodice_21演算子で取得し、最大最小値はcodice_22で参照することとしている。多くの処理系ではcodice_20型は8ビット、codice_24型は16ビットである。codice_19やcodice_26はCPUのレジスタの幅などによって決めている。またAPIなどの呼び出しには、ヘッダでcodice_27やcodice_28などとcodice_29で定義した型を使用して回避することがある。codice_20型以外で符号を明示しない場合はcodice_31（符号付き）にするかどうかも処理系。
規格上には、BCPL・C++タイプの一行コメント（「codice_32」）は無いが、オプションで対応した処理系も多く、gccやClangはGNU拡張codice_33でサポートしている。
C89には、下記の追加の訂正と追加を行った。
1999年12月1日に、ISO/IEC JTC1 SC22 WG14 で規格の改定を行い、C++の機能のいくつかを取り込むことを含め機能を拡張しを制定した。この版のC言語の規格を、通称としてC99と呼ぶ。はC99に完全準拠していると公称している。 Cコンパイラ（gcc）はC99にほとんど対応しているが一部未対応部分も残っている。
日本では、日本工業規格 JIS X 3010:2003「プログラム言語C」がある。
主な追加機能：
C99は下記の訂正がある。
2011年12月8日に改定された"ISO/IEC 9899:2011"（通称 C11）が現在の最新規格である。gccやClangなどが部分的に対応している。改定による変更・追加・削除機能の一部を以下に記述する。
C11は文字列（UTF-32、UTF-16、UTF-8の各符号化方式）に標準で対応している。そのほか、codice_47式、C++と同様の無名構造体・無名共用体、排他的アクセスによるファイルオープン方法、quick_exitなどのいくつかの標準関数などを追加した。
また、codice_48関数指示子を追加した。codice_48は従来各処理系毎に独自に追加していた（たとえばgccではcodice_50）ものを共通化したもので、「呼び出し元に戻ることがない」という特殊な関数についてその特性を示すためにある。codice_51文を持たない関数という意味ではなく（規格ではcodice_51文を持たなくとも、関数の最後の文の実行が終われば制御は呼び出し元に戻る）、この指示が意味するものは、当該の関数、ないしその内部から呼び出している関数の実行中に、必ずcodice_53やcodice_54を実行したり、例外などで終了する、あるいは、codice_55による大域ジャンプで抜け出す、継続渡しスタイル変換されたコードである、などのために、絶対に制御が呼び出し元に戻らない、という関数を指示するためにある。そのような関数は、スタックに戻りアドレスを積む通常の呼び出しではなく、スタックを消費しないジャンプによって実行できる。
アラインメント機能、codice_56型やC言語ネイティブの原始的なスレッド機能などを省略可能な機能として規格に組み込んだ。また、C99では規格上必須要件とされていた機能のうち、複素数型と可変長配列を省略可能なものに変更した。これらの省略可能な機能はC11規格合致の必須要件ではないので、仮に完全に規格合致の処理系であっても、対応していないかもしれない。C11規格では、省略可能な機能のうちコンパイラがどれを提供しているかを判別するために利用できる、テスト用のマクロを用意している。
これにより、codice_57関数は廃止されている。
gcc、clang、Visual C++、C++Builderなど著名な4つがC言語とC++を一つの処理系で対応している。C言語とC++の共通部分を明確にし、二つの言語の違いに矛盾が生じないようにすることが課題になっている。その他にも、OpenGLシェーダー言語であるGLSL、DirectX（Direct3D）シェーダー言語であるHLSL、OpenCLカーネル記述言語であるOpenCL-Cなど、C言語の文法的特徴を取り入れた派生言語やDSLが多数存在する。
2015年現在、初心者向けのイラスト入り入門書やサブルーチンのサンプル集の他、組み込み機器の制御や科学技術計算など目的を特化した専門書なども多数ある。便利な機能の説明はあっても、学習者の水準や目的にあった本を見つけるのは必ずしも容易でない。オープンソースのCコンパイラ、OSも大規模なものがあり、直接読み始めるのは困難になっている。オープンソースのOSの小規模なものから始めるとよい。