Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 1 - Céčko a Linux - Úvod

Tento kurz se bude zabývat programováním na Linuxu, konkrétně Ubuntu. Pokud s tím nemáte žádné zkušenosti, doporučuji se podívat na tutoriály o základech C a Linuxu. V tomto úvodním díle si povíme základní informace, které budeme potřebovat k vývoji na Linuxu. Konkrétně jaké máme textové editory, jak používat terminál a něco o nastavení a používání překladače. I pokud víte, že nechcete nikdy používat terminál, znát základy práce s ním nikdy není na škodu. Nevíte, kdy budete muset programovat na vzdáleném serveru s Linuxem, kde většinou na grafické rozhraní nenarazíte. Kdybyste přeci jen nechtěli tyto věci řešit, podívejte se rovnou na čtvrtý díl, kde se naučíte, jak pracovat v přívětivém IDE Code::Blocks.

V dalších dílech si poté ukážeme jak psát tzv. filtry – aplikace, které jsou autonomní a jediný vstup se jim zadává prostřednictvím argumentů při jejich spuštění. Dále budeme pokračovat knihovnami a podíváme se i na další vývojářské nástroje na Linuxu, jako například GNU Build System.

Proč C a Linux?

Možná si teď říkáte, proč vlastně C a jestli má vůbec ještě nějaký smysl se ho učit.. Odpověď zní rozhodně ANO. Určitě jste slyšeli, že jazyk C je zastaralý, hloupý apod. Do jisté míry je to určitě pravda – absence OOP a výjimek, neexistence běžných textových řetězců, manuální správa paměti... C je oproti jazykům jako C# nebo Java často náročnější, neumí spoustu věcí a psaní programů zabere více času. Jsou tu ale věci, na které se často zapomíná. C je oproti moderním jazykům na mnohem nižší úrovni – blíže hardwaru. A zmíněné nevýhody jsou v určitých situacích naopak výhody.

Pokud program napíšete správně, bude v C výrazně výkonnější než ve vyšších jazycích. C je navíc díky své jednoduchosti perfektně multiplatformní (stejný kód přeložíte a spustíte prakticky kdekoliv, výjimečně s minimální úpravou). V praxi se C používá např. při programování OS (např. Linux) a překladačů/in­terpretů (Java, PHP). Navíc je velmi jednoduché do programu v C přidat například kousek kódu v assembleru – můžete tak naprogramovat funkčnost, které nelze jinak dosáhnout nebo optimalizovat určitou výpočetně náročnou část pro co nejvyšší efektivitu.

A proč Linux? Taková ta nejzřejmější výhoda je, že je kompletně zdarma. Kromě toho je také obecně stabilnější a bezpečnější než například Windows. To jsou takové obecné výhody... Pro nás programátory tu máme další, konkrétnější výhody. Linux byl stvořen programátory pro programátory. Někdy může být méně uživatelsky přívětivý, není tak "blbuvzdorný" (v tom je asi nejlepší Mac OS X) a ponoření se do něj trvá déle. Jakmile se jej ale naučíte ovládat a využívat jeho schopností, už na něj nedáte dopustit. Linux je také otevřený – to znamená, že se můžete podívat na zdrojový kód (Céčko) jakékoliv části OS nebo jakéhokoliv Linuxového programu. Ty také bývají velmi dobře dokumentované a můžete si je klidně i upravit – jinými slovy naprostá svoboda. Každopádně určitě stojí za to ho alespoň zkusit...

Ale dost bylo úvodu – pojďme se podívat na nějaké praktické věci. :)

Editor

Začneme asi tím nejzákladnějším – textovým editorem. V Linuxu máme velké množství možností. Úplně ten nejtriviálnější editor je asi nano (nebo velmi podobný pico). Spustíme jej příkazem „nano název_souboru“. Je to editor běžící přímo v terminálu a i přes svou jednoduchost zvýrazňuje syntaxi (pokud soubor pojmenujete název.c). Ovládání můžeme vidět ve spodní části – editor například ukončíme stisknutím Ctrl+X.

Editování céčka v nano v Linuxu - Linux a programování v jazyce C

Pro rychlou editaci, když nechceme spouštět IDE, je nano ideální nástroj. Pro rychlé zobrazení souboru můžeme použít například příkaz less. Pokud bychom chtěli pokročilejší editor, skvělá volba je Vim. Je pravda poněkud složitější a naučit se ovládat ho zabere i několik hodin, ale nebudete litovat. Pro Vim už tu tutoriál máme, takže se jím zabývat nebudu.

Editor Vim v Linuxu - Linux a programování v jazyce C

