Jak na pro­jek­ty v ja­zy­ce C

© Damig, 2004 – 2023
Koncept

Vývoj v Linuxu

I když později budete programovat i pro jiné operační systémy, je výhodné učit se to v Linuxu. Linux je pro programátory ideální svět. Veškeré programátorské nástroje jsou tady doma. Linux je předvídatelný, nesnaží se tolerovat chyby (aby se pak neprojevily v nejméně vhodný okamžik) a dodržuje standardy.

Je to otevřený a dokumentovaný systém. Aspekty jeho fungování nikdo nedrží v tajnosti. Můžete zkoumat a, pokud si troufnete, také upravovat zdrojové kódy libovolného programu. V Linuxové komunitě se máte vždy na koho obrátit pro radu prostřednictvím mnoha diskuzních fór po celém světě. U každého zdrojového textu lze dohledat, kdo jej napsal, takže se můžete obrátit i přímo na něj.

Pokud vám zkoumání zdrojových kódů jádra operačního systému zní jako sci-fi, nikdo vám nebrání zkoumat něco jednoduššího. Otevřené zdrojové kódy, množství dostupné dokumentace a expertů, kterých se může zeptat na radu, to vše činí z Linuxu programátorský ráj.

Jak to naistaluji?

Jakou distribuci

Nemáte-li žádné zkušenosti, je to snadné. Pro programátory jsou vhodné všechny běžně používané. Distribucí Linuxu existuje velké množství. Každá se snaží zístat uživatele něčím jiným. Některé distribuce nabízí pěkné prostředí, jiné spolehlivost potřebnou pro síťové servery a některé jsou specializované na multimédia nebo hry. Příliš specializované distribuce, jako ty pro herní konzole se však pro běžné programování příliš nehodí.

  • Ubuntu, Kubuntu a další varianty. Ubuntu používá prostředí Gnome, Kubuntu používá KDE. Poskytuje live DVD / flash disk. Dnes zřejmě nejrozšířenější distribuce.
  • Fedora – distribuce, za kterou stojí Red Hat. Používá jiný systém balíků než Debian/Ubuntu. Výchozím prostředím je Gnome.
  • Debian – velmi kvalitní a stabilní distribuce, na které staví i Ubuntu.
  • Knoppix – live distribuce, výborná pro otestování kompatibility HW.
  • openSuse – velká distribuce srovnatelná s Fedorou. Jako výchozí prostředí používá KDE.

Live vs. dualboot vs. VirtualBox

Pro začátek zkuste live-distribuce Linuxu. Ty se spouští z bootovatelného DVD nebo flash disku, nic neinstalují a programy běží přímo z média. Před plnou instalací tak jde ověřit, zda váš počítač neobsahuje příliš uzavřený hardware bez dostupných Linuxových ovladačů.

Stejně jako u jiných systémů je nejjednodušší instalovat Linuxovou distribuci stylem jeden počítač – jeden systém. Chcete-li provozovat dualboot, tedy například Linux a Windows na stejném počítači, prozkoumejte nejdříve internetové návody. Podívejte se i na zmínky o UEFI. Mnoho začátečníků se snaží od začátku provozovat Linux netriviálním způsobem a pak mají pocit, že nainstalovat Linux je pro ně příliš složité. Není, jen instalovat a provozovat dva operační systémy na jednom pískovišti je složitější, nežli mít na jednom počítači jeden systém (zkuste dát na jeden stroj Windows a macOS).

Trváte-li na dvou systémech a netroufáte si na dualboot, zkuste Virtual Box a provozujte Linux z okna Windows (nebo Windows v okně Linuxu).

Vytváříme projekty v Linuxu

Ačkoli na Linuxu najdeme mnoho více či méně propracovaných vývojových prostředí (Code::Blocks, KDevelop, Eclipse, ...), žádné z nich se nikdy masově neuchytilo. Důvodem může být unixová filozofie – v jednoduchosti je síla, nebo také – dělat věci jednoduché, ale maximálně kvalitní. Linux obsahuje množství jednoduchých a mocných nástrojů, jejichž kombinováním je možné dosáhnout velké efektivity práce. Dalo by se říct, že v Linuxu programátor žádné rozsáhlé vývojové prostředí nepotřebuje. Všechny potřebné nástroje jsou (po instalaci potřebných balíčků) integrovány přímo do prostřední operačního systému.

