PB071: Úvod do jazyka C - 1

Historie, překladače, utility gdb a make

19.2.2009: Opravena syntax gdb příkazu set

Historické návaznosti

Prehistorie: BCPL (Martin Richards, ~1965) -> B (Ken Thompson 1970) -> 1. verze C (Dennis Ritchie). Těsná souvislost s Unixem.

K-R C: Brian Kernighan, Dennis Ritchie: The C Programming Language (1978)

ANSI C (dále jen ANSI 89): Několik verzí normy, nejrozšířenější z r. 1989 - 90. Dosud používaná verze jazyka C. Tuto verzi budeme probírat spolu s verzí následující. V podstatě ji převzaly i starší verze normy ISO/IEC.

ISO/IEC C (dále jen ISO 99): Poslední verze normy: ISO/IEC 9899:1999, v r. 2001 publikovány drobné opravy.  V průběhu předmětu probereme i řadu možností této verze.

Další informace o historii C:
http://cm.bell-labs.com/cm/cs/who/dmr/chist.html

Jazykem C byly inspirovány i další jazyky (C++, Java, C#, některé skriptovací jazyky)


Překladače

V současné době většinou překladače spojené s překladači pro C++.

DOS/Windows:

Borland: Turbo C -> Turbo C++ -> Borland C++ -> C++ Builder

Microsoft: Microsoft C -> Microsoft C++ -> Visual C++

GNU: gcc (g++ pro jazyk C++) je k dispozici zdarma i pro tuto platformu. Dokonce si lze z Internetu stáhnout i verzi "unixovského" editoru vim pro MS-Windows.

UNIX:

Různé firemní překladače, nejčastěji pod názvem cc, nebo multiplatformní překladač gcc (budeme používat).

Volání překladače z příkazového řádku:

Jak probíhá překlad:

  1. fáze - preprocessing. Zpracují se direktivy pro preprocessor (podrobněji ve 4. přednášce). Výsledek se zapisuje na standardní výstup
  2. fáze - kompilace. Zahrnuje lexikální a syntaktickou analýzu, indikaci většiny chyb a překlad do assembleru. Výsledek se zapisuje do souborů s příponou .s
  3. fáze - assembling. Automaticky se pro něj vyvolá assembler. Výsledkem jsou tzv. object moduly ve strojovém kódu daného počítače s příponou .o
  4. fáze - linkování. Object moduly se pospojují a přidají  se k nim potřebné knihovní moduly. Výsledkem je spustitelný program.

Pokud fáze za sebou následují, mezivýsledkové soubory se smažou.

Na mnoha systémech je k dispozici firemní překladač cc s podobným ovládáním.

Nejčastější přepínače:
-g vytvořit data pro ladicí program (debugger)
-o spustitelný zadává název spustitelného programu (chybí-li, bude se v unixu jmenovat trochu nelogicky a.out)
-lknihovna zadává další knihovnu pro linkování (poslední parametr!)
-ansi nebo
-std=c89
jen konstrukce podle normy ANSI 89
-std=c99 i konstrukce podle normy ISO 99
-pedantic velmi přísná kontrola souhlasu s normou
-Wall vypisovat při překladu i většinu varování (důrazně doporučuji)
-Wextra vypisovat při překladu všechna varování, i ta, která obvykle neupozorňují na nic špatného
-Werror považovat i varování za chyby (mnoho varování upozorňuje na chyby, i když striktně vzato o syntaktickou chybu nejde)
-O nebo -O1 provést základní optimalizaci generovaného kódu pro zvýšení rychlosti
-O2 vyšší stupeň optimalizace (pomalý překlad)
-O3 nejvyšší stupeň optimalizace (pomalý překlad)
-Os generovat paměťově úsporný modul i za cenu jeho pomalosti
-E bez překladu, zastavit po preprocessoru
-S bez object modulu, zastavit po překladu do assembleru, 
-c pouze překlad do object modulů, bez linkování
Nejčastější přípony:
.c zdrojový program v C
.C .cc .cxx zdrojový program v C++
.cpp 1. zdrojový program v C++
2. výsledek práce preprocesoru
.s meziprodukt v assembleru
.o přeložený (object) modul
.a staticky linkovaná knihovna
.sl .dll dynamicky linkovaná knihovna
.exe (DOS)
bez přípony (Unix)
spustitelný (proveditelný, executable) program

Bližší informace: man gcc, man cc


Ladicí prostředky

Obvykle umožňují:

Ladicí utility v Unixu:

gdb (a jiné: xdb cdb ...)

Překlad:
module add devel2
(nikoli gcc!)
gcc -g ...

Spuštění: gdb název_programu

Hlavní příkazy:

run parametry Spustí program a předá funkci main zadané parametry
set args parametry Zadá parametry příkazového řádku, s nimiž se spustí laděný program následujícím run
break číslo_řádku
break funkce
Nastaví přerušovací místo
continue Pokračuje po přerušení
info break Vypíše nastavená přerušovací místa
delete číslo_break Zruší přerušovací místo (POZOR - identifikuje se pořadovým číslem, ne řádkem!)
watch výraz Zastaví při změně hodnoty zadaného výrazu
next Provede 1 řádek programu
step Provede 1 řádek programu; volá-li se v něm funkce, zastaví na jejím začátku
finish Provede zbytek funkce, zastaví na jejím konci
where
backtrace
Vypíše postup volání funkcí, jímž jsme se dostali na dané místo
print výraz,výraz,... Vypíše hodnotu výrazu
display výraz Vypíše hodnotu výrazu při každém zastavení
info locals Vypíše lokální proměnné
set var proměnná=hodnota Změní hodnotu proměnné
list řádek,řádek Vypíše zvolený úsek programu. Zadá-li se jen 1 číslo řádku, vypíše jeho okolí
list funkce Vypíše okolí začátku zadané funkce
shell Spustí unixovský shell
help příkaz Vypíše nápovědu k zadanému příkazu gdb
quit Ukončí gdb a vrátí se do shellu

Názvy příkazů lze zkracovat na tolik písmen, aby bylo jednoznačné.

gdb má smysl použít i tehdy, když program havaruje a není jasné, na kterém místě.

Ladicí utility DOS/Windows:

Borland, Microsoft: součást integrovaného prostředí

GNU: Utilita gdb je stejně jako překladač gcc rovněž dostupná i pro tuto platformu.


Prostředky pro automatizaci překladu

Utilita make:

Utilita se používá zejména pro překládání rozsáhlých projektů s mnoha zdrojovými soubory. Na základě definovaných závislostí vytváří cílové soubory ze souborů s nimi spřažených (dependent). Provádění závisí na datu souborů (akce jako překlad, linkování apod. se provádějí jenom tehdy, pokud cílový soubor neexistuje nebo je starší než soubory, z nichž se odvozuje.) Vzájemné závislosti i způsob, jak se ze spřažených souborů vytvářejí soubory cílové definuje uživatel v tzv. makefilu.

Soubor Makefile:

#komentáře

MAKRO=definice

cíl: zdroj ... # z vyjmenovaných zdrojů se vytvoří cíl příkazy uvedenými na dalších řádcích
[TAB]příkaz
[TAB]příkaz
...

Dále: implicitní pravidla, předdefinovaná makra.

Makra:

Některá makra jsou předdefinována, nejdůležitější:

CC=cc - překladač jazyka C (doporučuji změnit na gcc)
CFLAGS - parametry pro překladač (doporučuji nastavit na -std=c99 -pedantic -Wall)

Další makra můžeme v souboru Makefile definovat sami.

Speciální makra:

$@ - název souboru vytvářeného pomocí make (momentální cíl)
$?
- názvy změněných spřažených souborů
$< - název souboru, který vyvolal danou akci (momentální zdroj)
$* - prefix společný  výslednému souboru a souborům s nimiž je spřažen (jméno bez přípony)
$% - název odpovídqjícího souboru .o
$$
- použijeme, potřebujeme-li do Makefile zapsat samotný znak $

Při použití se makra zapisují např. $(CC) $(CFLAGS) $? -o $@

Mnoho dalších možností:

Podrobnější popis např.: http://www.mtsu.edu/~csdept/FacilitiesAndResources/make.htm
stručný popis http://vertigo.hsrl.rutgers.edu/ug/make_help.html
nebo kniha M. Dressler: Programovací jazyky GNU.

Příklad:

# jednoduchý Makefile

CC=gcc
CFLAGS=-g -std=c99 -pedantic -Wall
all:prog1

prog1:prog1.o funkce1.o funkce2.o
[TAB]$(CC) $(CFLAGS) $?
.o:.c prog1.h
[TAB]$(CC) $(CFLAGS) -c $<

Znak tabulátoru musí být v souboru fyzicky přítomen. Pozor na to, že některé editory nahrazují tabulátor určitým počtem mezer, příkaz make potom hlásí málo srozumitelné chyby. Takový editor pak pro vytvoření makefilu nelze použít.

Oba řádky začínající tabulátorem můžeme v tomto případě nahradit prázdným řádkem (ne však vynechat!). Prázdný řádek znamená použít implicitní příkaz pro daný typ akce, který má v principu stejný účinek jako příkazy výše uvedené.

Provedení:

Příkaz make. Je-li zadán bez parametrů, generuje první cíl definovaný v souboru Makefile.

Analogická utilita je i pod většinou DOSovských překladačů.

Projekty:

Uživatelsky mnohem příjemnější prostředek pod integrovaným prostředím Borland s podobnými možnostmi.


Další Další přednáška Hlavní stránka Hlavní stránka