Podrobná dokumentácia všetkých postupov a nástrojov používaných v predmete.
Akékoľvek návrhy, chyby a iné pripomienky prijímame emailom alebo v diskusnom fóre predmetu.
Spätnú väzbu oceníme a pomôže to tiež ostatným študentom! 🙂
Začíname
Návody v tomto manuáli slúžia na to, aby sme vedeli používať a nastaviť si všetky nástroje, ktoré počas predmetu budeme používať, či už doma, alebo na fakultných počítačoch.
Kapitoly manuálu sú rozdelené podľa operačných systémov, každému OS sa totiž viaže rozdielna sada nástrojov/postupov. Pri výbere určitej cesty je vhodné dohodnúť sa s cvičiacim. Nemusí nám totiž vedieť neskôr poradiť.
V úvode kapitoly sú uvedené možnosti, ako na danom OS pracovať:
Odovzdávanie a kontrola domácich úloh prebieha na študentskom serveri Aisa, s ktorým sa na začiatku zoznámime. Na fakultných počítačoch/Aise nemusia byť vždy dostupné všetky programy, ktoré potrebujeme, programy ale môžeme pridať cez modulový systém.
Na prvej prednáške tiež budú predstavené programy na spravovanie kódu, verzovacie systémy — konkrétne git, pomocou ktorého budeme ukladať svoj kód.
Rozdiely oproti jazyku Python
Po prvých cvičeniach tiež pravdepodobne budeme dosť uvažovať nad syntaxou C a odporúčame čerstvo po absolvovaní Úvodu do programovania pozrieť rozdiely oproti jazyku Python.
Kde hľadať dokumentáciu jazyka
-
Ak vyvíjame na Linuxe alebo macOS, najlepšie sú vstavané manuálové stránky — zobrazíme ich príkazom man.
niektoré funkcie v C sa prekrývajú s názvami príkazov a vtedy je potrebné povedať, že chceme otvoriť kapitolu 3: man printf
zobrazí bash príkaz, zatiaľ čoman 3 printf
nám ukáže knižničnú funkciu, ktorú hľadáme. -
Veľmi presná dokumentácia C/C++. Vyhľadávanie nefunguje na približné slová — je treba hľadať cez externý vyhľadávač.
-
Webová aplikácia zjednocujúca veľké množstvo dokumentácií. Pre C využíva údaje z cppreference.
|
Aisa a kontr, pripojenie pomocou ssh
Aisa je náš študentský fakultný server. Funguje na ňom program kontr, ktorý hodnotí domáce úlohy.
Na server sa pripájame programom ssh:
ssh LOGIN@aisa.fi.muni.cz
a na fakultných strojoch stačí iba ssh aisa
.
Namiesto LOGIN
napíšeme svoj fakultný login, obvykle je tvaru
xčasť_priezviska
alebo xUČO
.
Fakultný login je možné zistiť napríklad v aplikácii Změna hesla pro systémy Fakulty informatiky, kde sa dá zároveň zmeniť fakultné heslo. |
Po prihlásení vyzerá spustenie skriptu na odovzdanie úlohy nasledovne:
/home/kontr/odevzdavam pb071 hw0X {nanecisto/naostro}
.
Pred každým odovzdaním úlohy si nezabudneme skontrolovať, že bez chýb sa skompiluje aj na Aise. Pravdepodobne na vlastnom stroji používame inú verziu kompilátora s inými prepínačmi, prípadne pri vývoji na Windows nepoužívame linuxové nástroje vôbec. Ich chovanie totiž nebýva vždy rovnaké. |
Moduly
Viaceré programy sa užívateľovi sprístupnia až na požiadanie. Slúži na to príkaz module:
module add MODULE_NAME
|
načíta jednorazovo modul; môžeme využiť Tab na doplňovanie názvov |
module list
|
zobrazí aktuálne načítané moduly |
Na Aise môžeme potrebovať moduly:
-
cmake-3.6.2 (k dispozícii je totiž stará verzia)
-
vim-8.0 (pre našu konfiguráciu vimu)
-
llvm-11.0.0 pre clang-tidy/format
Na fakultných počítačoch:
-
pre IDE: qtsdk pre Qt Creator a clion pre CLion.
-
llvm-11.0.0 pre clang-tidy/format
Pri zadávaní mena modulu dvojnásobným Tab vyvoláme všetky možnosti, niekedy rôzne/novšie verzie. U IDE si môžeme všimnúť aj verzie značené -local — tieto uprednostníme. |
Automatické načítanie modulov
Možné pridaním príkazov do súboru .bashrc
v domovskom adresári (~/.bashrc
). Príkazy v .bashrc
sa vykonávajú pri
spustení programu bash, teda napríklad pri prihlásení. Pridanie modulov cmake-3.6.2 a llvm-11.0.0 spolu s kontrolou,
že máme k dispozícii moduly, nastavíme pridaním nasledujúcich riadkov na koniec súboru .bashrc
:
# pb071
if type -t module >/dev/null; then
module add cmake-3.6.2
module add llvm-11.0.0
# add other modules here if needed
fi
Na editovanie súboru môžeme použiť napríklad vim. |
(voliteľné) SSH kľúče a automatické prihlasovanie
Slúžia miesto hesla na identifikáciu užívateľa voči serveru. S ich použitím teda pri prihlasovaní na Aisu programom ssh nepotrebujeme zadať heslo a rovnako to platí pre všetky nástroje, ktoré ssh využívajú — ako je git, scp a iné.
Vygenerovanie vlastných kľúčov
-
Pár súkromný/verejný kľúč vygenerujeme nástrojom ssh-keygen:
ssh-keygen -t ed25519 -C "xlogin@fi"
Prepínačom
-t
zvolíme novší a bezpečnejší formát a-C
je nepovinný komentár, ktorý pomenuje kľúč. -
Nástroj sa nás spýta na miesto uloženia kľúčov, ktoré iba Enter potvrdíme, aby sme sa vyhli dodatočným nastaveniam.
-
Ďalej sa nás spýta na heslo. Je veľmi dôležité chrániť kľúč šifrovaním, no nie je to vyžadované a heslo sa dá vynechať dvojitým Enter.
-
Vypíše nám umiestnenie oboch kľúčov:
Your identification has been saved in /home/<xlogin>/.ssh/id_ed25519. Your public key…
, cestu k nim budeme neskôr potrebovať.
Nastavenie automatického prihlasovania
-
Svoj verejný kľúč uložíme na Aisu, do
~/.ssh/authorized_keys
, pomocou ssh-copy-id:ssh-copy-id xlogin@aisa.fi.muni.cz
-
Aby sme pri práci s gitom nemuseli zadávať heslo, svoj verejný kľúč uložíme do služby, ktorá spravuje repozitáre. Mali by sme ho nájsť v súbore
~/.ssh/id_ed25519.pub
, ktorý vypíšeme na terminál príkazomcat ~/.ssh/id_ed25519.pub
. Po skopírovaní kľúč vložíme do fakultného GitLabu. -
Následne sa už môžeme prihlasovať na Aisu bez zadávania hesla. Kľúč ssh automaticky rozpozná (preto sme nemenili jeho cestu alebo názov):
ssh xlogin@aisa.fi.muni.cz
Poznámky
Šifrovanie kľúčov a SSH agenti
Nešifrovaný súkromný kľúč je ako heslo prilepené na monitore — hocikto s prístupom k nemu ho môže zneužiť. Pokiaľ ale kľúč šifrujeme heslom, musíme ho pri každom jeho použití zadať znova, čím sa nám zjavne stratí najväčšia výhoda v ich používaní — automatické prihlasovanie.

