Programovací jazyk C byl vyvinut počátkem 70. let 20. století pro potřebu operačního systému Unix Kenem Thompsonem a Dennisem Ritchiem. Přesto že se jedná o poměrně starý jazyk, jedná se v současné době stále o jeden z nejpopulárnějších programovacích jazyků, který je jedním z nejčastěji používanějších v oblasti systémového software a je zároveň i velmi rozšířený při tvorbě aplikací. Jedná se o jazyk nízkoúrovňový, kompilovaný a relativně minimalistický.

Jazyk nejen pro systémové programování

Jazyk C je dostatečně mocný na většinu systémového programování, do kterého spadají ovladače a jádro operačního systému.

  • Co je potřeba doplnit, to lze vyřešit za pomoci takzvaného inline assembleru, tedy metody zápisu assembleru přímo do kódu.
  • Samotný zdrojový kód C je výrazně čitelnější než assembler, snáze se píše a také je mnohem snáze přenositelný na jiné procesory a počítačové architektury. To je také důvodem, že operační systémy, překladače, knihovny a interprety vysokoúrovňových jazyků jsou tak často implementovány v jazyce C.

Existuje mnoho dalších moderních programovacích jazyků, které se v syntaxi jazyka C inspirovaly, jako je například C++, Java, Perl nebo PHP.

Ukládání dat v C

Pro ukládání dat se v jazyce C dají použít tři způsoby: statická alokace paměti během překladu, automatická alokace paměti na zásobníku a dynamická alokace na haldě, tedy takzvaném heap pomocí knihovních funkcí.

Jazyk vykazuje pouze minimální abstrakci nad alokací: s pamětí se pracuje za pomoci datového typu zvaného ukazatel, který přebírá odkaz na paměťový prostor daného typu proměnné a zároveň je možné na něm provádět aritmetické operace, tedy takové operace, které neoperují s ukazateli přímo na úrovni jednotlivých bajtů, ale přihlíží zároveň k velikosti datového typu, na který se odkazují, zároveň ale existují ukazatele typu void *, které se pak mohou odkazovat na libovolný typ dat uložený v paměti. Ukazatele tedy mohou existovat nezávisle na proměnných, na které se odkazují, a to, aby neukazovaly na nealokovanou paměť tak zůstává na zodpovědnosti programátora.

Ukazatele v jazyce C

V jazyce C jsou ukazatele mocným nástrojem, protože tento jazyk povoluje nejen ukazatele na data, ale i na funkce. Zároveň jsou ukazatele z hlediska přenositelnosti a rizika zhroucení programu Achillovou patou jazyka, pokud jsou nesprávně použity.

Při pohledu z druhé strany to ale zároveň znamená, že má programátor plnou odpovědnost za alokaci paměti, díky čemuž není program závislý na automatickém dealokátoru paměti, takzvaném garbage collectoru. Jazyky jako je Java nebo C♯, které jsou oba odvozené od jazyka C, používají způsob odkazování alokovaných proměnných, který je méně univerzální, ale snižuje pravděpodobnost chyby v programu. Jazyk C++, který vznikl jako původní rozšíření jazyka C, zodpovědnost programátora za alokaci paměti zachovává, teprve v normách C++11 a vyšších je pak možnost volby mezi oběma přístupy.

Historie

Jazyk C začal svůj vývoj v Bellových laboratořích AT&T v letech 1969 až 1973. Vyvinuli ho Ken Thompson a Dennis Ritchie. Podle Ritchieho byl nejpřínosnějších obdobím rok 1972. Pojmenování jazyka „C“ vzniklo na základě toho, že mnohé z vlastností nového jazyka byly přebrány ze staršího jazyka, který se nazýval „B“. Název tohoto jazyka byl pak údajně odvozen od jazyka BCPL, i když to není zcela jisté, protože Thompson vytvořil také jazyk pojmenovaný Bon na poctu své ženy Bonnie.

V roce 1973 se jazyk C dostal do stádia, kdy byl dostatečně stabilní. Většina zdrojového kódu pro jádro Unixu, který byl původně napsaný v assembleru PDP-11, byla přepsána do C. Unix se tak stal jedním z prvních operačních systémů, který nebyl napsán ani ve strojovém jazyce a ani v assembleru. Mezi starší případy patří například systém Multics, který byl psán v PL-I a systém TRIPOS, který byl napsaný v BCPL.

V roce 1978 pak došlo na první vydání knihy The C Programming Language. Autory byli Ritchie a Brian Kernighan a kniha je mezi programátory známá jako „K&R“. Po mnoho let byla používána jako neformální specifikace jazyka C. Verze jazyka, kterou takto popsali, pak bývá nazývána „K&R C“. Druhé vydání pak popisovalo novější standard jazyka ANSI C.

V rámci „K&R C“ byly zavedeny vlastnosti jazyka, jako jsou datové typy struct, long int, unsigned int nebo operátor += na místo =+ (původní varianta mátla lexikální analyzátor překladače).

K&R C“ se obecně považuje za základní normu, kterou musí obsáhnout všechny překladače jazyka C. Dlouhé roky po zavedení ANSI C to byl stále nejmenší společný jmenovatel, který byl využíván napříč komunitou programátorů v jazyce C díky maximální přenositelnosti, vzhledem k tomu, že zdaleka ne všechny překladače podporovaly ANSI C.