Zatím zmíněné programy jsou ideální, pokud rádi ovládáte počítač pouze klávesnicí (a u práce na vzdáleném počítači často nemáte ani jinou možnost), ale pokud jste trochu méně "hardcore" uživatelé, dáte jistě přednost komfortu „myšítka“. Existuje velké množství textových editorů s grafickým prostředí, ale zjistil jsem, že výchozí gedit umí úplně vše, co potřebuji.

Gedit v Linuxu - Linux a programování v jazyce C

Jak vidíte, zobrazuje čísla řádků a také zvýrazňuje syntaxi. Syntaxe se nastaví automaticky podle přípony – můžete ji ale samozřejmě změnit i manuálně ve stavovém řádku (a stejně tak šířku Tab). V nastavení (Edit->Preferences) můžeme nastavit číslování řádků, automatické ukládání a případně doinstalovat pluginy, které mohou funkčnost významně rozšířit. Jako cokoliv v Linuxu si tedy i editor můžete takřka libovolně přizpůsobit vlastní chuti. Bližší informace naleznete v tomto článku o geditu.

Nápověda

Než začneme psát kód, bylo by dobré říci si něco o nápovědě nebo také o manuálových stránkách. Ty se vyvolají příkazem man název_funkce a obsahují všechny standardní funkce jazyka C. Kromě nich obsahují ještě dokumentaci k funkcím bashe a dalším částem Linuxu. Je tedy dobré vědět, že manuál ke knihovnám C se nachází v sekci 3 (to platí i pro všechny ostatní nainstalované knihovny). Můžeme to vyzkoušet například s funkcí printf, která existuje jak v C, tak v bashi.

$ man printf
$ man 3 printf

Kromě man ještě existuje program info, který je do budoucnosti míněn jako jeho náhrada. Často v něm tedy najdeme podrobnější informace.

$ info printf

Překladač

Když již máme napsaný kód, budeme jej určitě chtít přeložit. Jako překladač vřele doporučuji GCC (GNU C Compiler), který je velmi kvalitní a nabízí velké množství možností. Naprostá většina Linuxových distribucí jej má nainstalovaný již v základu. Pokud byste ho ale přesto z nějakého důvodu nainstalovaný neměli, jeho instalace není nic těžkého. Stačí spustit terminál a zadat následující příkazy. Teoreticky stačí „sudo apt-get install build-essential“, ale jelikož nevíme, v jakém stavu je seznam balíčků, je dobré jej nejdřív aktualizovat pomocí update.

Upgrade aktualizuje nainstalované balíčky - je dobré mít vždy poslední verzi.

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install build-essential
$ gcc --version

Pokud někdo z vás používá Fedoru, tak použijte tento příkaz pro instalaci základních nástrojů pro vývoj.

$ sudo dnf group install 'Development Tools'

Máme tedy aktuální verzi překladače. Teď se podíváme na jeho možnosti a jak ho vlastně používat. Začneme jednoduchým překladem jednoho souboru.

$ gcc program.c -o program

Tento kód nám přeloží soubor „program.c“ a vytvoří spustitelný soubor „program“. Přepínač -o není nutný - pokud jej nezadáme, bude se binárka jmenovat a.out. Pokud bychom měli v kódu chyby, překladač by nám je vypsal. Zkusíme si to – napíšeme následující kód a přeložíme ho již známým příkazem.

#include <stdio.h>

int main(void)
{
  printf("Hello world!\n")
  return 0;
}

Překladač narazil na chybu a vypsal nám o ní hlášení. Mělo by se vám objevit něco takového.

Chybová hláška GCC v Linuxu - Linux a programování v jazyce C

Chybu opravíme (chybí středník za printf) a znovu přeložíme (pro začátečníky – zkuste v terminálu šipky nahoru/dolů ;) ). Tentokrát překlad již proběhne v pořádku a program můžeme spustit. V Linuxu se programy v aktuální složce spouští přidáním ./ před jejich název. Je to bezpečnostní opatření - běžné spuštění programu jeho názvem prohledává standardní složky (/bin, /usr/bin, ...) - pokud by prohledával i současný adresář, mohlo by to být zneužito k útoku například pojmenováním škodlivého programu pwd. Jakmile bychom v takovém adresáři chtěli spustit pwd, spustil by se tento škodlivý program místo systémové verze.

Hello World v Céčku v Linuxu - Linux a programování v jazyce C

Přepínače

Jako první zmíním jeden zajímavý přepínač. Pokud jste šílení (a nebo zvědaví), můžete překladači říci, aby vám jen vygeneroval kód pro assembler. Ten pak můžete upravit a udělat tak například nějakou optimalizaci, nějakou funkcionalitu připsat nebo se prostě jen podívat, co z toho vašeho programu vzniklo. :) Při překladu stačí použít přepínač „-S“. Výsledný soubor si můžete prohlédnout v jakémkoliv editoru.

$ gcc -S program.c