Pokud chcete programovat v Linuxu, vystačíte s textovým editorem podle vlastního vkusu, textovou konzolí (také podle vlastního vkusu) ze které budete spouštět překladač a s debuggerem (podle vlastního vkusu, jak jinak). Návodem k použití jsou předchozí kapitoly. Pro příznivce IDE jsem připravil i návod pro používání programu Code::Blocks.

Editory

Dobrý editor je pro programátora tím, co skalpel pro chirurga. Má umět zvýrazňovat syntaxi a spouštět další nástroje. Pokud dovolí uživateli upravit své chování třeba pomocí vlastních skriptů, je to další plus.

Kate

Kate je jeden z nejlepších editorů pro prostředí KDE (viz ukázky). Dobře se ovládá, je konfigurovatelný a je možné jej rozšířit pomocí pluginů. Samozřejmostí je podpora zvýrazňování syntaxe, práce s více soubory i kontrola pravopisu. Obsahuje zabudovaný terminál, takže se v něm dobře spouštějí další unixové nástroje. Je to docela dobrý kompromis mezi sílou Linuxu a okenním ovládáním. Je to vhodný editor pro začátečníky i pokročilé, poměrně bezbolestný. Je rozšiřitelný pomocí přídavných modulů, využívá propracované nástroje KDE pro vyhledávání a textové náhrady, které umí i regulární výrazy, zvládá šablony dokumentů i doplňování kódu, dokonce umožňuje přepínat mezi běžným editačním módem a módem Vimu.

Editor Kate má pro začátečníky jednoduché intuitivní ovládání vycházející z prostředí KDE. S tím jak budete postupně pronikat do možností Linuxu a KDE, budete stále více oceňovat symbiotickou provázanost editoru s prostředím KDE.

Gedit

Gedit je výchozím textovým editorem v prostředí GNOME. Zastává zde podobnou úlohu jako Kate v KDE a má podobné schopnosti.

Vim/GVim

Vim, GVim – jeho historie, respektive historie jeho předka Vi, sahá až někde do roku 1976. Přesto má dodnes mnoho příznivců.

Pro začátečníky je možná zpočátku trochu nestravitelný, ale kdo se jej rozhodne používat, časem ocení jeho sílu (na ukázkách to bohužel není příliš vidět, protože těžiště jeho předností leží v konfiguraci a ovládání). Čistý Vim funguje přímo v terminálu, jeho verze GVim funguje v grafickém prostředí.

Uživatelé Vimu nepotřebují myš. Vim je totiž ukázkovým příkladem symbiózy editoru a okolního prostředí, v tomto případě příkazového unixového terminálu. Je určen pro ovládání všemi deseti prsty, při psaní není potřeba sundat ruce z klávesnice. Ovládání je na první dojem trochu složité, ale má hlubokou vnitřní strukturu. Je velmi konfigurovatelný a rozšiřitelný. Na domovské stránce jsou odkazy na množství hotových utilit. Pro naučení základního ovládání si rezervujte tak jeden den. Rozhodně to nebude ztracený čas.

Psát ve Vimu je jako používat staré dobré inkoustové pero se zabudovaným trikordérem ze Star Treku. Praví programátoři používají Vim, ostatní jsou jen pojídači koláčů.

Emacs

Emacs je zhruba stejně rozšířený jako Vim. Je velmi mocný, ale na můj vkus příliš složitý (takový OS sám pro sebe). Ovšem uznávám, že pokud někdo překoná počáteční odpor, získá pravděpodobně nejmocnější unixový nástroj vůbec.

Debuggery

Bez dobrého debuggeru se programuje těžko i profesionálům. Pozor ovšem na to, že existují problémy, které sebelepším debuggerem neodhalíte. Znát teorii se vyplatí.

Každé slušné IDE obsahuje debugger. Pokud však IDE nepoužíváte, jsou tady debuggery fungující samostatně. Základní funkčnost je stejná. Umí programy krokovat, umísťovat do nich statické i podmíněné zarážky a zobrazovat obsah proměnných a paměti. Některé debuggery umí i něco navíc, jako třeba vizualizaci profilovací analýzy nebo pomůcky pro ladění paralelních programů. O ladění si blíže povíme v jedné z dalších kapitol.

