PB0711 PB071 – Principy nízkoúrovňového programování Úvod, organizace, nástroje Slidy pro komentáře (děkuji!): https://drive.google.com/file/d/1JWSrimq4LOGRQufxk6_n HiWnpy_UzcIu/view?usp=sharing Principy nízkoúrovňového programování 1 IS,1998 2021 PB0712 Cíle předmětu 1. Zavést a podpořit programátorské schopnosti 2. Používat základní vývojové nástroje 3. Vysvětlit fundamenty (nízkoúrovňového) programování 4. Seznámit s možnostmi jazyka C 5. Trochu nadchnout (nebo alespoň úplně neodradit) do programování ☺ 6. (A vše zvládnout v novém formátu) Principy nízkoúrovňového programování 2 PB0713 3 Principy nízkoúrovňového programování • Pokud budete mít během poslechu přednášky dotaz, tak jej vložte na slido.com (#pb071_2022) • Společně projedeme dotazy každé pondělí během přednášky Q&A PB0714 Organizační Historie, normy Oblasti použití Začínáme s C Nástroje Lehký průlet C Principy nízkoúrovňového programování PB0715Principy nízkoúrovňového programování 5 https://www.fi.muni.cz/pb071 PB0716 Semestr Jaro 2022 je prezenční s omezením ⚫ V předstihu v pátek dostupné slidy a video pro přednášku ● Poslechněte si dopředu, zapište otázky na slido ⚫ Přednáška zkrácená prezenční s omezením počtu ● Pro účast na přednášce se prosím přihlašujte v ISu ● Vybrané témata + Kahoot + Q&A + bonus ⚫ Cvičení standardní prezenční v rámci vaší seminární skupiny Principy nízkoúrovňového programování 6 PB0717 Organizační (1) ⚫ Jazyk: C, občas česky a slovensky ⚫ Přednášky ● nepovinné, ale snad přínosné a zábavné ☺ (zkrácené prezenční) ● Přednášky přednahrané (IS), bodované odpovědníky ● Předpoklad základní znalosti algoritmizace (co je cyklus...) ● Rozcestník https://www.fi.muni.cz/pb071 ⚫ Cvičení ● povinné, dvouhodinové, dvě neúčasti tolerovány (sem. skupiny) ● Předpoklad účasti na vaší skupině, pod domluvě možnost využití jiné ● aktivní práce na příkladech a domácích úkolech, konzultace ● podklady https://www.fi.muni.cz/pb071/seminars/ ⚫ Ukončení předmětu ● Prostudujte https://www.fi.muni.cz/pb071/info/ ● Úspěšné zakončení předmětu (podmínky + min 85 bodů) ● semestrové povinnosti (domácí úkoly + testíky, zisk alespoň 60 bodů + 4 nenulové kladné domácí úkoly) ● úspěšná programovací zkouška (krátký test + programovací příklad na PC) ● teoretická část zkoušky (teoretický test na PC) Principy nízkoúrovňového programování 7 PB0718 Organizační (2) ⚫ Slidy z přednášky, ukázkové zdrojáky ● https://www.fi.muni.cz/pb071 ⚫ Domácí úkoly ● 5+1 za semestr, zadávány průběžně (na webu cvičení) ● body za funkčnost, body za správné a včasné odevzdání ● deadline pro odevzdání (na stránce úkolu, 2 týdny, 24:00) ● budou zveřejňována ukázková řešení ⚫ Odevzdání/testování ● možnost odevzdání nanečisto (částečně omezeno, detaily na cvičení) ● odevzdání do fakultního git, spuštění notifikačního skriptu ● bonusové body v případě včasného odevzdání (alespoň 3 dny předem) ⚫ Obtížnost úkolů se postupně zvyšuje ● Nenechávejte si řešení na poslední chvíli ● První domácí úkoly jsou typicky snažší body! Principy nízkoúrovňového programování 8 PB0719 Neopisujte ⚫ Škodíte především sami sobě ● začněte pracovat včas, ať máte čas na řešení "záseků“ ⚫ Provádíme automatickou kontrolu opisu u všech odevzdaných příkladů ● každý s každým ● s řešeními z minulých let (pokud je podobný příklad) ● u podezřelých příkladů probíhá manuální kontrola ⚫ V případě opsání jsou potrestání oba účastníci Principy nízkoúrovňového programování 9 http://dkdavis.weebly.com PB07110 Neopisujte ⚫ Co je OK ● Společně diskutujete ústně možnosti řešení ● Společně diskutujete včetně využití tabule, z tabule ale neopisujete ani si ji nefotíte (pochopení v hlavě) ● Necháte si poradit od konzultanta ⚫ Co není OK ● Pošlete svůj kód kolegovi ● Najdete kód na internetu a zkopírujete ho (Ctrl+C, přepis) ● Napíšete kus kódu kolegovi nebo diktujete co má psát ● … (pokud si nejste jisti, zeptejte se nás) Principy nízkoúrovňového programování 10 http://dkdavis.weebly.com PB07111 Kontakt ⚫ Přednášející ● Petr Švenda, svenda@fi.muni.cz ● konzultační hodiny: přednášky, pátky 8:30 – 11:00 A403 ● dotazy k přednášce, celkové organizaci, známky, eskalace problémů ⚫ Cvičící ● na hodinách – váš primární kontakt, využívejte hojně ⚫ Studentští konzultanti ● dodatečné konzultace nezávisle na skupině ● v definované konzultační hodiny (viz hlavní web) ● od druhého týdne semestru Principy nízkoúrovňového programování 11 IS,1998 2021 PB07112 Sběr zpětné vazby ⚫ Občasné dotazníčky (obtížnost úloh, porozumění...) ⚫ Samozřejmě možné osobně ⚫ Předmětová anketa ● Piště prosím témata/věci/postřehy, které se Vám líbila i nelíbila ● Anketu čteme a předmět podle ní vylepšujeme, má to cenu! ⚫ Velké poděkování všem předem za poznámky a náměty! Principy nízkoúrovňového programování 12 PB07113 Komentáře k slidům z přednášky ⚫ Není nutné se přihlašovat, jakékoli poznámky ke slidům ⚫ Faktické chyby, příliš komplikované (probírat déle), příliš snadné (probírat rychleji), návrh na rozšíření… ⚫ Link na komentovatelné slidy uveden vždy na prvním slidu dané přednášky Principy nízkoúrovňového programování 13 PB07114 Kolektiv PB071 2010-2021 Přímé zapojení: 144 Včetně testerů: >> 200 Zpětná vazba: >> 2000 Principy nízkoúrovňového programování 14 PB07115 Předpoklady, návaznost na další předměty ⚫ Předpoklady ● předchozí zkušenost s libovolným programovacím jazykem (vlastní nebo IB111) ● základy algoritmizace ● (příkazy, podmínky, cykly, funkce, koncept proměnné) ⚫ Na předmět PB071 navazuje ● PB161 Programování v jazyce C++ (3. semestr) ● PB162 Programování v jazyce Java (3. semestr) ● PB173 Tématické programování C/C++ (3,5 sem.) ● práce v laboratořích (nebojte se zeptat) ⚫ Seznam předmětů s programováním na FI ● https://www.fi.muni.cz/studies/index/programming.html.cs Principy nízkoúrovňového programování 15 PB07116 https://www.fi.muni.cz/pb071/tutorials/ Principy nízkoúrovňového programování 16 PB07117 C vs. Python ⚫ Připravili jsme pro vás přehled základních rozdílů ● díky Marku Klučárovi! ● https://www.fi.muni.cz/pb071/man/c-vs-python.html ⚫ Práce na Unixových strojích ● Požadujeme jen elementární základy (ssh, gcc) ● http://www.ee.surrey.ac.uk/Teaching/Unix/ Principy nízkoúrovňového programování 17 “Unix was not designed to stop you from doing stupid things, because that would also stop you from doing clever things” Doug Gwyn PB07118 Organizační Historie, normy Oblasti použití Začínáme s C Nástroje Lehký průlet C Principy nízkoúrovňového programování PB07119 Jazyk C v kontextu ⚫ 1969-73 K-R C (AT&T Bell Labs) ● Brian Kernighan, Dennis Ritchie ● pro systémové programování v rámci UNIXu ● Kniha The C Programming Language (1978) ● Programovací jazyk C, CPress, 2006 ⚫ Imperativní, procedurální, staticky typovaný jazyk ⚫ Není objektově orientovaný ● nejsou přímo jazykové konstrukce (např. typ class) Principy nízkoúrovňového programování 19 série příkazů měnící stav programu typ (většiny) proměnných znám v době překladu podpora strukturovaného programování PB07120Principy nízkoúrovňového programování 20 PB07121 Proč se učit a používat jazyk C ⚫ Porozumění fundamentům provádění výpočtů ● Vysokoúrovňové jazyky spoustu důležitých detailů skrývají ⚫ Nízkoúrovňový jazyk, snadné mapování na strojový kód ● použití na aplikace původně implementované v assembleru ● zdrojový kód kompilovaný do nativního kódu HW platformy ● rychlost, nutnost minimální podpory ze strany běhového prostředí ● velká kontrola nad prostředím ● (With great power comes great responsibility ☺) ⚫ Jeden z nejpopulárnějších jazyků vůbec ● překladač C existuje pro téměř všechny počítačové platformy ● základ pro syntaxi spousty dalších jazyků ⚫ Typicky vysoká rychlost kódu ● https://benchmarksgame-team.pages.debian.net/benchmarksgame/index.html Principy nízkoúrovňového programování 21 PB07122Principy nízkoúrovňového programování 22 http://leftoversalad.com/c/015_programmingpeople/ PB07123 Popularita jazyku Principy nízkoúrovňového programování 23 Normalizovaný výsledek Powells, Delicious, Yahoo Search, Freshmeat, Ohloh, Craigslist, Google Code PB07124 Popularita jazyku Principy nízkoúrovňového programování 24 ⚫ Zjišťovat popularitu jazyků není snadné ● Množství řádek kódu? Počet vývojářů? Počet systémů v daném jazyce? Absolutně nebo přírůstek za čas? ⚫ PYPL PopularitY of Programming Language Index ● Podíl vyhledávání ‘X tutorial’ dle Google Trends https://pypl.github.io/PYPL.html PB07125 ⚫ https://benchmarksgame- team.pages.debian.net/benchmarksgame/which- programs-are-fastest.html Principy nízkoúrovňového programování 25 PB07126 Benchmarks game ⚫ Srovnávat rychlost jazyků není snadné ● Konkrétní úloha, cílový hardware (CPU jádra, cache…) ⚫ Idea testování ● Několik různých, jasně zadaných úkolů ● Spouštěno na jednotné hardware ● Programátoři píší svoje co řešení, to nejrychlejší se počítá ⚫ Pozor na vyhodnocení! Principy nízkoúrovňového programování 26 PB07127 Celkové výsledky přes různé programy Principy nízkoúrovňového programování 27 PB07128 Srovnání rychlostí – práce s poli https://benchmarksgame-team.pages.debian.net/benchmarksgame/performance/revcomp.html Principy nízkoúrovňového programování 28 C++ program (tento konkrétní) není optimalizovaný pro více jader PB07129 Srovnání rychlostí – práce s poli Principy nízkoúrovňového programování 29 PB07130 Srovnání rychlostí – matematické operace Principy nízkoúrovňového programování 30 PB07131 Vhodnost použití jazyka C ⚫ Vhodné využití pro: ● rychlé vědecké výpočty ● systémové aplikace ● programování hardwarových a embedded zařízení ● rychlá grafika (hry), rychlost obecně ⚫ Nevhodné pro ● webové aplikace (PHP, JavaScript…) ● rychlé prototypy (ale nutno znát dobře jiný jazyk) ● větší projekty vyžadující objektově orientovaný návrh (C++, Java…) Principy nízkoúrovňového programování 31 PB07132Principy nízkoúrovňového programování 32 http://programmers.stackexchange.com/questions/159637/ what-is-the-mars-curiosity-rovers-software-built-in PB07133 Normy, standardy a rozšíření ⚫ Kniha The C Programming Language (1978) ● neformální norma ⚫ ANSI X3.159-1989 (ANSI C, Standard C, C89) ⚫ ISO/IEC 9899:1990 (jen převzaté ANSI C, C90) ⚫ ISO/IEC 9899:1999 (C99) ● gcc -std=c99 ● (budeme využívat při psaní a domácích úlohách) ⚫ ISO/IEC 9899:2011 (C11, defacto nejnovější) ● probereme některá rozšíření (vlákna, synchronizace…) ● ISO/IEC 9899:2018 jen opravy ● http://en.wikipedia.org/wiki/C11_(C_standard_revision) ● (Připravován standard C2x - možná 2023) Principy nízkoúrovňového programování 33 PB07134 Nestandardizovaná rozšíření ⚫ Nestandardizované rozšíření ● užitečné prvky jazyka dosud neobsažené v normě (např. gnu99) ● specificky označeny a dokumentovány ⚫ Problém: využívání vede k omezení přenositelnosti ● pro jinou platformu nelze překompilovat bez změny kódu ● omezuje dostupnost programu ● zvyšuje cenu přechodu na jinou platformu (customer lock-in) ⚫ Proč psát programu v souladu s normou? ● lze přímo kompilovat pro jiné platformy - svoboda volby platformy ● svoboda volby kompilátoru, a odolnost vůči jeho změnám ● větší potenciální využití kódu (i jiné projekty/překladače) ● norma může omezit problematické jazykové konstrukce (nižší chybovost) Principy nízkoúrovňového programování 34 PB07135 Jazyk C a další ⚫ Jazyk C/C++ ● překlad přímo do strojového kódu ● překlad nutný zvlášť pro každou platformu ⚫ Další imperativní: Java, C#... ● překlad do mezi jazyku bytecode/CIL ● jedna binárka pro všechny platformy ● (Java Virtual Machine) JVM pro velké množství platforem ● bytecode interpretovaný, ale JIT (Just-In-Time) kompilátor ⚫ Skriptovací imperativní: Perl, Python… ● typicky se interpretuje, platformově nezávislé (pokud je interpret) ⚫ Funcionální: Haskel, LISP… ● jiné paradigma: matematický zápis odvození z počátečních hodnot ⚫ Logické programování: Prolog… ● jiné paradigma: JAK má výsledek vypadat, ne jak se k němu dostat ⚫ Aktuální trend je slučování různých paradigmat Principy nízkoúrovňového programování 35 CPU C/C++ JVM Java interpret Python JIT PB07136 Jazyk C je vysokoúrovňový! ☺ ⚫ “C is a very nice high-level programming language with many of the modern programing constructs in it” https://youtu.be/tc4ROCJYbm0?t=1149 Principy nízkoúrovňového programování 36 PB07137 Historie, normy Oblasti použití Začínáme s C Nástroje Lehký průlet C Principy nízkoúrovňového programování PB07138 Hello World (na Aise) – Pokus 1 Principy nízkoúrovňového programování 38 1. Připojíme se na Aisu (2x, pro edit & pro překlad) ⚫ Unix/Linux: ssh váš_login@aisa.fi.muni.cz ⚫ Windows: Putty váš_login@aisa.fi.muni.cz 2. Vytvoříme soubor s příponou .c (hello.c) ⚫ např. pico hello.c 3. Vložíme funkci se speciálním jménem main ⚫ návratová hodnota int (celé znaménkové číslo - integer) ⚫ zatím bez parametrů (kulaté závorky) 4. Implementujeme tělo funkce main ⚫ do složených závorek {} ⚫ vrátíme hodnotu signalizující úspěšně ukončení (return 0;) ⚫ uložíme int main() { return 0; } PB07139 Hello World (na Aise) – Pokus 1 (pokr.) Principy nízkoúrovňového programování 39 5. Přeložíme ● gcc hello.c ● vznikne soubor a.out 6. Spustíme: ./a.out ⚫ Věci ke zlepšení ● nic nevypisuje ● chybí komentáře ● odstranit warning (no newline at end of file) ● překlad starou verzí gcc (gcc --version) ● kontrola shody vůči standardu PB07140 Hello World (na Aise) – Pokus 2 ⚫ Přidání výpisu na standardní výstup ● typicky konzole, obrazovka ● funkce printf (google: C printf) ⚫ Komentáře Principy nízkoúrovňového programování 40 #include /* This is (possibly) multi line commentary */ int main() { // This is single line comment printf("Hello world\n"); return 0; } knihovna obsahující funkci printf klíčové slovo pro vložení knihovních funkcí funkce pro vytištění řetězce parametr funkce printf, řetězec “Hello world” PB07141 Hello World (na Aise) – Pokus 2 (pokr.) Principy nízkoúrovňového programování 41 ⚫ Při překladu varování (warning) ● warning: no newline at end of file ● přidáme nový řádek na konec zdrojového souboru ⚫ Překlad starou verzí gcc ● Verzi zjistíme pomocí gcc --version ● Na Aise defaultně starší verze 4.8.5 ● My budeme používat 10.2 ● module add gcc-10-2 (přidejte si do .profile) PB07142 Hello World (na Aise) – Pokus 2 (pokr.) ⚫ Kontrola shody vůči standardu ● různé překladače mají různý stupeň podpory ● několik verzí standardu, lze kontrolovat vůči konkrétní ⚫ Přepínače překladače ● gcc hello.c (->a.out) ● default -std=gnu99 (C99 + GNU rozšíření) ● gcc -std=c99 -pedantic -Wall -o hello hello.c ● povinné přepínače pro odevzdání úloh ● -o jméno umožní specifikovat vlastní jméno pro přeložený program (namísto a.out) ● gcc -std=c99 -pedantic -Wall -Wextra -Werror -o hello hello.c ● dodatečné doporučené přepínače Principy nízkoúrovňového programování dodatečné varování varování interpretovat jako error 42 PB07143 Hello World (na Aise) – Pokus 2 (pokr.) Principy nízkoúrovňového programování 43 PB07144 Jak na chyby (error) a varování (warnings)? Principy nízkoúrovňového programování 44 #define PRINT_MESSAGE "Hello World" int main() { // print on stdout printf(PRINT_MESSAGE) return 0; } PB07145 Jak na chyby (error)? Principy nízkoúrovňového programování 45 ⚫ Chyby bránící překladu (error) ● pokud se vyskytnou, nelze program přeložit ● je nutné v každém případě odstranit ⚫ Začněte s odstraňováním první chyby ● další mohou být způsobené tou první soubor obsahující chybu [hello2.c] řádek s chybou (v původním *.c souboru) [5] sloupec s chybou [3] PB07146 Jak na chyby (error)? (pokr.) ⚫ Porozumějte chybové hlášce ● error: expected ';' before 'return' ● v jednoduchých úvozovkách je text z našeho kódu ● mimo uvozovky je text překladače (popis chyby) ⚫ Google je náš programovací přítel ● cut&paste chybovou hlášku ⚫ Prozkoumejte v kódu i řádek o jedna výše ● zapomenuté středníky, závorky apod. se detekují až u následujícího příkazu ⚫ Opravte a přeložte znovu Principy nízkoúrovňového programování 46 #define PRINT_MESSAGE "Hello World" int main() { printf(PRINT_MESSAGE); return 0; } PB07147 Jak na varování (warning)? ⚫ Varování nebrání překladu programu ● typicky ale upozorňují na reálný problém ● může způsobovat problém při sestavení resp. při běhu ⚫ Stejně jako u erroru máte soubor i řádek varování ● vysvětlení hledejte přes Google ⚫ Pravidlo 1: vždy kompilujte bez warnings ● pokud se zobrazuje 100 varování, nevšimnete si 101 ● budou se vám lépe hledat errory ve výpisu ⚫ Přepínač překladače –Werror ● mění varování na error, program se nepřeloží ● ztrácíte ale rozlišení varování vs. error Principy nízkoúrovňového programování 47 PB07148 Jak na varování (warning)? (pokr.) Principy nízkoúrovňového programování 48 ⚫ warning: incompatible implicit declaration of built-in function 'printf' ● implicitní deklarace je použití proměnné/funkce bez toho, aby překladač věděl, co je to za funkci ● printf je funkce, která zde není deklarována ● google printf → #include #include #define PRINT_MESSAGE "Hello World" int main() { printf(PRINT_MESSAGE); return 0; } PB07149Principy nízkoúrovňového programování 49 PB07150 Kahoot! ⚫ Připravte si notebook / telefon s připojením na net ● wlan_fi → http://fadmin.fi.muni.cz/ (Aisa login / heslo) ● Eduroam (učo@eduroam.muni.cz / sekundární heslo) ⚫ Pokud nemáte, nevadí (připojte se k sousedovi) ⚫ Budeme používat v průběhu celého semestru ⚫ Navštivte stránku https://kahoot.it a jdeme na to! ● PB071 Prednaska 01 - Úvod C Principy nízkoúrovňového programování 50 PB07151 PB071 Prednaska 01 - Úvod C Principy nízkoúrovňového programování 51 PB07152 Historie, normy Oblasti použití Začínáme s C Nástroje Lehký průlet C Principy nízkoúrovňového programování PB07153 VERZOVÁNÍ KÓDU Principy nízkoúrovňového programování PB07154 Centrální repozitář (např. SVN) Principy nízkoúrovňového programování 54 Zdroj obrázků: Joomla's Documentation Co když pracujete offline? Co když chcete spolupracovat jen s vybraným uživatelem? PB07155 5+1 důvodů proč verzovat (a používat git) 1. Co když si omylem smažu adresář s kódy? ● Velice inteligentní záloha 2. Co když pracuji ze dvou a více strojů? ● Inteligentní přenos a synchronizace kódů 3. Co když se potřebuji vrátit ke starší verzi kódů? ● Proto, že fungovala nebo v ní zákazník našel chybu 4. Co když pracuji s dvěma a více lidmi? ● Změny probíhají nad stejnou částí kódu 5. Co když spouštím složité analýzy a testy? ● Kontinuální integrace na serveru přes noc Principy nízkoúrovňového programování 55 PB07156 Lokální a centrální repozitář (např. git) Principy nízkoúrovňového programování 56 Zdroj obrázků: Joomla's Documentation PB07157 Situace pro PB071 (git, ale jeden uživatel) Principy nízkoúrovňového programování 57 Git repozitář gitlab.fi.muni.cz Váš počítač - lokální repozitář - zdrojové kódy PB07158 Využití fakultního GitLab serveru Principy nízkoúrovňového programování 58 ⚫ https://gitlab.fi.muni.cz/ ⚫ LDAP Username/password ● Vaše přihlašovací údaje na aisu ⚫ New project → Project name → Create project ⚫ Command line instructions ⚫ Domácí úkoly budou odevzdávány přes Git PB07159 Situace pro PB071 (git, ale jeden uživatel) Principy nízkoúrovňového programování 59 Váš počítač - Otevřít příkazovou řádku ve vhodném adresáři - Vytvořit lokální repozitář: git clone xxx - Soubor README.md přidán do verzování: git add README.md - Uložení změny v README.md do lokálního repozitáře: git commit –m "zpráva" - Uložení změny z lokálního do centrálního repozitáře: git push –u origin master - Stáhnutí změn z centrálního do lokálního repozitáře: git pull Git repozitář - Server gitlab.fi.muni.cz - Repo vytvořeno přes webové rozhraní (návod na https://www.fi.muni.cz/pb071/tutorials/git/) PB07160 Základy gitu - shrnutí ⚫ git clone cesta ● Vytvoří lokální repozitář svázaný s centrálním ● Provádí se jednou pro daný stroj ⚫ git pull ● Stáhne nejnovější verze souborů z centrálního repozitáře do lokálního ● Provádí se při přechodu na váš jiný pracovní stroj a nebo pokud někdo jiný modifikuje souboru v centrálním repozitáři ⚫ git add soubor ● Ne všechny soubory se verzují (*.obj, *.class…) ● Provádí se jednou pro každý soubor, který chcete verzovat ⚫ git commit –m "description of code change" ● Vloží do lokálního repozitáře změny ve všech verzovaných souborech ● Provádí se často po dokončení logického kusu kódu (několikrát denně) ⚫ git push –u origin master ● Vloží změny z lokálního repozitáře do centrálního do větve (branch) master ● Typicky existují alespoň dvě větve: master (stabilní kód) a devel (aktuální vývoj) ● Provádí se relativně často (např. každý den) Principy nízkoúrovňového programování 60 PB07161 .gitignore ⚫ Speciální soubor gitu ve vašem adresáři ⚫ Specifikuje, které lokální soubory se nemají posílat do repositáře (mezivýsledky, videa...) ⚫ U domácích úloh máme předpřipravený .gitignore ● Automatická kontrola přítomnosti před odevzdáním Principy nízkoúrovňového programování 61 # Intermediate compilation files *.o # Resulting binary *.exe # Any other file(s) dont_commit_this.txt # Ignore whole directory /pb071_Qt_4_7_4_for_Desktop_-_MinGW_4_4__Qt_SDK__Debug/ /pb071_Qt_*/ PB07162 KOMPILACE NA AISE Principy nízkoúrovňového programování PB07163 Kompilace Aisa Principy nízkoúrovňového programování 63 ⚫ GNU GCC ● přepínače (-c, -g,-Wall,-Wextra, -o …) ● https://gcc.gnu.org/onlinedocs/gcc-4.5.1/gcc/Option-Summary.html ⚫ Překlad přímo do výsledné binárky ● gcc –std=c99 -pedantic -Wall -o hello hello.c ● (mezivýsledky jsou smazány) ⚫ Spuštění programu ● ./hello PB07164 Překlad po částech 1. Preprocessing "gcc -E hello.c > hello.i" ● rozvinutí maker, expanze include… 2. Kompilace "gcc -S hello.i" (lépe gcc --std=99 -S hello.i) ● syntaktická kontrola kódu, typicky chybová hlášení 3. Sestavení "as hello.s -o hello.o" ● assembly do strojového kódu 4. Linkování "gcc hello.o" ● nahrazení relativních adres absolutními ⚫ Při běžném překladu proběhnou všechny kroky automaticky, nemusíme pouštět každý zvlášť Principy nízkoúrovňového programování 64 PB07165 Překlad po částech - preprocessing Principy nízkoúrovňového programování 65 1. Preprocessing "gcc -E hello2.c > hello2.i" ● rozvinutí maker, expanze #include ● odstranění poznámek #define PRINT_MESSAGE "Hello World" int main() { // print on stdout printf(PRINT_MESSAGE) return 0; } hello2.c PB07166 Překlad po částech - kompilace Principy nízkoúrovňového programování 66 2. Kompilace "gcc -S hello2.i“ (lépe gcc --std=99 -S hello.i) ● překlad do assembleru, syntaktická kontrola kódu ● zde nastává většina chybových hlášení a varování ● vzniká soubor *.s (pokud nejsou chyby) # 1 "hello2.c" # 1 "" # 1 "" # 1 "hello2.c" int main() { printf("Hello World") return 0; } hello2.i PB07167 Překlad po částech – sestavení Principy nízkoúrovňového programování 67 3. Sestavení "as hello2.s -o hello2.o" ● assembly do strojového kódu ● zatím ještě relativní adresy funkcí apod. hello2.s hello2.o PB07168 Překlad po částech – linkování Principy nízkoúrovňového programování 68 4. Linkování "gcc hello2.o" ● nahrazení relativních adres absolutními ● odstranění přebytečných textů apod. ● objevují se chyby linkování ● např. chybějící slíbená implementace funkce ● získáme spustitelný program (možnost parametru –o jméno) PB07169 PB071 Prednaska 01 - Kompilace Principy nízkoúrovňového programování 69 PB07170 Editor ⚫ Samostatný program (vim, nano, pico, joe…) ⚫ Nebo integrovaný v IDE ● všechny mají ● zvýraznění syntaxe, lokalizace chyb, kontextová nápověda… ● např. QT Principy nízkoúrovňového programování 70 PB07171 Integrated Development Environment (IDE) ⚫ Integrovaný soubor nástrojů pro podporu vývoje ● typicky s grafickým rozhraním ● Code::Blocks, Eclipse, Netbeans, Visual Studio, QT Creator, CLion a mnoho dalších ⚫ Obsahuje typicky: ● Způsob vytváření a kompilace celých projektů ● Editor se zvýrazňováním syntaxe ● WISIWIG GUI editor ● Pokročilý debugger ● Profilační a optimalizační nástroje ● Podporu týmové spolupráce… Principy nízkoúrovňového programování 71 PB07172 QT Creator ⚫ IDE spustitelné na běžných OS (Windows, Linux, MacOS) ● pokud ale ovládáte dobře jiné, klidně jej použijte ● oproti Code::Blocks má příjemnější ovládání a lepší ladění ⚫ POZOR: QT není jen IDE, ale i celé API ● pro zajištění přenositelnosti nestandardizovaných operací poskytuje mezivrstvu QT API (Qxxx objekty) ● (přenositelnost zdrojového, nikoli spustitelného kódu) ⚫ QT API nebudeme využívat ● budeme psát a překládat v čistém C ⚫ Tutoriál na https://www.fi.muni.cz/pb071/tutorials/qt- creator/ ⚫ Stahujte na https://www.qt.io/download ● open-source verze (existuje komerční varianta) Principy nízkoúrovňového programování 72 PB07173 Doxygen ⚫ Nástroj obdobný jako JavaDoc pro Javu ● umožňuje generovat dokumentaci z poznámek přímo v kódu ● speciální formát poznámek (více typů) ⚫ Odevzdávané domácí úkoly musí dokumentaci obsahovat ⚫ Tutoriál na https://www.fi.muni.cz/pb071/tutorials/doxygen/ Principy nízkoúrovňového programování 73 /** * Display sizes of basic data types * * @param arraySize size of dynamically allocated array * @return nothing */ void demoDataSizes(int arraySize) { #define ARRAY_SIZE 100 char array[ARRAY_SIZE]; // Fixed size array ... } PB07174 Cppcheck ⚫ Nástroj pro statickou analýzu C/C++ ● Open-source freeware, http://cppcheck.sourceforge.net/ ⚫ Aktivně vyvíjen, poslední verze 1.86 (2018-12-08) ⚫ Široce používaný nástroj ⚫ Příkazová řádka i GUI ⚫ Samostatně stojící verze, plugin do IDE, plugin do verzovacích nástrojů… ● Code::Blocks, Codelite, Eclipse, Jenkins... ● Tortoise SVN… ⚫ Multiplatformní (Windows, Linux, iOS) ● sudo apt-get install cppcheck Principy nízkoúrovňového programování 74 PB07175 Cppcheck Principy nízkoúrovňového programování 75 PB07176 Shrnutí ⚫ Organizační – vše na https://www.fi.muni.cz/pb071 ⚫ Hlavním cílem předmětu je programovat a nadchnout ⚫ Používejte nástroje (default QT Creator, git) ⚫ Domácí úkoly zadávány/probírány na cvičeních ● odevzdání na Aise ⚫ Nebojte se zeptat! ● přednáška, cvičení, poradci, konzultačky... Principy nízkoúrovňového programování 76 PB07177 77 Principy nízkoúrovňového programování • Pokud budete mít během poslechu přednášky dotaz, tak jej vložte na slido.com (#pb071_2022) • Společně projedeme dotazy každé pondělí v 13:00 hodin na online Q&A (odkaz v rozvrhu ISu) #pb071_2022 PB07178 Historie, normy Oblasti použití Začínáme s C Nástroje Lehký průlet C Principy nízkoúrovňového programování PB07179 F2C – demo (K&R) ⚫ Převod stupňů Fahrenheita na stupně Celsia ● celsius = 5 / 9 * (fahr - 32); Principy nízkoúrovňového programování 79 #include int main(void) { int fahr = 0 // promenna pro stupne fahrenheita int celsius = 0; // promenna pro stupne celsia int dolni = 0; // pocatecni mez tabulky int horni = 300; // horni mez int krok = 20; // krok ve stupnich tabulky fahr := dolni; while (fahr <= horni) { celsius = 5 / 9 * (fahr - 32); // vypise prevod pro konkretni hodnotu fahrenheita printf("%d \t %d \n", fahr, celsius); fahr = fahr + krok; } return 0; } Nelze zkompilovat a další problémy PB07180 F2C – demo (problémy) 1. Problém s překladem 2. Problém s celočíselným dělením, implicitní konverze datových typů 3. Výpis proměnných na více číslic 4. Konstanty jako reálná čísla 5. Proměnné jako reálná čísla 6. Výpis proměnných na více desetinných míst 7. Využití příkazu for 8. Symbolické konstanty 9. Samostatná funkce na výpočet převodu Principy nízkoúrovňového programování 80 PB07181 F2C – demo (upraveno) Principy nízkoúrovňového programování 81 #include #define F2C_RATIO (5.0 / 9.0) // samostatná funkce pro vypocet prevodu float f2c(float fahr) { return F2C_RATIO * (fahr - 32); } int main(void) { int fahr = 0; // promenna pro stupne fahrenheita float celsius = 0; // promenna pro stupne celsia int dolni = 0; // pocatecni mez tabulky int horni = 300; // horni mez int krok = 20; // krok ve stupnich tabulky for (fahr = dolni; fahr <= horni; fahr += krok) { celsius = f2c(fahr); // vypise prevod pro konkretni hodnotu fahrenheita printf("%3d \t %6.2f \n", fahr, celsius); } return 0; } PB07182 F2C – se vstupem od uživatele Principy nízkoúrovňového programování 82 #include #define F2C_RATIO (5.0 / 9.0) int main(void) { int fahr = 0; // promenna pro stupne fahrenheita float celsius = 0; // promenna pro stupne celsia int dolni = 0; // pocatecni mez tabulky int horni = 300; // horni mez int krok = 20; // krok ve stupnich tabulky // vypiseme vyzvu na standardni vystup printf("Zadejte pocatecni hodnotu: "); // precteme jedno cele cislo ze standardniho vstupu scanf("%d", &dolni); for (fahr = dolni; fahr <= horni; fahr += krok) { celsius = F2C_RATIO * (fahr - 32); // vypise prevod pro konkretni hodnotu fahrenheita printf("%3d \t %6.2f \n", fahr, celsius); } return 0; } PB07183 Co si můžete hned doma vyzkoušet ⚫ Připojte se na Aisu a zkuste kompilaci s gcc ⚫ Nainstalujte QT Creator, zkuste si vytvořit projekt ⚫ Pohrajte si s git ● založte si git repozitář na gitlab.fi.muni.cz ⚫ Nalaďte si http://www.se-radio.net/ ☺ Principy nízkoúrovňového programování 83