Zdroje Úvod Zápis a kompilace programu Příklad programu v jazyce C Příklad programu s výstupem. Úvod do jazyka C. Jan Faigl

Podobné dokumenty
Úvod do jazyka C. Úvod do jazyka C. Knihy 2/2. Knihy 1/2. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze.

Základy programování v C

11. Přehled prog. jazyků

Část I. Část 1 Základy programování v C. Přehled témat. Základy programování v C. Jazyk C

Základy programování v C

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

Ú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í

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

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

Dílčí příklady použití jazykových konstrukcí v projektu. Jazyk C Příklady. Pravidla překladu v gmake. Zadání

MIKROPROCESORY PRO VÝKONOVÉ SYSTÉMY

Základy programování v C

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

PROGRAMOVÁNÍ V C++ CVIČENÍ

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

Algoritmizace a programování

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

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

Programovací jazyk C(++) C++ area->vm_mm->locked_vm -= len >> PAGE_SHIFT;

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr)

Programovací jazyk C++ Hodina 1

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

Struktura programu v době běhu

Předměty. Algoritmizace a programování Seminář z programování. Verze pro akademický rok 2012/2013. Verze pro akademický rok 2012/2013

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

MPASM a IDE pro vývoj aplikací MCU (Microchip)

Preprocesor a koncepce (větších) programů. Úvod do programování 2 Tomáš Kühr

6. lekce Úvod do jazyka C knihovny datové typy, definice proměnných základní struktura programu a jeho editace Miroslav Jílek

Vícerozměrná pole. Úvod do programování 2 Tomáš Kühr

x86 assembler and inline assembler in GCC

8 Třídy, objekty, metody, předávání argumentů metod

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

Počítačové modelování

Jazyk symbolických adres

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

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

Stanislav Vítek. Katedra radioelektroniky Fakulta elektrotechnická

Procedurální programování

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

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

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

2 Datové typy v jazyce C

Maturitní otázky z předmětu PROGRAMOVÁNÍ

dostat zdroják Petr Zemek Fakulta informačních technologií VUT v Brně izemek

Procedurální programování

Algoritmizace. Cíle předmětu

Část I Organizace předmětu

Část I Organizace předmětu

Procedurální programování

C2110 Operační systém UNIX a základy programování

Základy jazyka C. Základy programování 1 Tomáš Kühr

Základy programování (IZP)

Přednáška 2. Systémy souborů OS UNIX. Nástroje pro práci se souborovým systémem. Úvod do Operačních Systémů Přednáška 2

Úvod do jazyka C. Zdroje: Herout: Učebnice jazyka C, Kopp, České Budějovice, 2001 Schildt H: Nauč se sám C, Softpress, Praha, 2001

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

Odvozené a strukturované typy dat

Ukazatele, paměťové třídy, volání funkcí

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

Část I Organizace předmětu

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

Úvod do programování. Lekce 1

Programovací jazyk C(++) C++ area->vm_mm->locked_vm -= len >> PAGE_SHIFT;

Základy programování (IZP)

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

Jazyk C++ II. Šablony a implementace

Vývoj programů. ÚVOD DO OPERAČNÍCH SYSTÉMŮ

Algoritmizace a programování

AUTHOR : Robert Follner DATE. Abstrakt ABSTRACT: Několik poznatků autora (Robert Follner) z programování

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

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr)

Matematika v programovacích

Základy programování (IZP)

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

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

Úvod do programovacích jazyků (Java)

Algoritmizace a programování

Př. další použití pointerů

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

- dělají se také pomocí #define - podobné (použitím) funkcím - předpřipravená jsou např. v ctype.h. - jak na vlastní makro:

Algoritmizace a programování

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 -

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

Lekce 6 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

Úvod. Programovací paradigmata

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

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

Základy programování (IZP)

Úvod Seznámení s předmětem Co je.net Vlastnosti.NET Konec. Programování v C# Úvodní slovo 1 / 25

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

Programování v jazyce C pro chemiky (C2160) 11. Vizualizace sekvence proteinů

Algoritmy I. Cvičení č. 2, 3 ALGI 2018/19

PB071 Programování v jazyce C

Více o konstruktorech a destruktorech

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

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

ZÁKLADY PROGRAMOVÁNÍ. Mgr. Vladislav BEDNÁŘ /14

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

Transkript:

Úvod do jazyka C Jan Faigl Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Přednáška 7 A0B36PR2 Programování 2 Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 1 / 28

Úvod do jazyka C Zdroje Úvod Zápis a kompilace programu Příklad programu v jazyce C Příklad programu s výstupem Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 2 / 28

Obsah Zdroje Úvod Zápis a kompilace programu Příklad programu v jazyce C Příklad programu s výstupem Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 3 / 28