Papír a tužka, tabule a fix

Zvláště když pracujete se složitějšími datovými strukturami a s ukazateli, jsou papír a tužka těmi nejlepšími pomůckami. To platí pro všechny programovací jazyky bez výjimky. Nestyďte se je používat! Používají je i ty nejlepší mozky na planetě, tak proč ne vy.

DDD

DDD – Data Display Debugger je nejlepší debugger, se kterým jsem se setkal (viz ukázkynávod). Je to unixový program a je to vlastně grafická nadstavba nad GDB (a jinými debuggery). Kromě běžných funkcí dokáže názorně graficky zobrazit datové struktury a provádět nad kódem statistické analýzy. Ostatní debuggery, které znám, mu nesahají ani po kotníky a to i přes dost obstarožní grafickou podobu (díky které ale funguje i na velice jednoduchých grafických systémech). Na druhou stranu, kde jinde jde zobrazit matice nebo historii proměnných jako 3D grafy?

GDB

GDB – The GNU Project Debugger je na Linuxu naprostá klasika, základ. Jde o debugger ovládaný z příkazové řádky. Jeho přímé použití je pro začátečníky zbytečně složité. V Linuxu je to ovšem zásadní program, většina debuggerů s GUI je postavena jako nadstavba nad ním.

Vývojová prostředí

Linux nabízí samozřejmě i propracovaná vývojová prostředí. Některá plnotučná, určená pro profesionály, jiná jsou lehčí, která jsou stravitelnější pro ostatní programátory. Dejte na mou radu a nepoužívejte příliš složitá vývojová prostředí, dokud nebudete umět dobře programovat! Programování v takových prostředích často u nezkušených programátorů vede k vytváření nežádoucích programátorských zlozvyků.

Code::Blocks

Code::Blocks je rozumně jednoduché IDE pro vývoj v jazycích C, C++ a Fortranu, rozšiřitelné pomocí pluginů. Jeho výhodou je multiplatformnost, to znamená, že funguje a vypadá prakticky stejně v Linuxu, Windows i v Mac OS X. Obsahuje plnohodnotný debugger, zvýrazňování syntaxe, šablony pro generování elementárních kousků kódu a mnoho dalšího. Toto prostředí je popsáno v kapitole Stručný průvodce Code::Blocks.

Přesto radím, abyste se zároveň naučili ovládat překladač z příkazové řádky. Budete pak lépe chápat, jak Code::Blocks překládá, jak zpracovává projekty, ale hlavně, co znamenají jeho chybová hlášení. Prostředí ponechává programátorovi velkou volnost při nastavení překladače. Buďto si můžete sami napsat svůj Makefile nebo můžete nechat vše na samotném prostředí. V obou případech ovšem musíte mít určité základní znalosti o programu make a o nastavování překladače.

Eclipse

Eclipse je plnotučné IDE napsané v Javě a je primárně určeno pro vývoj v Javě. Je velmi dobře rozšiřitelné, takže byl vytvořen plugin CDT, tedy C, C++ Development Tools. Nevýhodou tohoto prostředí mohou být nároky na paměť počítače, které jsou srovnatelné s Delphi nebo C++ Builderem. Na většině dnešních počítačů (více než 1GB RAM) ovšem běží zcela bez problémů (máte-li SSD a 8+ GB RAM, máte výhodu).

Největší výhodou Eclipse je to, že je díky Javě multiplatformní, funguje tedy stejně dobře všude. Stejné je to i s pluginem CDT. Mezi další přednosti patří skvělý debugger a podpora CVS, Subversion, Git a dalších nástrojů pro správu verzí. Pokud programujete zároveň v Javě a v C nebo C++, určitě toto prostředí oceníte.

Možnosti nastavení a správy projektů jsou obdobné jako u Code::Blocks. Projekty buďto spravuje sám, nebo použije váš Makefile. Opět musíte mít základní znalosti o programu make a o nastavování překladače.

KDevelop