Ještě bych poznamenal, že GNU assembler používá jinou (AT&T) syntaxi, než Intel (například NASM). Pokud chcete, můžete toto snadno změnit. Výsledný příkaz pak bude vypadat takto:

$ gcc -S -masm=intel program.c

Nyní si povíme o dalších, již užitečnějších přepínačích. Začneme přepínačem -std. Ten nastavuje verzi jazyka, kterou chceme používat. My budeme používat C99 – specifikaci z roku 1999.

-std=c89 Starší verze jazyka, můžeme ji použít, pokud chceme, aby byl program kompatibilní se starší verzí překladače.
-std=c99 Nejrozšířenější verze, podporovaná prakticky všemi překladači.
-std=c11 Nová, aktuální verze. Již široce podporovaná.
-std=c++98 Pokud bychom chtěli překládat program v C++ (místo gcc pak použít g++).
-std=c++11 V současnosti používaná verze C++.
-std=c++14 Nová verze C++.

Naprosto zásadní pro nás poté budou přepínače ovlivňující výpis chyb a varování. V následující tabulce uvedu jen několik nejdůležitějších. V dokumentaci najdete kompletní seznam i s popisem. Pokud byste potřebovali nějaké specifické nastavení, určitě se podívejte.

-Wall Zapne produkci téměř všech varovných zpráv – důležité, pokud se chceme vyhnout množství nepříjemných chyb.
-Wextra Zapne některá další varování a částečnou sémantickou kontrolu kódu.
-pedantic Hlídá striktní dodržování nastavené specifikace – užitečné, když chceme zajistit přenositelnost kódu.
-w Vypne zobrazování všech varovných zpráv.
-Werror Všechna varování jsou brána jako chyby – překladač vás nenechá program ani spustit.

Další důležitá skupina zahrnuje přepínač pro přidání debuggovacích informací a přepínače řídící optimalizace kódu. Debuggovací informace zapneme pomocí přepínače -g, samotné debuggování pak probíhá v debuggeru (například gdb). Když už budeme mít hotový, odladěný kód a budeme chtít zkompilovat finální verzi, zapneme optimalizace. Použijeme přepínač -O1, -O2 nebo -O3. Také si můžete vyzkoušet jak bude vypadat generovaný kód assembleru při použití jednotlivých přepínačů. Vyšší číslo znamená vyšší úroveň optimalizací – čím vyšší úroveň, tím déle bude trvat kompilace.

My budeme v tomto tutoriálu (a všem doporučuji toto nastavení používat i během normálního vývoje) používat následující přepínače:

$ gcc -std=c99 -Wall -Wextra -pedantic -g program.c -o program

Další příznaky

Dále bych měl určitě zmínit přepínač -lm. Ten se používá pro přilinkování matematické knihovny (math.h). Vyzkoušíme si následující kód (zkuste si jej přeložit bez a s -lm)..

#include <stdio.h>
#include <math.h>

int main(void)
{
  printf("Sinus(1rad) = %lf\n", sin(1));
  return 0;
}

Ještě zmíním poslední dva přepínače. První je -E. Ten zastaví překlad po proběhnutí preprocesoru. Hodí se na kontrolu, jestli se například správně rozvinula složitější makra (náš kód najdeme na konci vygenerovaného souboru, který má často tisíce řádků) nebo připojila naše vlastní knihovna. Druhým je -c, který pouze přeloží soubor, ale neprovede linkování (sestavení s knihovnami do spustitelného souboru). To například využijeme, když máme projekt s více soubory.

Pár tipů na závěr

Pomocí „AltGr (pravý alt) + Shift + ;“ vložíme na české klávesnici ~ (symbol reprezentující naši domovskou složku).

Dále doporučuji nainstalovat dos2unix a nautilus-open-terminal.

  • dos2unix umí převádět znaky pro konec řádku z unixového způsobu na Windows a naopak.
  • nautilus-open-terminal přidává do správce souborů možnost otevřít danou složku v terminálu – nemusíte tedy psát celou adresu. Použití je pak jednoduché - stačí kliknout pravým tlačítkem ve složce (pro otevření terminálu v aktivní složce) nebo na nějakou složku (pro otevření terminálu v označené složce) a kliknout na "Open in terminal" nebo ekvivalent :)
Použití nautilus-open-terminal - Linux a programování v jazyce C

Pokud máte nějaké otázky nebo připomínky, určitě je napište do komentářů.

V příští lekci, Céčko a Linux – Makefile, se podíváme na Makefile a jak ho použít.


 

Všechny články v sekci
Linux a programování v jazyce C
Přeskočit článek
(nedoporučujeme)
Céčko a Linux – Makefile
Článek pro vás napsal David Novák
Avatar
Uživatelské hodnocení:
22 hlasů
Autor se zajímá především o nízkoúrovňové programování (C/C++, ASM) a návrh hardwaru (VHDL).
Aktivity