Knihy 1/2 Učebnice jazyka C, VI. vydání, Pavel Herout, KOPP, 2010, ISBN 978-80-7232-406-4 Učebnice jazyka C 2. díl, IV. vydání, Pavel Herout, KOPP, 2008, ISBN 978-80-7232-367-8 The C Programming Language, 2nd Edition (ANSI C), Brian W. Kernighan, Dennis M. Ritchie, Prentice Hall, 1988 (1st edition 1978) Algorithms, 4th Edition, Robert Sedgewick, Kevin Wayne, Addison-Wesley, 2011, ISBN 978-0321573513 Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 4 / 28

Knihy 2/2 Programming in C, 4th Edition, Stephen G. Kochan, Addison-Wesley, 2014, ISBN 978-0321776419 C Programming: A Modern Approach, 2nd Edition, K. N. King, W. W. Norton & Company, 2008, ISBN 860-1406428577 21st Century C: C Tips from the New School, Ben Klemens, O Reilly Media, 2012, ISBN 978-1449327149 Introduction to Algorithms, 3rd Edition, Cormen, Leiserson, Rivest, and Stein, The MIT Press, 2009, ISBN 978-0262033848 Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 5 / 28

Obsah Zdroje Úvod Zápis a kompilace programu Příklad programu v jazyce C Příklad programu s výstupem Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 6 / 28

Jazyk C Nízko-úrovňový programovací jazyk Systémový programovací jazyk (operační systém) Jazyk pro vestavné (embedded) systémy Téměř vše nechává na uživateli (programátorovi) MCU, křížová (cross) kompilace Inicializace proměnných, uvolňování dynamické paměti Má výrazně blíže k využití hardwarových zdrojů Přímé volání služeb OS, přímý zápis do registrů a portů. Klíčové pro správné fungování programu je zacházení s pamětí Segmentation fault valgrind Jazyk C nám dává možnost (a někdy povinnost) mít program a jeho překlad plně pod kontrolou. Zpravidla se vyplatí být obezřetný základní principy jsou však relativně jednoduché. Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 7 / 28

Jazyk C Nízko-úrovňový programovací jazyk Systémový programovací jazyk (operační systém) Jazyk pro vestavné (embedded) systémy Téměř vše nechává na uživateli (programátorovi) MCU, křížová (cross) kompilace Inicializace proměnných, uvolňování dynamické paměti Má výrazně blíže k využití hardwarových zdrojů Přímé volání služeb OS, přímý zápis do registrů a portů. Klíčové pro správné fungování programu je zacházení s pamětí Segmentation fault valgrind Jazyk C nám dává možnost (a někdy povinnost) mít program a jeho překlad plně pod kontrolou. Zpravidla se vyplatí být obezřetný základní principy jsou však relativně jednoduché. Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 7 / 28

Obsah Zdroje Úvod Zápis a kompilace programu Příklad programu v jazyce C Příklad programu s výstupem Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 8 / 28

Zápis programu Zdrojový kód programu v jazyce C se zapisuje do textových souborů zdrojový soubor s koncovkou.c Zpravidla základní rozlišení souborů, pozor na.c hlavičkový soubor s koncovkou.h Jména souborů volíme výstižné (krátké názvy) a zpravidla zapisujeme malými písmeny. Zdrojové soubory jsou překládány do binární podoby překladačem a vznikají objektové soubory (.o) Objektový kód obsahuje relativní adresy proměnných a volání funkcí nebo pouze odkazy na jména funkcí, jejichž implementace ještě nemusejí být známy. Z objektových souborů (object files) se sestavuje výsledný program, ve kterém jsou již všechny funkce známy a relativní adresy se nahradí absolutními. Program se zpravidla sestavuje z více objektových souborů umístěných například v knihovnách. Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 9 / 28

Zdrojové soubory Rozdělení na zdrojové a hlavičkové soubory umožňuje rozlišit deklaraci a definici, především však podporuje Organizaci zdrojový kódů v adresářové struktuře souborů Modularitu Hlavičkový soubor obsahuje popis co modul nabízí Popis (seznam) funkcí a jejich parametrů bez konkrétní implementace Znovupoužitelnost Pro využití binární knihovny potřebuje znát její rozhraní, které je definované v hlavičkovém souboru Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 10 / 28

Překlad a sestavení programu Před vlastním překladem se zdrojové soubory předzpracují preprocesorem Všechny odkazované hlavičkové soubory se vloží do jediného zdrojového souboru Zdrojový soubor se přeloží do objektového souboru Výsledný spustitelný soubor se sestaví z příslušných dílčích objektových souborů a odkazovaných knihoven Source file.c.h Header files.a/.lib Lib files Preprocesor Compiler Linker a.out Executable binary file Object File.o/.obj Object files.o/.obj Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 11 / 28