Jde o plnotučné IDE, používající KDE. Umí toho hodně, ale je potřeba programování dobře rozumět, jinak vám bude dělat problémy pouhé ovládání (to platí i pro Eclipse).

Anjuta

Platí pro něj totéž co pro KDevelop, jen zaměňte KDE za Gnome.

Jiné nástroje

Na Linuxu existuje bezpočet nástrojů, které ulehčují programátorovi život. Není v mých silách je zde všechny vyjmenovat. Následující nástroje jsou podle mého názoru v počátcích nejužitečnější.

GNU Indent

Tento program slouží pro přehledné formátování zdrojového kódu. IDE a chytřejší editory jako kate mají něco podobného zabudováno v sobě. Indent ale funguje jednoduše z konzole – zdrojový soubor se mu předává jako parametr příkazového řádku a program jej vypíše na výstup zformátovaný podle zásad nastavených v konfiguračním souboru. Velmi užitečné! Dá se použít i při hromadných úpravách pomocí skritpů, například když chcete učinit čitelným kód od autora, který je čuně...

  • .indent.pro – Můj konfigurační soubor. Zkopírujte si jej do svého domovského adresáře.

Doxygen

Program pro generování programátorské dokumentace z komentářů ve vašich zdrojových souborech. Funguje podobně jako program Javadoc v Javě (dokonce je s ním kompatibilní). Umí vygenerovat dokumentaci ve formátech HTML, LaTeX, RTF, PS, PDF, ale také jako manuálové stránky. Pokud to myslíte vážně s vytvářením větších projektů, měli byste se s tímto programem seznámit. Pokud se chcete podívat, jak vypadá projekt používající doxygen, podívejte se na projekt C-Quest. Code::Blocks má pro doxynen celkem použitelný plugin.

Man, info

Programy pro čtení manuálových a info stránek. Základní zdroj důležitých informací v systému Linux. Viz kapitola Pomoc! Kde najdu dokumentaci?.

CVS – Concurrent Version System

Systém pro správu verzí. Verzovací systémy jsou užiteční pomocníci, když je používáte i pro své malé projekty, ale stávají se nezbytnými v okamžiku, když začnete pracovat v týmu. CVS uchovává všechny změny v souboru a umožňuje se vrátit zpět. Když zjistíte, že vinou posledních úprav váš projekt přestal fungovat, není problém se vrátit k funkční verzi, kterou jste vytvořili před týdnem.

Subversion

Novější systém pro správu verzí, snažící se odstranit některé nedostatky CVS.

Git

Ovšem ani Subversion není ideální. Linusi Torvaldsovi došla před pár lety s ostatními verzovacími systémy trpělivost a nakonec napsal svůj vlastní. Největší výhodou Gitu je distribuovatelnost, to znamená, že úložiště nemusí být centrální, ale může být distribuováno na více místech, která nemusejí být dokonce všechny pořád online. Synchronizace se provádí, až když online jsou. Díky tomu můžete svůj projekt spravovat na svém počítači i bez sítě a s ostatními se synchronizovat, až když se připojíte.

FSF/UNESCO Free Software Directory

Kolekce programů z projektu GNU, určená pro vývoj softwaru.

Jaké balíčky a jak je nainstalovat?

Předpokládejme, že už máte nainstalovánu Linuxovou distribuci. Teď máte čistý systém bez programátorských nástrojů (běžný uživatel je nepotřebuje, tak co by tam dělaly). Jejich instalace je naštěstí jednoduchá a nebude vám trvat dlouho, pokud víte, co potřebujete.

Každá distribuce má svůj balíčkovací systém, pro instalaci programů. Pokud se pohybujete ve světě Androidu nebo iOS, víte, že se zde software stahuje v podobě balíčků z oficiálních míst jako Google Play nebo Mac App Store. No a jsme doma! Tyto systémy jsou inspirovány balíčkovacími systémy Linuxu, kde to už dlouho funguje podobně (až na to, že ve světě Open Source Linuxu se nevyskytuje tolik placeného SW).

Distribuce poskytují online repozitáře (repository), což jsou úložiště programů optimalizovaných a připravených k instalaci pro váš systém ve formě instalačních balíčků. Dva nejrozšířenější systémy balíčků jsou ty od Debianu (využívá je i Ubuntu) a od Red Hatu (Fedora, openSUSE).

