1. diel - Céčko a Linux - Úvod
Tento kurz sa bude zaoberať programovaním na Linuxe, konkrétne Ubuntu. Pokiaľ s tým nemáte žiadne skúsenosti, odporúčam sa pozrieť na tutoriály o základoch C a Linuxu. V tomto úvodnom diele si povieme základné informácie, ktoré budeme potrebovať k vývoju na Linuxe. Konkrétne aké máme textové editory, ako používať terminál a niečo o nastavenie a používanie prekladača. Aj ak viete, že nechcete nikdy používať terminál, poznať základy práce s ním nikdy nie je na škodu. Neviete, kedy budete musieť programovať na vzdialenom serveri s Linuxom, kde väčšinou na grafické rozhranie nenarazíte. Keby ste predsa len nechceli tieto veci riešiť, pozrite sa rovno na štvrtý diel, kde sa naučíte, ako pracovať v prívetivom IDE Code :: Blocks.
V ďalších dieloch si potom ukážeme ako písať tzv. Filtre - aplikácie, ktoré sú autonómne a jediný vstup sa im zadáva prostredníctvom argumentov pri ich spustení. Ďalej budeme pokračovať knižnicami a pozrieme sa aj na ďalšie vývojárske nástroje na Linuxe, ako napríklad GNU Build System.
Prečo C a Linux?
Možno si teraz hovoríte, prečo vlastne C a či má vôbec ešte nejaký zmysel sa ho učiť .. Odpoveď znie rozhodne ÁNO. Určite ste počuli, že jazyk C je zastaraný, hlúpy a pod. Do istej miery je to určite pravda - absencia OOP a výnimiek, neexistencia bežných textových reťazcov, manuálna správa pamäte ... C je oproti jazykom ako C# alebo Java často náročnejšie, nevie veľa vecí a písanie programov zaberie viac času. Sú tu ale veci, na ktoré sa často zabúda. C je oproti moderným jazykom na oveľa nižšej úrovni - bližšie hardvéru. A spomínané nevýhody sú v určitých situáciách naopak výhody.
Ak program napíšete správne, bude v C výrazne výkonnejšie ako vo vyšších jazykoch. C je navyše vďaka svojej jednoduchosti perfektne multiplatformový (rovnaký kód preložíte a spustíte prakticky kdekoľvek, výnimočne s minimálnou úpravou). V praxi sa C používa napr. Pri programovaní OS (napr. Linux) a prekladačov / interpretov (Java, PHP). Navyše je veľmi jednoduché do programu v C pridať napríklad kúsok kódu v assembleri - môžete tak naprogramovať funkčnosť, ktoré nemožno inak dosiahnuť alebo optimalizovať určitú výpočtovo náročnú časť pre čo najvyššiu efektivitu.
A prečo Linux? Taká tá najvýraznejšie výhoda je, že je kompletne zadarmo. Okrem toho je tiež všeobecne stabilnejšie a bezpečnejšie ako napríklad Windows. To sú také všeobecné výhody ... Pre nás programátorov tu máme ďalší, konkrétnejšie výhody. Linux bol stvorený programátorov pre programátorov. Niekedy môže byť menej užívateľsky prívetivý, nie je tak "blbuvzdorný" (v tom je asi najlepší Mac OS X) a ponorenie sa do neho trvá dlhšie. Akonáhle sa ho ale naučíte ovládať a využívať jeho schopností, už na neho nedáte dopustiť. Linux je tiež otvorený - to znamená, že sa môžete pozrieť na zdrojový kód (Céčko) akejkoľvek časti OS alebo akéhokoľvek Linuxového programu. Tie tiež bývajú veľmi dobre dokumentované a môžete si ich pokojne aj upraviť - inými slovami úplná sloboda. Každopádne určite stojí za to ho aspoň skúsiť ...
Ale dosť bolo úvodu - poďme sa pozrieť na nejaké praktické veci.
Editor
Začneme asi tým najzákladnejším - textovým editorom. V Linuxe máme veľké množstvo možností. Úplne ten nejtriviálnější editor je asi nano (alebo veľmi podobný pico). Spustíme ho príkazom "nano názov_súboru". Je to editor bežiaci priamo v termináli a aj cez svoju jednoduchosť zvýrazňuje syntax (ak súbor pomenujete název.c). Ovládanie môžeme vidieť v spodnej časti - editor napríklad ukončíme stlačením Ctrl + X.
Pre rýchlu editáciu, keď nechceme spúšťať IDE, je nano ideálny nástroj. Na rýchle zobrazenie súboru môžeme použiť napríklad príkaz less. Ak by sme chceli pokročilejšie editor, skvelá voľba je Vim. Je pravda trochu zložitejšie a naučiť sa ovládať ho zaberie aj niekoľko hodín, ale nebudete ľutovať. Pre Vim už tu tutoriál máme, takže sa ním zaoberať nebudem.
Zatiaľ spomínané programy sú ideálne, ak radi ovládate počítač len klávesnicou (au práca na vzdialenom počítači často nemáte ani inú možnosť), ale ak ste trochu menej "hardcore" užívatelia, dáte určite prednosť komfortu "myšítko". Existuje veľké množstvo textových editorov s grafickým prostredia, ale zistil som, že východiskové gedit vie úplne všetko, čo potrebujem.
Ako vidíte, zobrazuje čísla riadkov a tiež zvýrazňuje syntax. Syntax sa nastaví automaticky podľa prípony - môžete ju ale samozrejme zmeniť aj manuálne v stavovom riadku (a rovnako tak šírku Tab). V nastavení (Edit-> Preferences) môžeme nastaviť číslovanie riadkov, automatické ukladanie a prípadne doinštalovať pluginy, ktoré môžu funkčnosť významne rozšíriť. Ako čokoľvek v Linuxe si teda aj editor môžete takmer ľubovoľne prispôsobiť vlastnej chuti. Bližšie informácie nájdete v tomto článku o gedit.
Nápoveda
Než začneme písať kód, bolo by dobré povedať si niečo o pomocníkovi alebo tiež o manuálových stránkach. Tie sa vyvolajú príkazom man název_funkce a obsahujú všetky štandardné funkcie jazyka C. Okrem nich obsahujú ešte dokumentáciu k funkciám bash a ďalším častiam Linuxu. Je teda dobré vedieť, že manuál ku knižniciam C sa nachádza v sekcii 3 (to platí aj pre všetky ostatné nainštalované knižnice). Môžeme to vyskúšať napríklad s funkciou printf, ktorá existuje ako v C, tak v bashi.
$ man printf $ man 3 printf
Okrem man
ešte existuje program info
, ktorý je do
budúcnosti mienený ako jeho náhrada. Často v ňom teda nájdeme
podrobnejšie informácie.
$ info printf
Prekladač
Keď už máme napísaný kód, budeme ho určite chcieť preložiť. Ako prekladač vrelo odporúčam GCC (GNU C Compiler), ktorý je veľmi kvalitný a ponúka veľké množstvo možností. Prevažná väčšina Linuxových distribúcií ho má nainštalovaný už v základe. Ak by ste ho ale napriek tomu z nejakého dôvodu nainštalovaný nemali, jeho inštalácia nie je nič ťažké. Stačí spustiť terminál a zadať nasledujúce príkazy. Teoreticky stačí "sudo apt-get install build-essential", ale keďže nevieme, v akom stave je zoznam balíčkov, je dobré ho najskôr aktualizovať pomocou update.
Upgrade aktualizuje nainštalované balíčky - je dobré mať vždy poslednú verziu.
$ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get install build-essential $ gcc --version
Ak niekto z vás používa Fedoru, tak použite tento príkaz pre inštaláciu základných nástrojov pre vývoj.
$ sudo dnf group install 'Development Tools'
Máme teda aktuálnu verziu prekladača. Teraz sa pozrieme na jeho možnosti a ako ho vlastne používať. Začneme jednoduchým prekladom jedného súboru.
$ gcc program.c -o program
Tento kód nám preloží súbor "program.Čo" a vytvorí spustiteľný
súbor "program". Prepínač -o nie je nutný - ak ho nezadáme, bude sa
binárky menovať a.out
. Ak by sme mali v kóde chyby, prekladač
by nám ich vypísal. Skúsime si to - napíšeme nasledujúci kód a
preložíme ho už známym príkazom.
#include <stdio.h> int main(void) { printf("Hello world!\n") return 0; }
Prekladač narazil na chybu a vypísal nám o nej hlásenia. Malo by sa vám objaviť niečo také.
Chybu opravíme (chýba bodkočiarka za printf) a znova preložíme (pre
začiatočníkov - skúste v termináli šípky nahor / nadol ). Tentoraz preklad už prebehne v
poriadku a program môžeme spustiť. V Linuxe sa programy v aktuálnej zložke
spúšťa pridaním ./
pred ich názov. Je to bezpečnostné
opatrenie - bežné spustenie programu jeho názvom prehľadáva štandardné
zložky (/ bin, / usr / bin, ...) - ak by prehľadával aj súčasný adresár,
mohlo by to byť zneužité na útok napríklad pomenovaním škodlivého
programu pwd. Akonáhle by sme v takomto adresári chceli spustiť pwd, spustil
by sa tento škodlivý program miesto systémové verzie.
Prepínače
Ako prvý spomeniem jeden zaujímavý prepínač. Ak ste šialení (a alebo zvedaví), môžete prekladači povedať, aby vám len vygeneroval kód pre assembler. Ten potom môžete upraviť a urobiť tak napríklad nejakú optimalizáciu, nejakú funkcionalitu pripísať alebo sa proste len pozrieť, čo z toho vášho programu vzniklo. Pri preklade stačí použiť prepínač "-S". Výsledný súbor si môžete pozrieť v akomkoľvek editore.
$ gcc -S program.c
Ešte by som poznamenal, že GNU assembler používa inú (AT & T) syntax, ako Intel (napríklad NASM). Ak chcete, môžete toto ľahko zmeniť. Výsledný príkaz potom bude vyzerať takto:
$ gcc -S -masm=intel program.c
Teraz si povieme o ďalších, už užitočnejších prepínačoch. Začneme prepínačom -std. Ten nastavuje verziu jazyka, ktorú chceme používať. My budeme používať C99 - špecifikáciu z roku 1999.
-std = C89 | Staršie verzie jazyka, môžeme ju použiť, ak chceme, aby bol program kompatibilný so staršou verziou prekladača. |
---|---|
-std = C99 | Najrozšírenejšie verzie, podporovaná prakticky všetkými prekladači. |
-std = C11 | Nová, aktuálna verzia. Už široko podporovaná. |
-std = c ++ 98 | Ak by sme chceli prekladať program v C ++ (namiesto gcc potom použiť g ++). |
-std = c ++ 11 | V súčasnosti používaná verzia C ++. |
-std = c ++ 14 | Nová verzia C ++. |
-Wall | Zapne produkciu takmer všetkých varovných správ - dôležité, ak sa chceme vyhnúť množstvo nepríjemných chýb. |
---|---|
-Wextra | Zapne niektoré ďalšie varovanie a čiastočnú sémantickú kontrolu kódu. |
-pedantic | Stráži striktné dodržiavanie nastavenej špecifikácie - užitočné, keď chceme zabezpečiť prenositeľnosť kódu. |
-w | Vypne zobrazovanie všetkých varovných správ. |
-Werror | Všetky varovania sú brána ako chyby - prekladač vás nenechá program ani spustiť. |
My budeme v tomto tutoriálu (a všetkým odporúčam toto nastavenie používať aj počas normálneho vývoja) používať nasledujúce prepínače:
$ gcc -std=c99 -Wall -Wextra -pedantic -g program.c -o program
Ďalšie príznaky
Ďalej by som mal určite spomenúť prepínač -lm. Ten sa používa pre přilinkování matematické knižnice (math.h). Vyskúšame si nasledujúci kód (skúste si ho preložiť bez as -lm) ..
#include <stdio.h> #include <math.h> int main(void) { printf("Sinus(1rad) = %lf\n", sin(1)); return 0; }
Ešte spomeniem posledné dva prepínače. Prvá je -E. Ten zastaví preklad po prebehnutí preprocesoru. Hodí sa na kontrolu, či sa napríklad správne rozvinula zložitejšie makrá (náš kód nájdeme na konci vygenerovaného súboru, ktorý má často tisíce riadkov) alebo pripojila naše vlastné knižnica. Druhým je -c, ktorý iba preloží súbor, ale nevykoná linkovanie (zostavenie s knižnicami do spustiteľného súboru). To napríklad využijeme, keď máme projekt s viacerými súbormi.
Pár tipov na záver
Pomocou "AltGr (pravý alt) + Shift +;" vložíme na slovenskej klávesnici ~ (symbol reprezentujúci našu domovskú zložku).
Ďalej odporúčam nainštalovať dos2unix a nautilus-open-terminal.
- dos2unix vie prevádzať znaky pre koniec riadku z unixového spôsobu na Windows a naopak.
- nautilus-open-terminal pridáva do správcu súborov možnosť otvoriť danú zložku v termináli - nemusíte teda písať celú adresu. Použitie je potom jednoduché - stačí kliknúť pravým tlačidlom v priečinku (pre otvorenie terminálu v aktívnej zložke) alebo na nejakú zložku (pre otvorenie terminálu v označenej zložke) a kliknúť na "Open in terminal" alebo ekvivalent
Ak máte nejaké otázky alebo pripomienky, určite je napíšte do komentárov alebo súkromné správy. V budúcej lekcii, Céčko a Linux - Makefile , sa pozrieme na Makefile a ako ho použiť.