Operační systém UNIX a jazyk C
Jan Brodský
Luděk Skočovský
SNTL Nakladatelství technické literatury Praha 1989, ISBN 80-03-00049-1
5. Programovací jazyk C
Vývoj jazyka C již na Unixu nezávisí. V r. 1984 byl publikován první návrh ANSI
standardu jazyka C [7]. Ze změn proti neoficiálnímu standardu [17] uvedeme ty
nejdůležitější:
-
unsigned je možno použít jako "modifikátor" všech celočíselných typů
(správným typem je např. unsigned long ...),
-
jména složek struktur a unií se mohou opakovat v různých strukturách
a uniích s odlišným významem,
-
struktury lze přiřazovat, předávat jako argumenty a vracet jako funkční
hodnoty,
-
jsou zavedena nová klíčová slova const, signed a volatile: const definuje
konstantní objekt (nesmí mu být přiřazena hodnota, nesmí být
inkrementován, ani dekremntován), signed lze použít stejně jako unsigned
(např. lze psát signed char ...) volatile (doslova těkavý, prchavý) označuje
výraz, se kterým musí kompilátor zacházet jako s křehkým zbožím. Uveďme
si příklad: nechť serin je ukazatel na paměťově mapovaný registr linky, která
připojuje podřízený počítač. Každé čtení registru vyšle přerušení do
podřízeného počítače. Pak se může stát, že optimalizační fáze kompilátoru
z cyklu
for(i = 0; i < 7; i++)
*serin;
výraz *serin (protože je na i nezávislý) vyřadí, takže výsledný kód by vypadal
takto:
for(i = 0; i < 7; i++)
;
což není správně, protože by se vyslalo jen jedno přerušení místo osmi.
Podobné cykly je třeba psát takto:
for(i = 0; i < 7; i++)
volatile *serin;
-
v externích deklaracích funkcí lze provádět prototypy, tzn. specifikovat jak
typ určené hodnoty, tak typ každého z parametrů. Například
extern FILE *fopen(char *pathname, char *mode);
-
makroprocesor rozeznává nový příkaz #pragma, kterým lze sdělit
kompilátoru skutečnosti, které nejsou v definici jazyka zahrnuty. Pokud je
kompilátor není schopen zpracovat, není to považováno za chybu.
Jsou známa další rozšíření jazyka C. Jedním z nich je C++ [2], v němž je kladen
důraz na silnější typovou kontrolu a datové abstrakce. Nejdůležitějším rozšířením je
pojem třídy. Pro paralerní programování byla publikována dvě rozšíření, obě pod
názvem Concurrent C. Jednodušší z nich vzniklo na univerzitě v Aachen [23], dřívější
a složitější na univerzitě v Osace [25]. Obě se zaměřila na vzájemnou komunikaci
a synchronizaci procesů, německá varianta využívá brány a zobecněné signály,
japonská verze sdílené proměnné, monitory a zasílání zpráv.