Balíčky se z repozitářů instalují pomocí programů k tomu určených. V nastavení svého systému hledejte ikonu označenou jako Správa software nebo Správce balíčků. Názvy konkrétních programů pro správu balíčků se pochopitelně liší, proto nemá smysl je zde vyjmenovávat. Konkrétní balíčky vždy hledejte a instalujte přes váš program pro správu instalačních balíčků. Nestahujte je samostatně z internetu. Ono to většinou ani není potřeba, protože v repozitářích se nachází téměř vše, co člověk potřebuje.

Podstatnou vlastností balíčků jsou jejich závislosti. Některé balíčky obsahují dynamické knihovny funkcí, které využívají různé další programy. Aby se knihovny zbytečně neinstalovaly duplicitně, jsou baleny v samostatných balíčcích. V balíčcích programů, které je potřebují je uvedeno, že při instalaci se má zkontrolovat, zda už v systému je nainstalován balíček s potřebnou knihovnou. Pokud ne, systém sám zajistí instalaci potřebných balíčků. Nebuďte proto překvapeni, když při instalaci jednoho programu bude systém instalovat i několik dalších balíčků.

Jaké balíčky tedy potřebuji?

Pro vývoj v jazycích C a C++ budete potřebovat hlavně překladač a další pomocné nástroje. Hledejte tedy tyto balíčky v jejich posledních verzích (to jsou ta čísla na konci, kde platí, že 5.1.0 je vyšší verze než 2.50.210). Následující názvy balíčků jsou převzaty z repozitářů Ubuntu/Debianu. U jiných distribucí mohou být názvy jiné, ale analogické. Balíčky označené příponou -dev jsou balíčky pro vývojáře a obsahují hlavičkové soubory knihoven. Balíčky označené příponou -doc obsahují dodatečnou dokumentaci (základní dokumentace ve formě manuálové stránky bývá součástí hlavního balíčku).

Balíčky pro jazyk C

  • gcc – překladač GCC
  • libc6 (v popisu označeno jako Embedded GNU C Library) – základní céčkové knihovny. Někde může být balík označen i jako glibc.
  • libc6-dev – hlavičkové soubory pro standardní céčkovou knihovnu.
  • glibc-doc-reference – info stránky, pdf a html dokumentace ke GNU C Library
  • manpages-dev – manuálové stránky ke standardní knihovně
  • glibc-doc – dokumentace k dalším částem standardní knihovny (vlákna – pthreads)

Balíčky pro jazyk C++

  • g++ – rozšíření překladače GCC pro překlad C++.
  • libstdc++6 – GNU Standard C++ Library v3 – standardní knihovna jazyka C++
  • libstdc++-X.X-dev – hlavičkové soubory pro standardní knihovnu C++ (za X.X patří číslo verze překladače GCC)
  • libstdc++-X.X-doc – manuálové a html stránky s dokumentací ke standardní knihovně C++ (za X.X patří číslo verze překladače GCC). Začněte příkazem man C++Intro.

Make

  • make – program make
  • make-doc – info stránky a html dokumentace programu make

IDE, debugger

  • codeblocks – vývojové prostředí Code::Blocks
  • codeblocks-common – části Code::Blocks nezávislé na architektuře
  • codeblocks-contrib – užitečné rozšiřující pluginy pro Code::Blocks
  • ddd – grafický debugger
  • ddd-doc – dokumentace k debuggeru ddd

Další užitečné programy

  • indent – program pro formátování zdrojového kódu
  • doxygen – program pro generování dokumentace z komentářů ve stylu javadoc
  • valgrind – program pro ladění programů s ukazateli a dynamicky alokovanou pamětí
  • cvs – program pro správu verzí
  • subversion – další program pro správu verzí, je novější a má trochu jiný přístup než CVS
  • git – ještě novější program pro správu verzí s ještě novějším přístupem
  • vim, vim-gnome – programátorský editor, velmi konfigurovatelný, přímo stvořený pro programování v jazyce C (odsazování, překlad, doplňování identifikátorů, makra)
  • kate – programátorský editor pro prostředí KDE