SSH agent je program, ktorý si po dobu prihlásenia dešifrovaný kľúč zapamätá a poskytne ho za nás.
Skratky, používanie viacero kľúčov naraz
Konfiguráciu môžeme uviesť v súbore ~/.ssh/config
. Nasledujúci príkaz nám umožní pripájať sa na Aisu pomocou kľúču id_ed25519
iba pomocou ssh aisa
:
cat <<EOF >>~/.ssh/config
Host aisa
Hostname aisa.fi.muni.cz
User XLOGIN
IdentitiesOnly yes
IdentityFile ~/.ssh/id_ed25519
EOF
Vývoj na Linuxe
Linux je v učebniach bežný, používa ho tiež väčšina cvičiacich a kontr. Jeho prostredie je na vývoj programov v C ideálne, vzhľadom na to, že Linux, a teraz ako jadro operačného systému, je v C napísaný.
Možnosti
Textové editory
Na začiatok je možné kód editovať iba v termináli, v textovom editore ako napríklad vim. Je to náročnejšia cesta, vhodná skôr pre ľudí zaujímajúcich sa o Linux, lebo zároveň je potrebné učiť sa ovládať daný editor. Dá nám to ale dokonalé porozumenie toho, čo robíme, a v procese sa tiež často lepšie naučíme používať Linux. Chvíľami sa tiež môžeme cítiť ako hacker.
IDE
Vývoj v IDE, vývojovom prostredí, spočíva v jednom programe, ktorý má v sebe všetky nástroje, ktoré by sme inak spúšťali v termináli.
Na fakultných počítačoch si IDE pridáme aktivovaním modulov.
Pri používaní IDE často zabúdame na procesy, ktoré pred nami IDE skrýva — z jednoduchej kompilácie sa tak môže stať mágia. Práve preto môžu niektorí cvičiaci odporučiť skôr textový editor. |
Shell a bash
Shell je vrchná vrstva operačného systému, ktorá nám ho umožňuje ovládať — nazývame ho užívateľským rozhraním. Bežne ho reprezentuje terminál (CLI) alebo grafické prostredie (GUI). Príkladom GUI je bežné desktopové prostredie s oknovým systémom, teda pracovná plocha a okná s programami.
Na Linuxe je okrem GUI bežné ovládanie pomocou textu — príkazového riadku, zadávaním príkazov do terminálu (dnes sa spomína aj názov konzola, kedysi mali pojmy iný význam, viď. wiki).
Bash je program, s ktorým v termináli komunikujeme — je implementáciou terminálového shellu. Interpretuje naše príkazy, umožňuje nám spúšťať programy a dokonca aj písať skripty.
V príklade nám ukazuje užívateľské meno — xrehacek
, na ktorom počítači sme — @home
, v ktorom adresári sa nachádzame — ~/pb071
a za symbolom doláru $
očakáva náš príkaz (taký symbol s čakaním na vstup voláme prompt).
Užitočné znalosti
Pracovný adresár (current working directory/cwd) je aktuálne zvolený adresár, v ktorom robíme zmeny. V termináli je zobrazený pred našimi príkazmi.
Absolútna cesta začína vždy /
, teda od koreňového adresára.
Relatívna cesta pokračuje od nášho pracovného adresára.
Vlnka ~
(en: tilde) je skratka pre náš domovský adresár (home directory), umiestnený v /home/USERNAME/
, ktorý obsahuje naše súbory.
Ak sa nachádzame v domovskom adresári a chceme vstúpiť do adresáru pb071, môžeme vykonať cd pb071
(relatívna cesta) alebo cd /home/USERNAME/pb071
(absolútna cesta).
Ak by sme sa nachádzali mimo nášho dom. adresára, využijeme vlnku, teda cd ~/pb071
.
Na vstup do domovského adresára použijeme iba cd
.
Každý adresár obsahuje dva špeciálne súbory: .
, ktorá je odkazom na aktuálny adresár; a ..
ako odkaz na rodičovský adresár. Cesta cd ../..
by nás dostala o dva adresáre vyššie.
Neštandardné programy (naše, ktoré budeme kompilovať) sa spúšťajú z bezpečnostných dôvodov pridaním ./
pred názov programu. Napríklad ./hw01
. Potrebujeme totiž odlíšiť bežné programy/príkazy od tých, čo sú v aktuálnom adresári pod rovnakým názvom — aby sa nám nestalo, že ls zmaže celý systém.
Klávesové skratky
Tab požiada o inteligentné doplnenie príkazu. Doplňuje napríklad cestu u príkazov ako cd alebo mv. Dvojité stlačenie môže zobraziť všetky možnosti, napríklad u ls.
Ctrl+r hľadá v histórii príkazov
↑ alebo ↓ prechádza cez históriu príkazov
Ctrl+c požiada program o ukončenie; zmaže rozpísaný riadok s príkazom
Ctrl+d vyšle na terminál symbol konca súboru (EOF, end of file). Ukončí tým načítavanie vstupu u niektorých príkazov (ako cat).
Ctrl+l vyčistí terminál
Extra tip: text býva po označení skopírovaný a môžeme ho vložiť pravým tlačidlom myši. |
Základné príkazy
príkaz | syntax a význam | príklad |
---|---|---|
ls |
výpis súborov |
|
cd |
zmena pracovného adresára |
|
mkdir |
vytvorenie adresárov |
|
rm |
zmazanie súborov bez potvrdenia |
|
cat |
výpis obsahu súboru, spájanie súborov |
|
less |
zobrazuje súbory (bez výpisu na terminál) |
|
cp |
kopíruje súbory a adresáre (bez |
|
mv |
premenuje alebo presunie súbory a adresáre (bez |
|
grep |
vyhľadáva v súboroch |
|
zobrazí interaktívnu nápovedu |
|
Presmerovanie vstupu a výstupu
Operátor >
dokáže uložiť výstup programu do súboru, výstup presmeruje z nášho terminálu.
out.txt
vytvorí, prípadne pred zápisom zmaže jeho obsah)./a > out.txt
Operátor append >>
využijeme, ak súbor nechceme prepísať:
cat hello.c >> hello2.c
Napríklad v spojení s programom diff môžeme porovnať výstup svojho programu s referenčnou implementáciou, aby sme predišli ťažko všimnuteľným chýbam (často nadbytočné medzery, whitespace).
./a > a.txt && ./b > b.txt && diff a.txt b.txt
cat > hello.c
Operátorom |
(pipe, rúra) prepojí štandardný výstup programu vľavo so štandardným vstupom programu vpravo. Analógia rúry naozaj sedí: na jednom konci program do rúry posiela veci, ktoré tečú na druhý koniec rúry niekomu inému.
ls -la | grep 'file'
Porovnanie výstupu programov
<()
, process substitution)diff <(./a) <(./b)
vimdiff <(./a) <(./b)
Terminálové nástroje
Inštalácia
Na Ubuntu všetky potrebné nástroje nainštalujeme príkazom:
sudo apt install git vim cmake gcc g++ gdb valgrind cppcheck clang-tidy clang-format
sudo
|
superuser do, je požiadanie o administrátorské práva pre nasledujúci príkaz (zjednodušene) |
apt
|
je správca balíkov (package manager), umožňuje ľahko inštalovať/mazať programy |
install
|
je príkaz pre apt a zároveň jeho prvý parameter. Oznámi, že nasledujúce parametre sú názvy programov |
Počas inštalácie väčšieho množstva balíkov nás apt požiada o súhlas. Pokiaľ inštalácia skončí neúspešne, je možno potrebné aktualizovať zoznamy balíkov:
sudo apt update
Na odlišnej distribúcii je potrebné nahradiť apt odpovedajúcim správcom balíkov. |
git (verzovací systém)
V praxi najpoužívanejší nástroj na spravovanie kódu a v rámci predmetu ho budeme používať na odovzdávanie domácich úloh. Používa sa, pretože:
-
umožňuje spoluprácu viacerých ľudí alebo prácu na viacerých počítačoch naraz
-
je menšie riziko, že kód stratíme, lebo kópia repozitára môže byť aj na serveri
-
môžeme sa vrátiť k všetkým verziám kódu, porovnávať ich a tak napr. nájsť chybu
Repozitáre spravujeme cez webové rozhranie fakultného GitLabu.
Zadávanie hesla pri príkazoch je možné nahradiť SSH kľúčmi.
Zverejnenie repozitára pb071 s domácimi úlohami alebo pridanie iných členov do repozitára ako v inštrukciách je proti pravidlám a prísne sa trestá.
|
.gitignore
Súbor, ktorý gitu povie, ktoré súbory nemá verzovať — aby sme do repozitára nezaniesli súbory, ktoré sú nežiaduce: zostatky z kompilácie, dočasné súbory IDE a iné. Tieto súbory potom neukazuje ani git status
. Podrobný popis v oficiálnej dokumentácii.
Do repozitára vložíme .gitignore
vhodný pre náš predmet. Ak sa nachádzame v repozitári v termináli je to tiež možné príkazom:
wget https://www.fi.muni.cz/pb071/man/for-students/gitignore -O .gitignore
git add .gitignore
git commit -m 'Add .gitignore'
Veľkosť repozitára kontroluje Kontr pri odovzdávaní úloh. Po prekročení limitu úlohu odovzdať nepôjde a za nové založenie repozitára sa strhávajú body! Preto je .gitignore dôležitý.
|
.gitlab-ci.yml
Tento súbor všeobecne popisuje úlohy, ktoré má GitLab urobiť, keď nastanú nejaké udalosti (napr. vznikne commit, merge request, …).
Súbor .gitlab-ci.yml
pripravený pre tento predmet spustí v adresároch, kde sa zmenili nejaké súbory, priložené testy.
Nie je síce povinný, ale dovolí nám pohodlnejšie overiť, že naše riešenie funguje voči našim testom, kým ho vyskúšame na Aise alebo v odovzdaní nanečisto.
Na testoch navyše spúšta aj nástroj valgrind.
Súbor do repozitára vložíme v termináli príkazom:
wget https://www.fi.muni.cz/pb071/man/for-students/gitlab-ci.yml -O .gitlab-ci.yml
git add .gitlab-ci.yml
git commit -m 'Add .gitlab-ci.yml'
Stále však platí, že pred odovzdaním naostro je vhodné si vyskúšať kompiláciu na Aise a odovzdanie nanečisto. Prostredie v GitLab CI je trochu odlišné, než to na Aise, a testy v ňom nemusia odhaliť všetky chyby. |
Základné príkazy
|
vytvorí lokálnu kópiu repozitára do nového adresára |
|
aktualizuje lokálny repozitár: stiahne zo vzdialeného repozitára všetky zmeny a pokúsi sa ich aplikovať |
|
aktualizuje vzdialený repozitár: pokúsi sa naše zmeny odoslať do vzdialeného repozitára |
|
|
|
zaradí súbory so zmenou do ďalšieho commitu (označí ich staged) |
|
zo zmien označených ako staged vytvorí novú verziu repozitára |
Bežný postup
-
aktualizovanie lokálneho repozitára, stiahneme zmeny z GitLabu:
git pull --rebase
-
programujeme
-
zobrazíme si zmeny:
git status
-
zahrnieme súbory do commitu:
git add
-
znova
git status
, skontrolujeme, či do commitu patria len správne súbory -
vytvoríme commit:
git commit -m "<message>"
-
aktualizujeme repozitár na GitLabe, zverejníme zmeny:
git push
-
prvýkrát potrebné povedať kam:
git push -u origin master
-
-
skontrolujeme, či sú správne zmeny naozaj na GitLabe a prípadne odovzdáme úlohu
Ak sme pracovali stále na rovnakom počítači, môžeme vynechať kroky, ktoré majú za cieľ synchronizovať náš lokálny repozitár so vzdialeným, teda pull
a push
.
Väčšina IDE nám umožní git ovládať priamo z GUI, teda bez písania príkazov. |
Učebné materiály
-
11 minútový vizuálny návod „A Grip On Git“ od Vincenta Tunru (na konci obsahuje pokročilejšie veci)
-
Interaktívna vizualizácia možných príkazov, Andrew Peterson (je potrebné rozumieť základom)
vim (textový editor)
Veľmi populárny textový editor. Je dostupný všade a tým umožňuje pracovať z ľubovoľného počítača, ktorý má aspoň možnosť vzdialeného pripojenia. Umožňuje rôzne úpravy vo forme pluginov, ktorých je dostupných ozaj mnoho. Vyžaduje znalosť klávesových skratiek a jeho učenie môže byť dlhší proces.
Výbornou príležitosťou ako sa zoznámiť so základmi je voľne dostupný ebook „Vim for humans“ od Vincenta Jousse (možné stiahnuť aj bez príspevku).
Agresívnym stláčaním ESC a napísaním :q!
Enter sa vim zatvorí (možno).

