1. díl - Céčko a Linux - Úvod

C++ Linux Céčko a Linux - Úvod

Tento tutoriál (a několik následujících dílů) 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

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

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

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

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

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

Pokud máte nějaké otázky nebo připomínky, určitě je napište do komentářů nebo soukromé zprávy. Příště se podíváme na Makefile a jak ho použít..


 

  Aktivity (2)

Článek pro vás napsal David Novák
Avatar
Autor v současné době studuje FIT VUT Brno a zajímá se především o nízkoúrovňové programování (C/C++, ASM) a návrh hardwaru (VHDL). Je zde také členem výzkumného týmu ANT@FIT (Accelerated Network Technologies).

Jak se ti líbí článek?
Celkem (7 hlasů) :
55555


 


Miniatura
Všechny články v sekci
Programování v jazyce C v Linuxu
Miniatura
Následující článek
Céčko a Linux – Makefile

 

 

Komentáře
Zobrazit starší komentáře (16)

Avatar
Filip Šohajek
Redaktor
Avatar
Filip Šohajek:

Tak to je snad samozřejmé :)

 
Odpovědět 25.2.2015 14:09
Avatar
David Novák
Tým ITnetwork
Avatar
Odpovídá na Filip Šohajek
David Novák:

Jo.. Ale je to tutoriál i pro začátečníky, co to nemusí vědět. Tak to zmiňuji ;)

Odpovědět 25.2.2015 14:20
Chyba je mezi klávesnicí a židlí.
Avatar
mkub
Redaktor
Avatar
mkub:

doplnim len ze v C-cku je napisany aj takmer cele jadro samotneho systemu s vynimkou nizkourovnovych funkcii, ktore su zavisle na architekture a je potrebne, aby boli optimalizovane pre ten-ktory HW

 
Odpovědět  +1 19.6.2015 21:56
Avatar
mkub
Redaktor
Avatar
mkub:

a takisto dodam, ze do C-cka bol prepisany kod Unixu na minipocitacoch PDP-7

 
Odpovědět 20.6.2015 16:42
Avatar
David Novák
Tým ITnetwork
Avatar
Odpovídá na mkub
David Novák:

Do už jsme sice někde v daleké historii Unixových systémů, ale ok.. :D A nemáme tu o tom už náhodou článek? ;)

Editováno 20.6.2015 16:55
Odpovědět 20.6.2015 16:52
Chyba je mezi klávesnicí a židlí.
Avatar
mkub
Redaktor
Avatar
Odpovídá na David Novák
mkub:

myslim, ze o kratku historiu Unixu som sa venoval v jednom clanku, ked som spominal historiu Linuxu...

a dodal by som, ze tieto clanky nie su urcene iba pre danu distribuciu, tieto clanky su pouzitelne pre vsetky distribucie Linuxu, ci uz je Ubuntu, Debian, Redhat, Mandriva, Fedora, Slackware...
a co sa tyka multiplatformo­vosti, tak pokial sa nepouziju specialne kniznice (napr. DirectX), tak dany program sa da prelozit aj na OSX, Unixoch, Linuxe, Windowse
a jazyk C predstavuje taktiez zaklad pre ostatne C-like jazyky (ako je napr. C++, C#, takisto aj csh/tcsh vyuziva C-like syntax)

 
Odpovědět 20.6.2015 19:50
Avatar
David Novák
Tým ITnetwork
Avatar
Odpovídá na mkub
David Novák:

No.. Vzhledem k tomu, že se to jmenuje "C a Linux" a ne "C a Ubuntu", tak to dodávat nemusíš.. :D

Jinak pro zajímavost - poslední díl už je psaný na Fedoře.. ;)

Odpovědět 20.6.2015 19:57
Chyba je mezi klávesnicí a židlí.
Avatar
Filip Šohajek
Redaktor
Avatar
Filip Šohajek:

Mimochodem, manuálová sekce 3 neposkytuje nápovědu pro C, ale pro knihovny (a také standartní C knihovny). Další sekce zabývající se vývojem jsou 2 (Systémová volání) a 9 (Kernelová volání)

 
Odpovědět 21.6.2015 10:27
Avatar
David Novák
Tým ITnetwork
Avatar
Odpovídá na Filip Šohajek
David Novák:

No zatím jsem jiné než Céčkové knihovny nepoužíval (ať už standardní nebo GNU rozšíření)... Takže sekce tři je obecně pro všechny knihovny v systému?

Odpovědět 21.6.2015 13:14
Chyba je mezi klávesnicí a židlí.
Avatar
Filip Šohajek
Redaktor
Avatar
Odpovídá na David Novák
Filip Šohajek:

Ano, všechny knihovny budou mít manuálové stránky v sekci 3

 
Odpovědět 21.6.2015 15:54
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 26. Zobrazit vše