Jazyk C pro pokročilé

Podobné dokumenty
Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Programování v C++ 1, 1. cvičení

Opakování programování

Ukazka knihy z internetoveho knihkupectvi

Virtuální počítač. Uživatelský program Překladač programovacího jazyka Operační systém Interpret makroinstrukcí Procesor. PGS K.

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

IUJCE 07/08 Přednáška č. 1

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Matematika v programovacích

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

Algoritmizace a programování

Zápis programu v jazyce C#

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Šablonové metaprogramování v C++ Miroslav Virius KSI FJFI ČVUT

Operační systémy. Cvičení 4: Programování v C pod Unixem

Stručný obsah První týden Druhý týden 211 Třetí týden 451 Rejstřík 787

Bitové operátory a bitová pole. Úvod do programování 2 Tomáš Kühr

Programovací jazyk C++ Hodina 1

Data, výrazy, příkazy

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

5 Přehled operátorů, příkazy, přetypování

PŘETĚŽOVÁNÍ OPERÁTORŮ

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

Jazyk C# a platforma.net

Úvod do programování. Lekce 1

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

Úvod do programování - Java. Cvičení č.4

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Jazyky C a C++ kompletní průvodce 2., aktualizované vydání. Miroslav Virius

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

IUJCE Přednáška č. 1. programování v C na vyšší úrovni základy objektově orientovaného programovaní v (C++, C#)

Prezentace a vysvětlení programového prostředí NXC

Profilová část maturitní zkoušky 2017/2018

Výrazy, operace, příkazy

Výrazy, operace, příkazy

Jazyk C Program v jazyku C má následující strukturu: konstanty nebo proměnné musí Jednoduché datové typy: Strukturované datové typy Výrazy operátory

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

Programování v jazyce JavaScript

ČÁST 1. Základy 32bitového programování ve Windows

V dalších letech se pak začaly objevovat první normy pro jazyk C++ (ISO/IEC 14882:1998; ISO/IEC 9899:1999; ISO/IEC 14882:2003; ISO/IEC 14882:2011).

Základy programování (IZP)

Programovanie v jazyku C - struktury a polia

Obsah. Začínáme programovat v Ruby on Rails 9. Úvod Vítejte v Ruby 15. O autorovi 9 Poděkování 9

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

přetížení operátorů (o)

Architektury počítačů a procesorů

Základy programování (IZP)

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu.

Programování v C++, 2. cvičení

Základy C++ I. Jan Hnilica Počítačové modelování 18

PROGRAMOVÁNÍ V JAZYCE C V PŘÍKLADECH 11 Dynamické datové struktury 11.1 Spojové struktury Příklad PROG_

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

Jazyk C++, některá rozšíření oproti C

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

Programovací jazyk Pascal

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) 28. prosince Fakulta elektrotechniky a informatiky Katedra softwarových technologií

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Generování vnitřní reprezentace programu

Paralelní programování

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Strukturu lze funkci předat: (pole[i])+j. switch(výraz) velikost ukazatele

PB161 Programování v jazyce C++ Přednáška 4

Základy programování (IZP)

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Algoritmizace a programování

Úvod do programovacích jazyků (Java)

Programovací jazyk. - norma PASCAL (1974) - implementace Turbo Pascal, Borland Pascal FreePascal Object Pascal (Delphi)

Programování v C++ 2, 4. cvičení

Vzdělávací oblast: Informatika a informační a komunikační technologie Vzdělávací obor: Programování. Předmět: Programování

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

Struktura programu, proměnné, konstanty, výrazy v jazycích C a C#

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

Datové typy strana 29

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

Pohled do nitra mikroprocesoru Josef Horálek

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

Základy algoritmizace a programování

Algoritmizace a programování

Základní datové typy, proměnné - deklarujeme předem - C je case sensitive rozlišuje malá a velká písmena v názvech proměnných a funkcí

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

Úvod do programovacích jazyků (Java)

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Struktura programu v době běhu

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

2 Datové typy v jazyce C

Programování v C++ Úplnej úvod. Peta (maj@arcig.cz, SPR AG )

Spojová implementace lineárních datových struktur

Programování v jazyce C pro chemiky (C2160) 9. Práce s PDB soubory

Algoritmizace a programování

Transkript:

Jazyk C pro pokročilé Obsah Proč používat jazyk C Rozdíly oproti Javě Objektově orientované programování v C Použití preprocesoru Kódovací standardy Optimalizující překladač Standard C99