Nastavenie, vimrc
Konfigurácia vimu sa načíta zo súborov ~/.vim/vimrc
prípadne ~/.vimrc
, ak existujú. V adresári ~/.vim/
často nájdeme aj iné súbory pre vim, napríklad farebné témy v colors
.
Pre predmet sme pripravili ukážkový vimrc, ktorý nám nastaví základné veci, farby a okrem toho aj jednoduché zvýrazňovanie syntaktických chýb:
-
vimrc
stiahneme do adresára~/.vim/
:-
Najskôr overíme, že adresár neexistuje, očakávame chybu:
ls ~/.vim
-
Následne stiahneme pomocou web get:
wget -P ~/.vim/ https://www.fi.muni.cz/pb071/man/for-students/vimrc
-
-
Na zvýrazňovanie chýb potrebujeme vim aspoň verzie 8, na Aise potrebujeme aktivovať modul. Ak máme ale starší vim, nič sa nestane, iba nebude fungovať zvýrazňovanie. Verziu prípadne zistíme príkazom
vim --version
. -
Nainštalujeme správcu pluginov Plug:
curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
-
Vim spustíme, mal by sa okrem iného sťažovať, že mu chýba farebná téma a vyžadovať Enter. Akonáhle sa nám vim zobrazí, ručne napíšeme nasledujúce (zobrazuje sa vľavo dole):
:PlugInstall
-
Počkáme, kým Plug nainštaluje pluginy a okno môžeme zatvoriť pomocou vim príkazu :q.
Zvýrazňovanie chýb nám zabezpečuje plugin ALE, nie je ale dokonalé – občas budeme mať vďaka chybám označený aj iný riadok. Dôležité je zamyslieť sa, čo chybu naozaj spôsobuje.
Vim ako predvolený editor (napríklad pre git) nastavíme príkazom:
printf "export VISUAL=vim\nexport EDITOR='\$VISUAL'\n" >> ~/.bashrc
Ovládanie
Režimy |
---|
ESC normal mode, zadávame v ňom príkazy pre vim |
Pohyb | ||
---|---|---|
Bez použitia šípiek |
Slová |
|
← h j ↓ ↑ k l → |
w na (nasledujúci) začiatok slova |
|
Vyhľadávanie |
Riadky |
|
/<vyhľadávaný text> |
0 začiatok riadku |
gg prvý riadok |
Príkazy (zadávajú sa v normal mode) | |
---|---|
Súbor |
Písanie |
:w uloží súbor (write) |
x zmaže znak |
Kombinácie (v normal mode) | |
---|---|
Ako? |
Príklady |
operátor [číslo] pohyb operátor čo vykonať, napr. d, x, y… |
2w posunie kurzor o 2 slová ďalej |
cmake, make (automatizácia prekladu)
Aby sme sa vyhli manuálnemu písaniu zložitých príkazov pri kompilácii, používajú sa build systémy, ktoré za nás budú riadiť celú kompiláciu. V predmete budeme na ich generovanie používať program CMake, ktorému povieme:
-
ako sa má program skompilovať
-
z ktorých súborov sa má skompilovať
-
aké súbory má vygenerovať
Tieto nastavenia ukladáme v CMakeLists.txt
. Tento súbor zároveň predstavuje „projekt“, ktorý vedia načítať aj jednotlivé IDE.
Čo vlastne cmake robí? Vygeneruje pre náš projekt build systém. Dôležitý je najmä súbor Makefile
, ktorý je vstupom pre ďalší nástroj, make. Generovanie spustíme v adresári projektu príkazom:
cmake -S . -Bbuild
-S .
|
znamená, že zdrojové súbory (source) sú v aktuálnom adresári ( |
-Bbuild
|
znamená, že generujeme do adresáru |
Na Aise je potrebné aktivovať novšiu verziu — Aisa/moduly. |
Make je už nástroj, ktorý čítaním Makefile riadi build, teda zostavenie programu. Presunieme sa do adresáru, ktorý vygeneroval cmake, a spustíme ho bez parametrov:
cd build && make
Vo výstupe môžeme pozorovať, ako zadáva pokyny kompilátoru (typicky gcc). Výsledkom je už spustiteľný súbor, „binárka“. Ak program chceme spustiť, musíme pred jeho meno zadať ./
(objasňuje Linux/Užitočné znalosti).
Veľkou výhodou je tiež to, že po zmene v jednom súbore sa nemusí znova kompilovať celý program, iba jeho časť, čo celý proces výrazne urýchli.
Súbory vygenerované pomocou make sa dajú typicky odstrániť vykonaním make clean .Cmake volí kompilátor podľa premennej prostredia CC . export CC=gcc by vynútil kompilátor gcc.
|
gcc (kompilácia)
Na kompiláciu v tomto predmete využívame program gcc. Bežne ho ale neuvidíme, pretože príkazy za nás bude zadávať make. Alternatívnou voľbou môže byť kompilátor clang.
Ak by sme mali jednoduchý program, kompilácia bez make by vyzerala nasledovne:
gcc -std=c99 -o BINARY_NAME [sources]
-std=c99
|
upresní, že používame štandard/verziu jazyka c99 |
-o BINARY_NAME
|
názov výsledného programu (vynechaním vznikne |
Kontr navyše kompiluje úlohy s prepínačmi:
-pedantic
|
prísnejšie vynúti štandard, upozorní, ak použijeme rozšírenie jazyka |
-Wall -Wextra
|
zapne všetky upozornenia |
-Werror
|
upozornenia zmení na kompilačné chyby |
valgrind (ladenie)
Nástroj určený na hľadanie chýb pri práci s pamäťou. Upozorní napríklad na memory leaky, používanie neinicializovaných premenných, prístup do pamäte, ktorá nie je alokovaná, viacnásobné volanie free.
Kontrolu vykonáme príkazom:
valgrind --leak-check=full --show-reachable=yes ./<program_name>
Príklad použitia
Máme program, ktorý obsahuje iba jednu alokáciu, na ktorú zabudneme použiť free:
.leak.c
#include <stdlib.h>
int main(void)
{
int *leak = malloc(sizeof(int));
return 0;
}
Program skompilujeme s ladiacimi informáciami pomocou prepínača -g
alebo -ggdb
, aby nám valgrind ukázal čísla riadkov. Potom program vo valgrinde spustíme:
gcc -g -o leak leak.c
valgrind --leak-check=full --show-reachable=yes ./leak
Vo výstupe si všimneme:
HEAP SUMMARY:
in use at exit: 42 bytes in 1 blocks (1)
total heap usage: 1 allocs, 0 frees, 42 bytes allocated (2)
42 bytes in 1 blocks are definitely lost in loss record 1 of 1 (3)
at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) (4)
by 0x10865B: main (leak.c:4) (5)
LEAK SUMMARY:
definitely lost: 42 bytes in 1 blocks
...
ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
1 | pri ukončení programu sa používalo 42B pamäte |
2 | alokovali sme jedenkrát pamäť, nič sme neuvoľnili, alokovaných bolo spolu 42B |
3 | nastal memory leak veľkosti 42B |
4 | leak spôsobila funkcia malloc |
5 | malloc volala funkcia main, v súbore leak.c, na 4. riadku |
Statické analýzatory
Hľadajú podozrivé časti kódu, ktoré by mohli naznačovať chybu. Označujú sa ako statické, pretože kontrola prebieha bez spustenia programu. Nie všetky chyby sa ale dajú odhaliť automaticky.
cppcheck
*.c
):cppcheck hello.c
Nástroj na Aise nebol dostupný v čase písania manuálu (30. jan 2019). |
clang-tidy
Do svojho repozitára vložíme konfiguráciu pre pb071 (.clang-tidy). clang-tidy automaticky hľadá konfiguráciu v aktuálnom adresári alebo v niektorom z jeho rodičov.
clang-tidy hello.c -- -std=c99
clang-tidy *.c -- -std=c99
Na Aise je dostupný po aktivovaní modulu llvm-11.0.0. |
clang-format (formátovanie kódu)
Automaticky naformátuje kód podľa štýlu, definovaného v súbore.
Do svojho repozitára vložíme štýl pre pb071 (.clang-format) a codestyle.txt. Kontr bude pri spustení hľadať názov štýlu v codestyle.txt
, ktorý sa bude aplikovať, a clang-fomat bude hľadať konfiguráciu v .clang-format
.
clang-format -style=file -i hello.c
-style=file
|
má sa hľadať súbor so štýlom |
-i
|
súbor sa hneď prepíše; bez prepínača sa opravený kód vypíše na štandardný výstup |
Iné štýly sú k dispozícii na gitlab.fi.muni.cz/pb071/codestyles.
Iné užitočné nástroje
nano
|
veľmi jednoduchý textový editor, skratky na ovládanie sú v spodnej časti obrazovky |
mc
|
midnight commander, súborový manažér |
scp
|
zabezpečený prenos súborov cez ssh
|
sftp
|
podobný scp, viac interaktívny |
rsync
|
nezabezpečený prenos väčšieho množstva/väčších súborov, oproti scp oveľa rýchlejší |
wget
|
stiahnutie súboru z webu |
Terminal multiplexing
Umožňuje pracovať s viacerými programami v jednom terminálovom okne alebo si rozpracované veci uložiť ako sedenie a otvoriť na inom počítači. Slúžia na to terminálové multiplexery, konkrétne program tmux (Ham Vocke, A Quick and Easy Guide to tmux).
Po jeho spustení vytvorí sedenie (session), v ktorom môžeme deliť obrazovku na viac virtuálnych terminálov, prípadne otvárať nové okná. Ak sa odhlásime, sedenie nemusíme ukončiť — presunie sa iba do pozadia. Po opätovnom prihlásení si sedenie môžeme otvoriť a pokračovať s rovnakým rozdelením okna a aj otvorenými programami.
Pomerne novou možnosťou je program byobu, ktorý ale nie je naozaj terminálový multiplexer, ale moderná nadstavba nad tmux. Vyznačuje sa jednoduchým užívateľským rozhraním so zabudovanou nápovedou a oproti tmuxu sa ovláda najmä za pomoci funkčných kláves F1-F12, inak je funkcionalita oboch programov v podstate totožná.
Vývoj na Windows
Na Windows máme viac možných ciest, používať budeme vývojové prostredia (viac o IDE).
Na vlastnom počítači máme dve možnosti vyskúšať Linux. Buď v podobe WSL, čo je simulácia Linuxu vytvorená Microsoftom, prípadne môžeme ozajstný Linux virtualizovať — spustiť bez inštalácie „v okne“. Tieto možnosti sú super, ak máme cvičenia v učebni s Linuxom.
Terminál je dostupný ako program Powershell. Pokiaľ máme WSL, používame bash terminál našej distribúcie rovnako ako na Linuxe.
Dalšia z možností je pracovať s IDE Qt Creator. Ten nastavíme tak, aby používal sadu nástrojov MinGW, ktoré nám na Windows umožnia vytvoriť program v C.
V názvoch ciest nepoužívame medzery a používame iba znaky ASCII! To platí na umiestnenie nástrojov pri ich inštalácii, a rovnako aj pri programovaní, kde máme uložené zdrojové súbory, respektíve repozitár. Problémový je v tom prípade adresár Program Files/ alebo názov užívateľa s medzerou/diakritikou v Users/ .
|
Možnosti
1. Windows Subsystem for Linux + CLion/Vim
Linux, a teraz ako jadro operačného systému, je napísaný v C. Jeho prostredie je teda na C prirodzene prispôsobené. Viaceré nástroje — a nielen pre C, ale majoritu jazykov — sú pre Linux. Uvedomil si to aj Microsoft a aktívne vyvíja jeho simuláciu — WSL — priamo vo Windows, aby uľahčil vývojárom prácu.