Části překladu a sestavení programu preprocesor umožňuje definovat makra a tím přizpůsobit překlad aplikace kompilačnímu prostředí Výstupem je textový ( zdrojový ) soubor. compiler Překládá zdrojový (textový) soubor do strojově čitelné (a spustitelné) podoby Nativní (strojový) kód platformy, bytecode, případně assembler linker sestavuje program z objektových souborů do podoby výsledné aplikace Stále může odkazovat na knihovní funkce (dynamické knihovny linkované při spuštění programu), může též obsahovat volání OS (knihovny). Dílčí části preprocesor, compiler, linker jsou zpravidla jediný program, který se volá s příslušnými parametry Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 12 / 28

Překladače jazyka C V rámci předmětu PR2 budeme používat především překladače z rodin: gcc GNU Compiler Collection https://gcc.gnu.org clang C language family frontend for LLVM http://clang.llvm.org Pro win* platformy pak odvozená prostředí cygwin https://www.cygwin.com/ nebo MinGW http://www.mingw.org/ Základní použití (přepínače a argumenty) je u obou překladačů stejné Příklad použití compile: gcc -c main.c -o main.o link: gcc main.o -o main clang je kompatibilní s gcc Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 13 / 28

Obsah Zdroje Úvod Zápis a kompilace programu Příklad programu v jazyce C Příklad programu s výstupem Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 14 / 28

Příklad triviálního C programu Spustitelný program musí obsahovat právě jednu definici funkce main Při spuštění programu předává operační systém programu počet argumentů (argc) a argumenty (argv) Pokud používáme OS Prvním argumentem je jméno spouštěného programu 1 int main(int argc, char **argv) { 2 int v; 3 v = 10; 4 v = v + 1; 5 return argc; 6 } lec07/var.c Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 15 / 28

Překlad a příklad spuštění programu Překlad programu překladačem clang automaticky dojde ke kompilaci a linkování programu do soubor a.out clang var.c Překlad programu do soubor var clang var.c -o var Spuštění programu./var Překlad a spuštění clang var.c -o var;./var Překlad a spuštění pouze pokud překlad proběhl v pořádku clang var.c -o var &&./var Programy vrací návratovou hodnotu 0 znamená v pořádku Logický operátor dle použitého interpretu příkazů (např. sh, bash, zsh). Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 16 / 28

Příklad spuštění programu Navratová hodnota programu je uložena v proměnné $? Příklad spuštění programu s různým počtem argumentů./var./var; echo $? 1./var 1 2 3; echo $? 4./var a; echo $? 2 sh, bash, zsh Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 17 / 28

Příklad zdrojového souboru po zpracování preprocesorem Přepínačem -E můžeme provést pouze zpracování zdrojového souboru preprocesorem gcc -E var.c 1 # 1 "var.c" 2 # 1 "<built-in>" 3 # 1 "<command-line>" 4 # 1 "var.c" 5 int main(int argc, char **argv) { 6 int v; 7 v = 10; 8 v = v + 1; 9 return argc; 10 } Alternativně též clang -E var.c Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 18 / 28

Příklad zdrojového souboru přeloženého do Assembleru Přepínačem -S můžeme zdrojový kód přeložit do Assembleru clang -S var.c -o var.s 1.file "var.c" 2.text 3.globl main 4.align 16, 0x90 5.type main,@function 6 main: # @main 7.cfi_startproc 8 # BB#0: 9 pushq %rbp 10.Ltmp2: 11.cfi_def_cfa_offset 16 12.Ltmp3: 13.cfi_offset %rbp, -16 14 15 movq.ltmp4: %rsp, %rbp 16.cfi_def_cfa_register %rbp 17 movl $0, -4(%rbp) 18 movl %edi, -8(%rbp) 19 movq %rsi, -16(%rbp) 20 movl $10, -20(%rbp) 21 movl -20(%rbp), %edi 22 addl $1, %edi 23 movl %edi, -20(%rbp) 24 movl -8(%rbp), %eax 25 popq %rbp 26 ret 27.Ltmp5: 28.size main,.ltmp5-main 29.cfi_endproc 30 31 32.ident "FreeBSD clang version 3.4.1 (tags/ RELEASE_34/dot1-final 208032) 20140512" 33.section ".note.gnu-stack"," ",@progbits Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 19 / 28

Příklad překladu souboru Překlad do objektového souboru clang -c var.c -o var.o % clang -c var.c -o var.o % file var.o var.o: ELF 64-bit LSB relocatable, x86-64, version 1 (FreeBSD), not stripped Linkování objektového souboru do spustitelného souboru clang var.o -o var % clang var.o -o var % file var var: ELF 64-bit LSB executable, x86-64, version 1 ( FreeBSD), dynamically linked (uses shared libs), for FreeBSD 10.1 (1001504), not stripped dynamically linked not stripped Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 20 / 28