Proč používat jazyk C Starý jazyk (1970 1978) Něco mezi assemblerem a moderními OO jazyky. Knihovna standardních funkcí je dlouhodobě zavedená a standardizovaná přenositelnost zdrojových kódů Kompilátor jazyka C je vždy první kompilátor, který se pro nový procesor portuje Na portaci se podílí výrobce procesoru rychlý kód Většina architektur a instrukčních sad procesorů je ovlivněna požadavky a filozofií jazyka C

Proč používat jazyk C (II.) Základní datové typy jazyka jsou definovány tak, aby odpovídaly vlastnostem cílového procesoru. Programy jsou efektivní a při troše snahy lze psát programy přenositelné mezi 8, 16, 32 i 64 bitovými procesory. Knihovny napsáné v jazyce C se snadno začleňují do jiných (modernějších) jazyků. Jazyk umožňuje i velmi nízkoúrovňový zápis kódu natolik přizpůsobený zpracovávání instrukcí procesorem, že téměř není potřeba psát části programu v assembleru (lepší přenositelnost).

Rozdíly oproti jazyku Java Jazyk nedefinuje koncepci objektů. Lze si naprogramovat ručně. Neexistují výjimky obtížnější ošetřování chyb (goto). Použití pointerů je explicitní. Není automatická správa paměti. Garbage collector lze také doprogramovat. Lze použít i reference counting. Rozhraní programových modulů není zakompilováno v.o souborech, ale v samostatných.h souborech.

Objektové programování v C Základní vlastnosti OOP zapouzdřenost polymorfizmus dědičnost

Zapouzdřenost Datové položky deklarujeme jako strukturu Metody jsou funkce Parametr this se musí předávat explicitně typedef struct bod { int x, y; } bod_t; void bod_init (bod_t *this) { this->x = 0; this->y = 0; } void bod_draw(bod_t *this, int color) { drawpixel(this->x, this->y, color); } bod_t A, *B; bod_init(&a); B = malloc(sizeof( bod_t) ); bod_init(b);

Polymorfizmus Tabulka virtualních metod (VMT) pointery na funkce. Použití: drivery, síťové protokoly atd. typedef struct bod { int x, y; void (*draw)(struct int color); } bod_t; void bod_draw2(bod_t *this, int color) { fillcircle(this->x, this->y, 5, color); } void bod_init(bod_t *this, int x, y) { this->x = x; this->y = y; this->draw = bod_draw; } void bod_init2(bod_t *this, int x, y) { this->x = x; this->y = y; this->draw = bod_draw2; }

Polymorfizmus - použití bod_t A, B; bod_init(&a, 10, 20); bod_init2(&b, 20, 10); A.draw(&A, WHITE); B.draw(&B, RED);

Dědičnost typedef struct kruznice { bod_t bod; int polomer; } kruznice_t; kruznice_init(kruznice_t *this, x, y, r) { bod_init(&this->bod, x, y); this->polomer = r; this->bod.draw = kruznice_draw; } Nevýhody: nutnost přetypovávání Příklady: Grafická knihovna GTK, Jádro Linuxu,...

Preprocesor Priority operátorů Mocný nástroj. Při špatném použití vede k chybám. Makra by se měly tvářit jako prvky jazyka (proměnné, funkce) a neměly by mít vedlejší efekty. #define MIN_NUM 10 #define KONST MIN_NUM + 1 x = 2*KONST; #define KONST (MIN_NUM + 1) #define ceil_div(x, y) (x + y - 1) / y a = ceil_div (b & c, sizeof (int)); #define ceil_div(x, y) ((x) + (y) - 1) / (y) #define ceil_div(x, y) (((x) + (y) - 1) / (y))

Preprocesor II. Složené příkazy #define START_WD(t) \ set_reg(ctrl, 0x10); set_reg(time, t) if (watchdog) START_WD(10); #define START_WD(t) \ { set_reg(ctrl, 0x10); set_reg(time, t); } if (watchdog) START_WD(10); else printf( no watchdog ); #define START_WD(t) \ do { set_reg(ctrl, 0x10); set_reg(time, t); } while (0)

Preprocesor III. Zdvojení vedlejších efektů #define MIN(x,y) ((x) < (y)? (x) : (y)) next = min (x + y, foo (z)); /* GNU Extension */ #define min(x, Y) \ ({ typeof (X) x_ = (X); \ typeof (Y) y_ = (Y); \ (x_ < y_)? x_ : y_; }) /* Non GNU */ { int tem = foo (z); next = min (x + y, tem); }