Všetky potrebné nástroje budeme mať k dispozícii v jednom termináli. Neprídeme o grafické rozhranie — zvolíme IDE, ktoré podporuje spoluprácu s WSL, uvádzame návod pre CLion (alternatívnou možnosťou, ktorú manuál nepokrýva, je aj VS Code).
Postup je nasledujúci:
-
Pripravíme CLion:
-
Nainštalujeme nástroje pre CLion príkazom (v termináli WSL):
sudo apt-get install cmake gcc clang gdb build-essential
-
Spustíme CLion a v
vytvoríme nový toolchain:-
v Toolset vyberieme požadovanú WSL distribúciu.
-
keď máme toolchain nastavený, predvolíme ho tak, že použijeme šípku hore (naľavo od formuláru, v stĺpci s definovanými toolchainami)
-
správna konfigurácia potom vyzerá nasledovne:
Toolchain pre WSLV prípade nejasností alebo problémov je k dispozícii aj dokumentácia JetBrains.
-
-
S WSL ďalej pracujeme presne ako na Linuxe, používame rovnaké nástroje.
2. Qt Creator + MinGW
Vzhľadom na to, že úlohy sa kontrolujú na Linuxe, niekedy môže dôjsť k odlišnému správaniu a vždy potrebujeme program otestovať aj na Aise.

