Jak vzniká program

Vzniku velkého programu předchází spousta procesů. Nejdříve je třeba provést analýzu, návrh funkčnosti programu, uživatelského prostředí. Je třeba si rozmyslet, jak bude program vypadat, co bude jeho funkcí, pod jakými OS bude pracovat, budou-li v budoucnu potřeba nějaké změny v programu (jaké), kolik lidí bude na programu pracovat a jak dlouho, jak se bude program následně udržovat aktuální a funkční atd. Z toho pak vyplyne, jakými postupy program vznikne. Dobrou pomůckou vám při tom může být například znalost jazyka UML. Prostě, jak se říká, dvakrát měř, jednou řež. Já se zde ničím podobným zabývat nebudu, není to obsahem tohoto výukového textu. Zde se dozvíte pouze to, jak program „naprogramovat“.

Programovací jazyk, zdrojový kód a překladač

Jak jsem psal v minulé kapitole, program je soubor s daty a instrukcemi. Dříve se programovalo pomocí děrovacích štítků, ovšem s příchodem nových periférií, jako klávesnice a monitor, vznikaly i nové způsoby programování. Teď se pokusím vysvětlit některé pojmy, které s tím souvisejí.

Prvním důležitým pojmem je zdrojový kód programu. Zdrojový kód programu není nic jiného, než hromada textových souborů, v nichž je zapsáno pomocí programovacího jazyka (nikoliv tedy pomocí českého nebo anglického jazyka) co má program dělat.
Překladač (angl. compiler) je program, který si přečte zdrojový kód a vytvoří z něj program.
Odjakživa bylo snahou vytvořit takový programovací jazyk, který by byl co nejjednodušší na pochopení a naučení se pro člověka a zároveň, aby bylo proveditelné vytvořit překladač, který by takovému jazyku porozuměl (proto, alespoň zatím, nelze psát zdrojové kódy v lidské řeči, musí se na to vymyslet speciální jazyk – programovací jazyk).

Bylo vytvořeno mnoho různých programovacích jazyků a k nim samozřejmě mnoho překladačů (co jazyk, to překladač(e)).

Mezi prvními programovacími jazyky byl assembler. Pomocí tohoto jazyka se přímo zapisovali instrukce procesoru. Například sečtení dvou čísel v assembleru může vypadat takto:

MOV AX,a
MOV BX,b
ADD AX,BX
MOV a,AX

AX a BX je označení registrů procesoru, „a“ a „b“ jsou proměnné, které obsahují nějaká čísla. MOV je instrukce která data přesune (nejdříve data z „a“ do AX, pak z „b“ do BX…) a ADD je instrukce, která přičte druhé číslo k prvnímu (tj. k AX přičte BX). Nakonec se výsledek zapíše do proměnné a. Překladač assembleru tento zdrojový kód převede do binárního kódu (tedy programu), který je již procesoru srozumitelný.

Později vznikly „vyšší“ programovací jazyky, mezi něž patří i jazyk C, které již nepracovali přímo s instrukcemi procesoru. Předchozí kód se v jazyce C zapíše následovně:

a = a + b;

Nyní je již na překladači, aby tento zápis převedl do procesoru srozumitelných instrukcí. Vyšší programovací jazyk znamená vyšší míru abstrakce. Už nepracujete přímo s registry procesoru, ale necháte na překladači zdrojového kódu, aby zdrojový kód přeložil do binárního kódu srozumitelného konkrétnímu procesoru na konkrétním OS. Vy jen říkáte „ sečti mi a a b a výsledek ulož do a“. (Kde a a b zastupují nějaké čísla uložené v bytech.)

Překladače (a vývojová prostředí) proberu hned v další kapitole.

Přenositelnost

Přenositelnost programu je pojem, který nám říká, kde všude náš program poběží. Například program pro Windows 3.11 poběží i pod Windows 95, ale nepoběží pod Linuxem. Program pro 32-bitová Windows poběží, při troše štěstí, i pod 64-bitovými Windows, ale program pro 64-bitová Windows pod 32-bitovými Windows nepoběží.

