V tomto manuálu si ukážeme instalaci a použití následujících terminálových nástrojů:
Pokud hledáte terminálový textový editor, doporučujeme vim.
git
Manuál ke gitu jsme vyčlenili do samostatné kapitoly.
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 --track-origins=yes ./<program_name>
--leak-check=full
|
zapne kontrolu neuvoľnenej pamäte s podrobným výpisom |
--show-reachable=yes
|
zobrazí všetky typy neuvoľnenej pamäte |
--track-origins=yes
|
zapne sledovanie pôvodov neuvoľnenej pamäte (spomalí beh Valgrindu asi o polovicu) |
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 --track-origins=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). Ani v čase jeho aktualizace (12/02/2023). |
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-17.0.1. |
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.
-
Súbor
codestyle.txt
je pre Kontr a bude sa aplikovať pri odovzdávaní. -
Súbor
.clang-format
je pre vás a clang-fomat, spustený príkazom nižšie, v ňom bude hľadať konfiguráciu.
Je nutné presne dodržať názvy týchto súborov!
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á.