Níže uvedený text pochází z prvního vydání. Nad tímto textem se nachází aktuální stav po revizi sm>řující k druhému vydání.
V tomto dokumentu uvádím n>které z programovacích jazyků, které jsem používal nebo zkoumal (tj. hrál jsem si s nimi) b>he předchozích let. Jde o velmi osobní pohled. N>kdy se vyjádřená hlediska mohou zdát protikladná nebo dokonce zcela překroucená. Je to tím, že odrážejí můj stav mysli v dob>, kdy jsem ten který jazyk používal.
Jazyky jsem uspořádal to t>chto skupin:
Tam, kde to bude dávat smysl, uvedu v daném jazyce program 'Hello World'.
Poznámka překladatele: Dalo by se přeložit jako 'Ahoj sv>te!', 'Ahoj lidi!' a podobn>. Samotný text není důležitý. Jde o klasický program, který použili autoři jazyka C ve své knize. Program má za úkol pouze vypsat tento řet>zec a skončit. Dá se říci, že je to ustálený, klasický demonstrační program. Patří obvykle k nejjednodušším programům, který lze v libovolném jazyce napsat. Jeho zdrojový kód jasn> ukazuje minimum, které musíme jako programátoři napsat, aby program začal navenek komunikovat.
Tím v práci myslím to, že jsem byl za tuto práci placen a že výsledný program používá více jiných lidí. Mám zde na mysli také to, že tyto programy byly vyvíjeny s použitím průmyslových standardů pro vývoj software, pro jeho dokumentování a podobn>.
Když jsem poprvé začal používat jazyk C (b>hem prázdninového projektu, v dob> studia na univerzit>), bylo to jako závan sv>žího vzduchu po všech t>ch omezeních, kladených jazykem ANSI Pascal. Jazyk C umožňoval rychlé vyjadřování myšlenek s práv> takovou mírou typové kontroly, která vám dá poznat, že n>co d>láte špatn>, ale ne zase s tak přísnou typovou kontrolou, která by vás vyčerpávala, jako v jazyce Pascal. Používání jazyka C současn> znamenalo omezení výletů do Assembleru jen na ty oblasti, kde bylo používání Assembleru hračkou.
O n>kolik let pozd>ji jsem přešel k C++. B>hem času však shledávám, že jazyk C++ používám jako lepší C, přičemž příležitostn> dávám přednost originálu. C++ pozvedává typovou kontrolu tém>ř na úroveň jazyka Pascal a přidává celou řadu nových rysů, které jazyk komplikují a zpomalují překladač.
Jazyk C patří k mým oblíbeným jazykům. Není to jen shoda okolností, ani to není nijak překvapující, že operační systém, o kterém každý mluví — Linux — je napsán v čistém C a ne v C++.
Poznámka překadatele: No jo! Jenže Unix, jehož odrůdou je i Linux, vznikl současn> s jazykem C, v jedné díln> a v jedn>ch hlavách. Je to velmi klasický systém. To jinými slovy znamená, že vznikal v dob>, kdy objektov> orientované programování nebylo ani v plenkách. Jádro operačního systému unixového typu je založeno na volání funkcí a práci s datovými strukturami (MS Windows v tomto smyslu spadá do stejné kategorie). S objekty se zde nesetkáme a použití jakéhokoliv objektov> orientovaného programovacího jazyka pro zápis jádra systému proto nemůže přinést velké výhody.
#include <stdio.h>
void main()
{
char* msg="Hello World!"; /* podobný obrat, jako v OO příkladech */
puts(msg);
}
Poznámka překladatele: Funkce main()
by podle normy jazyka C m>la vracet výsledek typu int. M>li
bychom proto psát int main() nebo pouze main().
Mnohé překladače sice zápis void main() tolerují, ale v
podstat> je nesprávný.
Jazyk C++ lze přirovnat k jazyku C s přidanými zvonečky. Ty ze začátku cinkaly jen příležitostn> a tvořily sladkou hudbu. Ale v současnosti je t>ch zvonečků už tolik, že přes ten hluk už není hudba slyšet! (A n>které moderní programy v C++ podle toho vypadají!)
K jazyku C++ chovám hluboký obdiv a pro tvorbu velmi velkých systémů nebo prostředí, kde se používá mnoho odlišných způsobů návrhu a programování, je nepřekonatelný. Jeho pružnost nanešt>stí přináší i problémy. Bez intimního porozum>ní jeho vnitřním mechanismům se tvorba dobrých programů v C++ stala tém>ř nemožnou. Ironií je, že jedním z primárních cílů jeho návrhu je umožnit programátorovi práci na vyšší úrovni abstrakce.
#include <string.h>
#include <stdio.h>
class Message // definuj třídu pro zprávu
{
private:
char msg[50];
public:
Message(char* s)
{strcpy(msg,s);};
void print()
{puts(msg);};
};
void main()
{
m = new Message("Hello World!");
m->print();
delete m;
}
Poznámka překladatele: Podle mého názoru to není C++, které činí uvedený příklad nepřehledným — viz následující protipříklad. Jazyk C++ zcela jist>, v souladu s původními zám>ry, umožňuje efektivní práci na vyšších úrovních abstrakce. Problém spočívá v tom, že to nelze ztotožňovat s jednoduchostí jazyka.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string msg("Hello World!"); /* podobný obrat, jako v OO příkladech */
cout << msg;
return 0;
}
Delphi ve skutečnosti není programovacím jazykem. Jde o vývojové prostředí. Ale v rámci tohoto vývojového prostředí mají všichni tendenci nazývat takto i jazyk, se kterým v prostředí pracují — takže popluji s proudem.
Skutečné jméno jazyka uvnitř Delphi je Object Pascal. Jde o (v mnoha sm>rech odlišnou) verzi jazyka, kterou firma Apple používala pro programování prvních počítačů Macintosh. Firma Apple ke standardnímu Pascalu přidala rysy související s objektov> orientovaným programováním. (Podrobn>jší popis jazyka a ukázky v jazyce Object Pascal v applovské podob> můžete nalézt v prvním vydání Boochovy knihy OOAD, 1992.)
Varianta jazyka Object Pascal, která se používá v prostředí Delphi, v podstat> přidává k jazyku Pascal ty nejlepší rysy z jazyka C++, ale nesnaží se o úplnou zp>tnou kompatibilitu nebo o nekompromisní přístup z pohledu výkonnosti a podobn>. Výsledkem je z lidského hlediska mnohem čiteln>jší a jednodušší jazyk. Pro vážné programování ve Windows je Object Pascal jazykem, kterému dávám přednost. Prostředí Delphi je navíc nejlepším integrovaným vývojovým prostředím, které jsem kdy používal. (Momentáln> používám verzi 3, ačkoliv v dob> psaní tohoto textu je má poslední verze číslo 4.)
program hello; {--------- Definice třídy ---------} type class=TMessage msg : String; public: constructor Create(s : String); procedure Print; end; constructor TMessage.Create(s : String); begin msg := s; end; procedure TMessage.Print; begin writeln(msg); end; {------------ Konec definice třídy -----------} var m : TMessage // deklarace reference na instanci begin m := TMessage.Create('Hello World'); // vytvoříme instanci m.Print; m.Free; end.
Poznámka překladatele: Op>t si dovolím upozornit na to, že v každém jazyce lze napsat program dobře a špatn>. Jazyk C++ vám možná umožní program napsat více špatnými způsoby. Bez jeho dobré znalosti možná ten správný způsob zapsání programu možná obtížn>ji naleznete. Ale když se použijí jen ty správné zvonečky, lze z n>j stále vyloudit p>knou hudbu. Ale pravda je, že hrát na flašinet typu Visual Basic je asi snazší, než hrát na vícemanuálové varhany C++. Pro každý účel se má používat takový nástroj, který je nejvhodn>jší. Zkuste si představit žebráka hrajícího na varhany.
Na stejném příkladu bych rád ukázal sílu jazyka C++, která nemusí nezbytn> vést k menší přehlednosti, než je tomu u Object Pascalu. V následujícím příkladu se snažím o co nejpodobn>jší zápis výše uvedeného příkladu, včetn> shodných identifikátorů a podobn> umíst>ných komentářů:
#include <iostream> #include <string> // --------- definice třídy --------- class TMessage { private: std::string msg; public: TMessage(const std::string & s); // konstruktor void Print(); }; TMessage::TMessage(const std::string & s) { msg = s; } void TMessage::Print() { std::cout << msg << std::endl; } // ------------ Konec definice třídy ----------- int main() { TMessage m("Hello World"); // vytvoříme inicializovanou instanci m.Print(); return 0; // tento obrat je doporučen normou }
Ale osobn> bych stejný příklad napsal spíše takto:
#include <iostream> #include <string> // Class definition class TMessage { public: TMessage(const std::string & s) { m_msg = s; } void Print() { std::cout << m_msg << std::endl; } private: std::string m_msg; // m_ předpona pro datové členy (member) }; int main() { TMessage m("Hello World"); // vytvoříme inicializovanou instanci m.Print(); return 0; }
COBOL patří k jednomu z prvních počítačových jazyků. Sv>tlo sv>ta spatřil v roce 1959, práv> jeden rok po mn>. Je to jeden z posledních počítačových jazyků, které jsem používal. Tím ho ovšem nechci nijak obhajovat. Mezi programátory nepatří zrovna k populárním jazykům. A ačkoliv se snažím o neutrální postoj, nezbývá mi, než s tím souhlasit. COBOL se vyznačuje n>kolika dobrými rysy, především t>mi, které se vztahují k jeho dennímu chlebu — zpracování dat, číselné výpočty a práce se soubory. Zejména jeho schopnosti generování sestav zastiňují jeho současníky. Jeho práce se soubory patří prost> k nejlepším. To ovšem nevyvažuje jeho negativní vlastosti: používání velkých písmen, pevné pozice klíčových slov a ukecanost až k zblázn>ní. Budu docela šťastný, když už s jazykem COBOL nebudu muset nikdy víc pracovat.
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO-PROG.
*******************************
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-PC.
OBJECT-COMPUTER. IBM-PC.
********************************
DATA DIVISION.
********************************
PROCEDURE DIVISION.
DISPLAY-PARA.
DISPLAY "HELLO WORLD FROM COBOL!".
END-PARA.
STOP RUN.
Vyčerpávající popis malých jazyků naleznete v sérii článků, které byly publikovány v časopise Dr. Dobbs a v ICM. Doporučuji sejména sérii knih Programming Pearls, kterou napsal Jon Bentley. Malými jazyky zde rozumím skriptovací jazyky. N>které z nich se však ve skutečnosti staly velmi rozsáhlými.
Jde o první malý jazyk, se kterým jsem se setkal, a stále patří mezi mé oblíbené. Pomáhá řešit principiáln> jednoduché úkoly jednoduchým a rozumn> rychlým způsobem. M>l by se jej naučit každý!
Základní princip zpracování v awk je založen na vyhledávání vzorků. Awk čte textový soubor řádek po řádku a vyhledává vzorky. Pokud nalezne n>který z předepsaných vzorků, provede libovolnou akci, která pro n>j byla definována. Standardn> (default) je touto akcí tisk řádku. Program v awk se tedy skládá z množiny dvojic vzorek/akce. Mezi jeho typická použití patří extrahování sloupců z datových souborů, generování souhrnných zpráv a podobn>.
Poznámka: Tato verze tiskne řet>zec "Hello World" pokaždé,
když na řádku vstupního souboru nalezne řet>zec "Hello" nebo
"hello". Na záv>r zobrazí počet úsp>šných rozpoznání
vzorků.
#!/bin/awk
BEGIN {msg="Hello World"}
/[Hh]ello/ {print msg; count++}
END {print "Hello bylo v souboru ", FILENAME, " nalezeno ", count, "krat."}
Perl dal příchuť n>kolika posledním rokům, plus mínus n>jaký ten m>síc. Jde o mocný nástroj. Škoda jen, že jeho řádky vypadají, jako kdyby n>kdo rozsypal písmenka — s velmi škodolibým zám>rem.
Jazyku Perl jsem nikdy nepřišel tak úpln> na chuť. Vidím sice jeho sílu, ale n>jakým způsobem prost> uráží mé smysly. Všechno v n>m tak trochu (nebo i trochu víc), jako kdyby to drželo pohromad> spíše díky lepicí pásce a lepidlu, než díky srozumitelnému, logickému návrhu. (Jeho mechanismu pro objektové programování se to týká především.)
Nelze popřít, že sv>t WWW je řízen Perlem do značné míry. Pokud vás přitahuje, nenechte se mnou zastavit! Místo toho navštivte stránky http://www.perl.org/.
$msg = "Hello World"; print $msg;
Je to Perl pro puristy — zejména pro objektov> orientované puristy. Miluji jej do posledního bitu!
Python je objektov> orientovaný skrz naskrz. Jeho součástí je rozsáhlý systém modulů. Python je navržen tak, aby dovoloval skriptování ve velkém[1]. Ačkoliv je mnohem mén> známý, než Perl, můžete v jazyce Python dosáhnout stejných výsledků při srovnatelném úsilí — a výslednému kódu budete pravd>podobn> rozum>t dokonce i po šesti m>sících.
#!/local/bin/python
class Message:
def __init__(self, str="No message provided"):
self.text = str
def printIt(self):
print self.text
if __name__ = "__main__":
m = Message("Hello World")
m.printIt()
Poznámka překladatele: Uvedený příklad v jazyce Python odpovídá
variantám, kdy tvoříme samostatnou třídu pro zprávu (message). V Pythonu
můžeme samozřejm> napsat i jednodušší ekvivalent perlovského programu,
který vznikne pouhým odmazáním dvou znaků $ a dvou středníků:
msg = "Hello World" print msg
Pokud ale trochu znáte Perl, musíte uznat, že vytvoření verze programu,
která by definovala třídu Message, je přinejmenším krkolomné. V Perlu
potřebujete k vytvoření třídy doslova požehnání (klíčové slovo
bless). O přehlednosti mechanismu práce s objekty nemůže být
při srovnání s jazykem Python ani řeč.
sh, csh, tcsh, ksh, bash. Vyberte si váš oblíbený. Jde o příkazový
procesor s opravdovou silou. Můžete v n>m realizovat v>tvení
if, case, i cykly while a
for. Můžete v n>m testovat typ souboru (zda se jedná o adresář,
systémový soubor, přístupová práva, atd.) Udržuje historii použitých
příkazů, podporuje automatické doplňování jména souboru nebo příkazu,
umožňuje provád>ní úloh v popředí nebo v pozadí, a tak dále, a tak dále.
#! /bin/sh message="Hello World" echo $message
Co bych k n>mu mohl říci? Příkazový procesor s mizernou silou? N>kterým lidem se podařilo vymáčnout z n>j maximum a dosáhnout neuv>řitlené v>ci. Přesto jej nemám rád a přál bych si, aby Microsoft poskytnul opravdu užitečný dávkový jazyk pro Windows NT. (Ale pánové, dodávání instalace jazyka Perl jako součást Resource Kit, se nepočítá!)
SET MSG="Hello World" ECHO %MSG%
Označení experimentální se zde vztahuje k mé osob> — experimetnoval jsem s nimi. To ovšem neznamená, že tyto jazyky představují n>jaký experiment z pohledu počítačové v>dy. Spíše by se dalo říct, že jsem v t>chto jazycích napsal svým způsobem minimalistické aplikace jen proto, abych se o t>chto jazycích n>co dozv>d>l. D>lící čára mezi t>mito jazyky a jazyky, které jsem označil jako malé, je velmi tenká. V malých jazycích jsem ovšem vytvořil nástroje, které skutečn> používám. V experimentálních jazycích jsem vytvořil nástroje, které b>žn> nepoužívám.
Tím ovšem nechci tvrdit, že jde o n>jaké podřadné jazyky. Každý z nich je jinými programátory používán pro tvorbu aplikací. A každý z nich mi dal cenné lekce, týkající se programování. Každému, kdo chce být programátorem, srdečn> doporučuji, aby si vyzkoušel co nejvíce různých stylů programování. Všechny tyto jazyky v sob> mají n>co, čím se liší od jazyků hlavního proudu, o kterých jsme se zmínili výše.
BASIC byl v podstat> mým prvním programovacím jazykem. Ale v>ci, které jsem v n>m d>lal, byly tak jednoduché, že je ani nepovažuji za programování. BASIC jsem začal používat na svém mikropočítači s operačním systémem CP/M. Seznámil jsem se přes n>j se soubory s náhodným přístupem. Občas si ješt> s jazykem BASIC hraji — zejména, když pracuji na n>jakém počítači, kde je to jediný programátorský nástroj, který je tam nainstalovaný.
Nadšenci spojení pupeční šňůrou s jazykem Visual Basic mne neustále přesv>dčují o tom, že kvalita moderního dialektu tohoto jazyka je dobrá. Ale přesto, že jsem si stáhl jeho zdarma dostupné vydání zvané CCE a vytvořil jsem pár jednoduchých aplikací, nevyvolal ve mn> žádné opravdové nadšení. Bejziku, je mi líto.
LET MSG$ = "Hello World" PRINT MSG$;
Fanoušci jazyka Lisp jej popisují jako jediný krásný programovací jazyk. Jeho zavilí kritici říkají, že Lisp znamená Lots of Irrelevant Silly Parentheses. (Tj. mnoho zbytečných pitomých závorek. Setkal jsem se také s vysv>tlením Lost In Stupid Parentheses, neboli ztracen v hloupých závorkách.) Sympatizuji s ob>ma názory. Slovo Lisp ve skutečnosti znamená List Processing (čili zpracování seznamů). Tento jazyk je velmi názorný v tom smyslu jak vypadá a jak funguje. V jazyce Lisp je vše buď seznam nebo atom. Atomem se rozumí prvek seznamu, který sám o sob> není seznamem.
Práv> zmín>ná zásadní čistota formy a jednoduchá syntaxe představují vlastnosti, které provokují k výše zmín>nému postoji o kráse jazyka. U Lispu jsem se naučil jiné způsoby strukturování problému, používat rekurzi (tedy n>co, čemu jsem se dříve vyhýbal jako příliš komplikovanému) a oceňovat nápad, že data mohou být použita jako program a naopak.
Další v>c, která u jazyka Lisp stojí za zmínku, je skutečnost, že jde o jeden z prvních počítačových jazyků, spolu s jazyky COBOL a Fortran. Považuji za zajímavé, že všechny tyto nejrann>jší jazyky jsou ve svých oblastech nasazení stále vnímány jako mocné, zatímco n>které modern>jší jazyky (Algol, PL/1, CORAL a dokonce ADA) prošly obdobím rozmachu a pak zmizely z očí. Mohli tvůrci on>ch prvních jazyků v>d>t n>co, co tvůrcům pozd>jších jazyků uniklo?
Na záv>r uveďme, že jazyk Lisp má spoustu variant. Osobn> jsem nejvíce pracoval s verzí Elisp, což je makrojazyk editoru Emacs, XLISP, což je experimentální objektov> orientovaná verze a Flavors, což je velmi ranný experimentální objektov> orientovaný dialekt. Hlavní proud jazyka Lisp se dočkal standardu jménem Common Lisp a objektov> orientovaného systému, zvaného CLOS. CLOS patří snad k nejúpln>jším objektov> orientovaným prostředím, která jsou dnes k dispozici, i když je to prostředí docela ukecané a velmi složité. Z tohoto důvodu jsem se ani nepokusil o objektov> orienovanou verzi programu Hello world.
Poznámka: Lispovský program je sám o sob> seznamem. Každý prvek seznamu je seznam insrukcí. Seznamy s instrukcemi mohou být zanořené. Tímto způsobem se implementují podmín>né části, cykly atd.
( (setq msg "Hello World") (print 'msg))
S jazykem Logo jsem se poprvé setkal na svém mikropočítači s CP/M. Byl to trochu podivný přídavek v rámci dodávaného softwarového balíku. Jde o jednoduchý programovací jazyk, který byl navržen pro výuku programování pro d>ti. Používá sadu příkazů, kterými se po podlaze vodí robot zvaný želva. Želva má k dispozici tužku, kterou může kreslit různé tvary. (Poznámka překladatele: Želva může na základ> příkazů tužku spustit nebo zvednout a tak za sebou může zanechávat stopu svého pohybu, nebo ne.) Tento způsob kreslení vešel ve známost jako želví grafika a byl přenesen do mnoha jiných jazyků, včetn> jazyků Pascal a Smalltalk.
Logo ale má i svou vážnou tvář. Zahrnuje v sob> plné schopnosti zpracování seznamů a vlastní mnoho rysů jazyka Lisp, včetn> konceptu, kdy se program skládá ze seznamů a sám o sob> je seznamem. Tím se Logo stává vhodným nástrojem pro výuku (a implementování) technik um>lé inteligence, osvobozující studenty od hromady závorek a neobvyklé syntaxe (z pohledu procedurálních programátorů), tedy rysů, které jsou vlastní jazyku Lisp.
Modern>jší verze jazyka Logo si přinášejí objektov> orientované vlastnosti. Existují dokonce i verze pro programování aplikací s okny (dodávají se s objektovými knihovnami pro tvorbu grafického uživatelského rozhraní).
To Hello
MAKE "Message [Hello World]
PRINT :Message
End
Hello
Prolog je jiný. Velmi jiný!
V Prologu definujete pravidla, kterými popisujete, co se má stát, a necháte systém aby si sám našel způsob jak se toho má dosáhnout. Začátečníkům se to jeví jako velmi intuitivní a programátorům, kteří prošli výukou libovolného jiného jazyka, se to zdá velmi podivné.
Prolog je hlavním pilířem výzkumu um>lé inteligence, zejména v Evrop> a v Japonsku. Japonci, v rámci pokusu o soupeření s USA na poli počítačů, v osmdesátých letech oznámili, že do roku 1990 vyrobí počítač páté generace, který bude založen na jazyku Prolog. Nikdy sice nespatřil sv>tlo sv>ta, ale Japonci usp>li v ovládnutí výpočetní oblasti díky mnohem jednodušší strategii — vyráb>jí více a lepších pam>ťových čipů, než kdokoliv jiný.
S jazykem Prolog jsem si mohl pohrát, protože byl k dispozici na počítači VAX, který jsem používal ve svém prvním zam>stnání. Vždycky jsem se divil, proč tam ten Prolog je. Zcela určit> jsme jej nikdy nepoužili při řešení úkolů, kterými jsme se živili.
V Prologu jsem vlastn> nikdy nenapsal n>jaký důležitý program, ale jeho celková koncepce mne fascinuje. Jednoho dne pro n>j možná najdu n>jaké opravdové použití. Do té doby si s ním budu zatím jen hrát — když m> přepadne špatná nálada.
Message is "Hello World" Message?
Smalltalk, to jsou objekty. Všude. Vždycky.
Ačkoliv se uznává, že prvním objektov> orientovaným jazykem byla Simula 67, prvním opravdu rozšířeným se stal Smalltalk. B>hem 70. let se Smalltalk vyvinul v n>co, co se m>lo stát úplným objektov> orientovaným prostředím: Smalltalk 80.
Pokud si chcete vyzkoušet Smalltalk 80, stáhn>te si kopii Squeak z disney.com. Jeho prostředí je v>rnou kopií programového prostředí Smalltalk 80, včetn> GUI. Jeho grafické uživatelské rozhraní je sice při srovnání s moderními standardy zjevn> excentrické, ale stalo se katalyzátorem pro vznik prostředí počítačů Macintosh, pro vznik Windows...
Mou preferovanou implementací jazyka Smalltalk je Dolphin Smalltalk pro Windows 95. Neobvyklé na n>m je to, že vývojové prostředí je k dispozici zdarma. Pokud ale chcete výsledný program dodávat v podob> EXE, musíte si koupit nástroj pro jeho vytvoření. Zdá se, že je to rozumná alternativa k shareware v rámci přístupu vyzkoušej si, než si koupíš.
Vývojové prostředí je dobré a dokumentace i učebnice ve formátu HTML jsou velmi čtiv> napsané. Existuje i skupina, která se zabývá podporou.
Fanoušci jazyka Smalltalk si libují v konzistentnosti jazyka (jak jsem
řekl, vše je objekt) a v tom, že existuje jen malá množina syntaktických
konstrukcí — odtud vyplývá snadné naučení se jazyku. To má tedy být
základní myšlenka. Osobn> jsem musel absolvovat tři pokusy ve dvou různých
prostředích, než mi to vlezlo do hlavy. Občas je Smalltalk zdatným soupeřem
jazyků C a Perl — při používání záhadných a přetížených symbolů
(@, #, [, ], atd.).
message := string new: "Hello World". message display.
Pokud k uvedeným pohledům chcete doplnit n>jaké připomínky, napište mi, prosím. (..., ale anglicky.)
Pokud vás napadne, co by se dalo na překladu této kapitoly vylepšit, zašlete e-mail odklepnutím Tím budou do dopisu automaticky vloženy informace o tomto HTML dokumentu.
$Id: czcomplang.html,v 1.4 2004/08/31 11:55:12 prikryl Exp $