Přenositelnost programovacího jazyka je vlastnost, která jednoduše určuje, na kterých platformách lze zdrojový kód tohoto jazyka přeložit. Jinak řečeno, pro které platformy (operační systémy a procesory) existuje překladač.
Čím více existuje překladačů pro různé procesory a OS, tím je program „přenositelnější“. V tomto ohledu patří jazyk C k jednomu z nejlepších. Ještě lepší je Java, která vám poběží na mobilním telefonu, nebo třeba ve vaší pračce :-).
Java, mimochodem, vychází z jazyků C/C++, jako ostatně spousta dalších moderních programovacích jazyků. (Takže pokud se naučíte programovat v C/C++, bude vám syntaxe Javy povědomá.)
Překladače pro různé platformy vytvářejí různí lidé, či organizace, proto vznikají standardy jazyka, které říkají, čemu všemu by měl překladač rozumět. Pokud se standardů budete držet, bude váš zdrojový kód přenositelný. Pokud budete využívat nějaká nestandardní vylepšení vašeho překladače, pak se nejspíš přenositelnost vašeho programu (resp. zdrojového kódu) sníží.

Bohužel, v počátcích vývoje jazyka C žádný standard neexistoval. Standardy se také postupem času mění a podpora toho či onoho standardu je v tom či onom překladači na různé úrovni. Jazyk C se už dlouho nevyvíjí, proto by jeho podpora měla být v překladačích na vysoké úrovni. Existuje standard ANSI C vytvořený organizací pro „americký standard“ www.ansi.org a z něj odvozený ISO/IEC 9899:1999 vytvořený organizací pro mezinárodní standard www.iso.org. Odvážnější z vás si mohou stáhnout „Logický výklad standardu C99“ v angličtině.

Přenositelnost zdrojového kódu je dána přenositelností programovacího jazyka a dodržováním standardů. Některé překladače totiž umí „něco navíc“, co obvykle usnadňuje psaní zdrojového kódu, ale snižuje přenositelnost.

Další faktor, který má vliv na přenositelnost zdrojového kódu je používání knihoven.

Knihovny jsou soubory obsahující funkce, které může váš program využívat (říká se, že je program volá). Za roky vývoje jazyka C bylo vytvořeno mnoho knihoven funkcí a jejich používáním si ušetříte velkou spoustu času. Existují standardní knihovny, které jsou dostupné na všech podporovaných platformách. Například knihovny pro práci se soubory. Některé takové knihovny budu probírat. Jiné knihovny jsou však dostupné jen na některých platformách. Tak třeba pokud budete chtít naprogramovat nějakou aplikaci v systému Windows a využívat přirozené grafické prostředí Windows, tj. všech těch pěkných tlačítek, rozbalovacích menu, přepínačů, okének atp., budete k tomu využívat knihovny Windows, které, pochopitelně, jinde než na Windows nebudou fungovat. Váš program se tak stane na Windows závislý. Existují knihovny pro grafické uživatelské rozhraní (angl. zkratka GUI), které jsou funkční na Windows i Linuxu, ale zase nejsou přenositelné nikde jinde a uživatel takového programu si na první pohled všimne, že to vypadá a chová se jinak, než běžné grafické aplikace. Je to dáno tím, že standard jazyka C (ani C++) nezahrnuje GUI (na rozdíl třeba od Javy, která GUI má. Díky tomu můžete v Javě psát snadno přenositelný program s GUI, ovšem za tu cenu, že bude vypadat ve všech OS stejně – ošklivě.).

Některé knihovny funkcí jsou zdarma, některé jsou zdarma pro nekomerční použití, některé jsou za peníze. Některé vyvíjejí dobrovolníci, některé komerční firmy, nebo i neziskovky. Některé jsou udržované a pořád se vyvíjejí, některé jsou už zastaralé. To je holt život.

Trocha historie C a C++

Programovací jazyk C je známý svou přenositelností a rychlostí. Byl navržen jako poměrně malý jazyk, kombinující efektivitu a výkonnost. Byl vytvořen v Bellových laboratořích AT&T Denisem Ritchiem v létech 1969 až 1973. Dále se na vzniku jazyka podíleli Brian Kernighan a Ken Thompson. Byl napsán pro snadnou přenositelnou implementaci Unixu (Unix je OS, na jehož základě se později vyvinul Linux). Postupem času vznikla ANSI (American National Standard Institute) norma jazyka C. Shodný standard definuje ISO (International Stnadards Organisation) norma. Proto se někdy uvádí spojení ANSI/ISO norma. Pokud budete ANSI normu dodržovat, máte velkou šanci, že budete moci svůj program přenášet na různé platformy.