Kódovací standardy Zajišťují čitelnost kódu pro ostatní lidi z firmy/projektu. Zabraňování častým chybám. Definují: odsazování pojmenovávání funkcí, proměnných, parametrů formát komentářů (automatická dokumentace) dělení kódu do souborů používání typů MISRA pravidla pro použití jazyka C pro aplikace kritické z hlediska bezpečnosti (safety-critical applications) Původně pro automobilový průmysl. Používá se i jinde.

Linux Codign Style /usr/src/linux/documentation/codingstyle Odsazování o 8 mezer (tabulátor) dobře čitelné i po 20 hodinách za monitorem Dělení řádků delších než 80 znaků Umisťování složených závorek Jména proměnných, funkcí globální proměnné pojmenovávat srozumitelně, u některých lokálních to není nutné (tmp, i) (v knihovnách používat prefixy, prefix _ je vyhražen pro POSIX) Funkce vejde se na obrazovku 80x24 znaků (výjimka: dlouhý switch příkaz) Dlouhé funkce dělit do menších se srozumitelným názvem (použití inline modifikátoru) Max. 5 10 lokálních proměnných.

Linux Codign Style II. /usr/src/linux/documentation/codingstyle Centralizované opouštění funkcí (ošetření chyb) použití goto čitelnější než použití v podmíněných příkazech int fun(int a) { int result = 0; char *buffer = kmalloc(size); if (buffer == NULL) return -ENOMEM; out: } if (condition1) { while (loop1) {... } result = 1; goto out; }... kfree(buffer); return result;

Linux Codign Style III. /usr/src/linux/documentation/codingstyle Datové struktury používají reference counting Makra Hlášení jádra se vypisují bez teček na konci Alokace paměti p = kmalloc(sizeof(*p),...); Další, nepsaná pravidla: (http://www.kroah.com/linux/talks/ols_2002_kernel_codingstyle_paper/codingstyle.ps) místo typů (typedef struct { } urb_t) používat struct urb používání standardních otestovaných funkcí (práce s řetězci, dynamické seznamy, pořadí bytů, atd.) Nepoužívat číselné konstanty. Definovat pro ně makra. Omezit používání #ifdef v.c souborech nadefinovat makra v.h, která třeba nedělají nic

MISRA Některá pravidla Výrazy s && nebo v if ( ) se povinně závorkují pro logické operace použít typ BOOL definovaný pomocí typedef (statické analyzátory chybu odhalí) Lokální proměnné se nesmí jmenovat stejně jako globální proměnné Pokud to jde, číselné konstanty mají příponu určující typ (0x123456L), osmičkové konstanty jsou zakázány (0123) Operátor čárka se nepoužívá (pouze ve for ( )) Pokud to není nutné, nepoužívat přetypování. Nesmí se používat continue, goto, break (kromě switch) Každý switch má default část, každý case má break.

MISRA II. Některá pravidla Nepoužívat pointerovou aritmetiku (výjimečně ++ a --) Nad ukazateli nepoužívat relační operátory kromě == a!=. Zákaz používání globálních proměnných. Existují výjimky. Nepoužívat rekurzivní funkce.

Optimalizující překladač (GCC) Použití modifikátoru volatile pro přístup k hardwaru a pro proměnné modifikované v obslužné rutině přerušení. Vyšší úroveň Odstranění nepoužitých příkazů (if (0)) Odstranění nepoužitých proměnných Propagace konstant Propagace proměnných do výrazu x = a + c1; if (x == c2) goto... else goto... if (a == (c2 - c1)) goto... else goto Eliminace násobných ukládání do proměnných Optimalizace cyklů (náhrada operaci SIMD instrukcemi atd.) Zjednodušení vestavěných funkcí (např. memcpy). Volání funkcí na konci jiné funkce může být nahrazeno skokem.

Optimalizující překladač (GCC) Nižší úroveň Eliminace výpočtů stejných podvýrazů pomocí ukládání mezivýsledků do pomocných proměnných. Výběr adresních módu v závislosti na jejich ceně. Optimalizace cyklů (rozbalování, modulo scheduling, ) Kombinování více operací do jedné instrukce Alokace správných registrů pro operandy a proměnné, určení co bude v registru a co proměnná na zásobníku, proměnné mohou být i přesouvány mezi registrem a zásobníkem Přeskupení instrukcí tak, aby byly vykonány nejrychleji

Standard C99 definuje následující typy (stdint.h) int32_t, uint32_t, int16_t možnost deklarovat lokální proměnné jinde než na začátku funkce Standardizuje inline funkce přidává boolean typ Povoluje komentáře ve stylu C++ (//) Podpora pro pole různé délky na konci struktur (int pole[]) Makra s proměnným počtem parametrů Kvalifikátor restrict dovoluje kompilátoru lépe optimalizovat přístup k proměnným