Příklad spustitelného souboru 1/2 Standardně je při překladu binární soubor stále vázán na knihovny jazyka C (a služby operačního systému) Závislosti můžeme zobrazit voláním ldd var ldd var var: libc.so.7 => /lib/libc.so.7 (0x2c41d000) ldd list dynamic object dependencies Statické linkování můžeme vynutit přepínačem static clang -static var.o -o var % ldd var % file var var: ELF 64-bit LSB executable, x86-64, version 1 ( FreeBSD), statically linked, for FreeBSD 10.1 (1001504), not stripped % ldd var ldd: var: not a dynamic ELF executable Porovnejte výslednou velikost souborů! Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 21 / 28

Příklad spustitelného souboru 2/2 Přeložený program (objektový soubor) standardně obsahuje symbolická jména clang var.c -o var wc -c var 7240 var Vhodná například pro ladění programu, ladění viz další přednášky. wc word, line, character, and byte count Symboly můžeme odstranit nástrojem (programem) strip strip var wc -c var 4888 var -c byte count Alternativně lze velikost souboru zobrazit například příkazem ls -l Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 22 / 28

Obsah Zdroje Úvod Zápis a kompilace programu Příklad programu v jazyce C Příklad programu s výstupem Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 23 / 28

Knihovní funkce Jazyk C sám o sobě poskytuje relativně jednoduchou syntax a sémantiku V zásadě umožňuje definovat proměnné, funkce, cykly a výrazy V podstatě pro každou trochu složitější činnost je nutné importovat (includovat) knihovní funkce Základní knihovny (std) jsou součástí vývojového prostředí (překladače) Viz výpis závislosti na knihovně libc.so.7 Knihovní funkce se importují klíčovým slovem preprocesoru #include a uvedením jména hlavičkového souboru knihovny uzavřené ve dvojici znaků < a > pro systémové knihovny " a " pro vlastní hlavičkové soubory modulů Při překladu specifikujeme příslušné prohledávané adresáře přepínačem -I a uvedením cesty Pro standardní systémové adresáře není třeba. Na pořadí uvedení cest a dále pak souborů při linkování záleží! Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 24 / 28

Knihovní funkce Jazyk C sám o sobě poskytuje relativně jednoduchou syntax a sémantiku V zásadě umožňuje definovat proměnné, funkce, cykly a výrazy V podstatě pro každou trochu složitější činnost je nutné importovat (includovat) knihovní funkce Základní knihovny (std) jsou součástí vývojového prostředí (překladače) Viz výpis závislosti na knihovně libc.so.7 Knihovní funkce se importují klíčovým slovem preprocesoru #include a uvedením jména hlavičkového souboru knihovny uzavřené ve dvojici znaků < a > pro systémové knihovny " a " pro vlastní hlavičkové soubory modulů Při překladu specifikujeme příslušné prohledávané adresáře přepínačem -I a uvedením cesty Pro standardní systémové adresáře není třeba. Na pořadí uvedení cest a dále pak souborů při linkování záleží! Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 24 / 28

Příklad programu s výstupem na stdout Pro výpis na standardní výstup použijeme příkaz formátovaného výstupu fprintf z knihovny stdio.h 1 #include <stdio.h> 2 3 int main(int argc, char **argv) { 4 fprintf(stdout, "My first program in C!\n"); 5 fprintf(stdout, "Its name is \"%s\"\n", argv[0]); 6 fprintf(stdout, "Run with %d arguments\n", argc); 7 if (argc > 1) { 8 fprintf(stdout, "The arguments are:\n"); 9 for(int i = 1; i < argc; ++i) { 10 fprintf(stdout, "Arg: %d is \"%s\"\n", i, argv[i]); 11 } 12 } 13 } Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 25 / 28

Příklad spuštění V případě zahrnutí hlavičkového soubor stdio.h jsou includovány další soubory, dále jsou definovány příslušné typy a deklarovány další funkce pro vstup a výstup clang print_args.c -o print_args./print_args first second My first program in C! Its name is "./print_args" It has been run with 3 arguments The arguments are: Arg: 1 is "first" Arg: 2 is "second" Ověřte např. clang -E print_args.c Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 26 / 28

Diskutovaná témata Shrnutí přednášky Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 27 / 28

Diskutovaná témata Diskutovaná témata Jazyk C překlad zdrojových kódů a linkování programu Příklad překladu programu Příklad programu s výstupem na standardní výstup Příště: základní typy, řídicí struktury, řetězce, pole a ukazatele. Jan Faigl, 2016 A0B36PR2 Přednáška 7: Úvod do jazyka C 28 / 28