Budeme potrebovať inštalovať niekoľko pomocných nástrojov. Postup je nasledujúci:
-
Pripravíme dodatočné nástroje:
-
CMake
-
Git for Windows
-
Dr. Memory
-
-
Nainštalujeme Qt Creator.
Pripojenie na fakultný server
-
Z terminálu pomocou programu ssh. Pripojenie je popísané v kapitole Aisa a Kontr, SSH.
-
S WSL ako na Linuxe.
-
Cez Powershell, Windows 10 má od verzie 1803 (April 2018) ssh vstavané.
-
-
Ako záložná možnosť SSH klientom Putty.
Windows Subsystem for Linux (WSL)
Umožňuje vývojárom priamo vo Windows spúšťať programy určené pre Linux. Nespomaľuje systém.
Nevýhodou môže byť fakt, že k dispozícii nemáme plnohodnotné grafické prostredie, ako sme zvyknutí na typickej distribúcii Linuxu. Tento problém sa ale prekonať dá, viaceré IDE už totiž umožňujú s WSL spoluprácu — kedy IDE pobeží vo Windows, no všetky potrebné veci, ako napríklad kompiláciu a ladenie, vykonáva vo WSL. Možnosťou je tiež vyhnúť sa IDE úplne a programovať v textovom editore v termináli.
Existuje spôsob, ako prenášať aj grafické aplikácie — X11 forwarding — ktorému sa manuál nevenuje. |
Aktivácia
WSL je dostupný iba na Windows 10! |
-
Spustíme Powershell ako správca a vykonáme:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
-
Počítač môže vyžiadať reštart.
-
-
Nainštalujeme z Windows Store distribúciu Ubuntu 20.04 (Focal Fossa) (pozn.: existuje prirodzene viacero možností, manuál je v súlade s uvedenou).
-
Inicializujeme distribúciu prvým spustením, je dostupná medzi programami pod názvom Ubuntu 18.04. Budeme požiadaní o vytvorenie užívateľského konta, zvolíme ľahko zapamätateľné heslo — bude vyžadované, keď budeme neskôr žiadať administrátorské práva cez sudo.
-
Programy v distribúcii budú pravdepodobne neaktuálne. V termináli spustíme cez správcu programových balíkov apt aktualizáciu:
sudo apt update && sudo apt upgrade
Apt si pri nájdení aktualizácií vypýta povolenie (Y). Na konci zosumarizuje správou:
X upgraded, X newly installed, X to remove and X not upgraded.
-
Pri riešení problémov postupujeme podľa dokumentácie MS.
-
-
Návrat na prípravu prostredia s WSL.
Inštalácia nástrojov
Git for Windows (verzovací systém)
Viac o git.
-
Inštalujeme z oficiálnych stránok a volíme nasledujúce možnosti:
-
Po inštalácii je git dostupný v termináli, napríklad v Powershell. Nainštaluje nám aj program Git Bash, ktorý okrem gitu umožňuje niektoré iné príkazy z typického linux terminálu.
Na Windowse sa symboly nových riadkov v textových súboroch líšia od Linuxu. V prípade problémov nasledujúcim príkazom nastavíme automatický preklad medzi oboma verziami: git config --global core.autocrlf true
|
CMake
Viac o cmake.
-
Z oficiálnych stránok nainštalujeme Latest Release, binárnu distribúciu, win64-x64 Installer.
V názvoch ciest nepoužívame medzery a používame iba znaky ASCII!
To platí aj pri inštalácii nástrojov, problémový je adresárProgram Files/
.Inštalujeme na systémový disk a nemeníme predvolené umiestnenie ak naozaj nemusíme.
Ďalej zvolíme, že chceme cmake pridať do premennej PATH (nájde ho tak Qt a umožní nám tiež v termináli použiť iba názov cmake miesto celej cesty k programu):
Dr. Memory (ladenie)
Nástroj na hľadanie chýb pri práci s pamäťou. K dispozícii pre viaceré platformy, na Windowse nahradzuje nástroj valgrind.
Viac o Windows a Dr. Memory.
Putty (SSH klient)
V nových verziách Windows je už v termináli ssh. Nemusíme teda inštalovať Putty a môžeme spustiť ssh napríklad Powershell. |
putty.org
Umožňuje nám vzdialene sa pripojiť na linuxový server a odovzdať tak napríklad úlohu na Aise.
Prihlásenie na Aisu:
-
Do programu zadáme adresu Host name v tvare
xlogin@aisa.fi.muni.cz
a port 22. Nastavenia si uložíme ako session: -
Po otvorení spojenia budeme požiadaní o heslo a mali by sme uvidieť
Using username
s naším xloginom:
Vývoj na macOS
Vďaka podobnosti s Linuxom sú návody zhodné s kapitolou Vývoj na Linuxe, teda až na inštaláciu nástrojov. Doporučuje sa tiež miesto valgrind používať Dr. Memory. Stačí teda pomocou Homebrew nainštalovať základné nástroje a Dr. Memory. IDE uvedené v manuáli sú multiplatformové a môžeme ich využiť rovnako. Navyše uvádzame iba prostredie špecifické pre macOS, Xcode.
Terminál otvárame z časti ⌘+Space, do ktorého napíšeme jednoducho „Terminal“.
alebo pomocou rýchleho vyhľadávaniaHomebrew a potrebné nástroje
Homebrew je správca balíkov podobný apt, ktorý nám sprístupní nástroje, ktoré náš macOS nemá.
-
Podľa oficiálnej stránky nainštalujeme Homebrew príkazom:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Balíky následne inštalujeme príkazom:
brew install <package_name>
-
Nainštalujeme potrebné programy (no bude nám chýbať clang-tidy a valgrind):
brew install git vim cmake gcc cppcheck clang-format
Na macOS stále nefunguje valgrind. Jednou z možností, ako ho používať, je Docker. –
IDE (vývojové prostredie)
Softvér s grafickým rozhraním združujúci viaceré nástroje pre programátora. Bežné IDE obsahuje editor zdrojového kódu, kompilátor, integruje build a verzovacie systémy, debugger. Zvláda tiež inteligentne doplňovať kód, teda našepkáva programátorovi syntax, zvýrazňuje chyby a prípadne navrhuje opravy. Jednou z výhod sú aj jednoduché nástroje na refaktoring (zmena názvu premennej, predpisu funkcie, atp.).
Užívateľská prívetivosť je ale dvojsečná zbraň — to, že IDE pred nami skrýva viacero jednoduchých vecí, nám bráni porozumieť celému procesu, ktorý sa často, a úplne zbytočne, stane magickým. Z edukačného hľadiska odporúčame používať IDE, keď dokážeme pracovať iba v termináli. |
CLion