Jazyk C++ je pokračovatelem jazyka C (jehož vývoj se již téměř zastavil). Nejdříve byl označován jako C with Classes, od roku 1983 C++. Vyvinul jej Bjarne Stroustrup v AT&T.
Jazyk C++ přináší novinky, především OOP (objektově orientované programování). Pojem OOP vysvětlím až dojde na C++.
První oficiální norma jazyka C++ byla přijata v roce 1998.

Původně fungoval jazyk C++ tak, že jen navíc umožňoval objektový zápis, který se překladačem nejdříve přepsal do klasického jazyka C a pak se teprve přeložil. Mohli jste tedy psát v C++ cokoliv jako v C a fungovalo to. Ty doby jsou už však dávno pryč a dnes je C++ prostě jiný programovací jazyk než C. Pořád ale platí (více méně), že co se naučíte v C, to uplatníte i v C++.

Tolik stručně z historie. Pokud by vás zajímala více, na internetu jistě najdete podrobnější informace o historii.

Ukázka zdrojových kódu

Jak jsem napsal dříve, program vytváří ze zdrojového kódu překladač. Podívejte se tedy nejdříve na to, jak vypadá takový zdrojový kód v jazyce C. Připomínám, že si pro tento kurz můžete stáhnout všechny zdrojové kódy. Název souboru, ve kterém je zdrojový kód uložen jsem vždy napsal do komentáře na začátek zdrojáku (Takže první zdrojový kód najdete v souboru hello.c)

  1. /*------------------------------------------------*/
  2. /* c03/hello.c                                    */
  3.  
  4. #include <stdio.h>
  5.  
  6. int main(void)
  7. {
  8.     printf("Hello World\n");
  9.     return 0;
  10. }
  11. /*------------------------------------------------*/

Pokud vidíte na začátcích řádků čísla, tak ty nejsou součástí zdrojového kódu. Jsou tu na mé webové stránce jen pro to, abych se na čísla řádků mohl odkazovat v textu (např. na řádku 2 vidíte název souboru c03/hello.c).

Tak málo stačí napsat k tomu, abyste mohli vytvořit kompletní funkční program. Jak snadné, že? Význam toho co je tam napsáno osvětlím později. Program vytvořený z tohoto zdrojového kódu neudělá nic jiného, než že vytiskne na obrazovku (v „textovém režimu“, tj. například v okně DOSu nebo příkazového řádku) „Hello World“ a přesune kurzor na další řádek (odřádkuje).

V C++ se předchozí program zapíše takto:

/*------------------------------------------------*/
/* c03/hello.cpp                                  */

#include <iostream>

int main(void)
{
     std::cout << "Hello World\n";
    return 0;
}
/*------------------------------------------------*/

Kód jazyka C můžete přeložit i pomocí překladače jazyka C++, ale zdroják C++ již jen pomocí překladače C++. Překladač jazyka C nezná (by neměl znát) operátor <<, ani std::cout.
Tímto vás nechci nabádat, abyste používali na jazyk C překladač jazyka C++, protože (v tom lepším případě) by vás mohli obtěžovat zbytečné varování překladače, v tom horším případě dříve nebo později narazíte na nějakou nekompatibilitu, protože C a C++ jsou už prostě dva různé programovací jazyky, ačkoliv v základu velmi, velmi podobné.

Zdrojové kódy v jazyce C se zapisují do souboru s příponou .c a v jazyce C++ s příponou .cpp. Některé (starší) překladače vyžadují místo cpp příponu cc (nejen shodnout se na příponě zdrojových kódů bylo pro tvůrce překladačů nadlidský úkol). Některým překladačům je přípona ukradená. Důležité je, že zdrojový kód je obyčejný textový soubor, který otevřete třeba v notepadu (poznámkový blok). Zdrojový kód rozhodně nemůžete uložit ve formátu Microsoft Word atp.

O tom jak z těchto zdrojových souborů vytvořit program bude další kapitola.

Komentář Hlášení chyby
Vytvořeno: 29.8.2003
Naposledy upraveno: 10.9.2008
Tato stánka používá ke svému běhu cookies, díky kterým je možné monitorovat, co tu provádíte (ne že bych to bez cookies nezvládl). Také vás tu bude špehovat google analytics. Jestli si myslíte, že je to problém, vypněte si cookies ve vašem prohlížeči, nebo odejděte a už se nevracejte :-). Prohlížením tohoto webu souhlasíte s používáním cookies. Dozvědět se více..