Multiplatformové C/C++ IDE od firmy Jetbrains. Komerčný softvér s bezplatnou licenciou pre študentov. Je v rovnakej rodine IDE ako IntelliJ IDEA, veľmi populárna voľba na programovanie v Jave. Identické UI môže byť výhodou pri prechode na iný jazyk, ktorý rodina zastrešuje (využiteľné vo viacerých predmetoch FI).
Vhodné skôr pre pokročilejších užívateľov, alebo tých, čo už používali IDE od JetBrains.
-
Inštalácia (podrobnosti v oficiálnej dokumentácii):
-
Na Ubuntu 16.04 a novšie príkazom:
sudo snap install clion --classic
-
Ak na fakultných počítačoch chýba, je potrebné aktivovať príslušný modul.
-
Na Linuxe CLion spúšťame príkazom:
clion.sh
O pridaní ako príkaz sa dočítame v dokumentácii.
Visual Studio Code
Multiplatformní vývojové prostředí od Microsoftu. Obsahuje spoustu doplňků, které nám umožní pracovat skoro v každém programovacím jazyce.
Qt Creator

IDE od firmy Qt Company. Základná verzia pre vývoj v C/C++ je open-source. Komerčná verzia obsahuje pre nás nepotrebnú knižnicu na tvorbu desktopových/embedded GUI aplikácií.
Za konzultácie a korektúry patrí vďaka Romanovi Lackovi, Lukášovi Zaoralovi a Lukášovi Ručkovi. Osobitná vďaka patrí tiež Matúšovi Talčíkovi, od ktorého som prebral časti starších návodov. A rovnako ďakujem študentom, ktorí nám pošlú spätnú väzbu!
— Marko Řeháček