Programßtorskß rubrika Chipu urΦit∞ netrpφ nedostatkem Φlßnk∙, p°iznßvßme vÜak, ₧e si v nφ a₧ dosud poΦetli p°evß₧n∞ jen "cΘΦka°i" a "java°i". Dluh, kter² zde cφtφme, se nynφ sna₧φme alespo≥ ΦßsteΦn∞ splatit tφmto dvoudφln²m p°φsp∞vkem.
Kdy₧ firma Sun Microsystems p°iÜla na ve°ejnost s programovacφm jazykem Java, jist² nejmenovan², miliardami opl²vajφcφ Φlov∞k pohotov∞ vyslovil zajφmavou myÜlenku. Äe toti₧ pro nov² programovacφ jazyk u₧ nenφ mφsto, ₧e ty starΘ nßm bohat∞ staΦφ (hlavn∞ Basic) a ₧e tu jednoduÜe nikdo ₧ßdnou Javu nechce. O pßr let pozd∞ji, kdy₧ byl p°edstaven nov² jazyk C#, zmφn∞nß osoba podle pot°eb trhu poopravila svΘ nßzory. Zato slova o nepot°ebnosti novΘho jazyka se zaΦala objevovat zase na druhΘ stran∞ barikßdy.
Je ale opravdu v²voj programovacφch jazyk∙ u konce? Nebo je snad v rukou dvou firem, jejich okam₧it²ch zßjm∙ a nßlad? Jist∞ v∞°φte, ₧e tak tomu b²t nem∙₧e. Nßvrh a implementace programovacφch jazyk∙ je dnes jednou z nejotev°en∞jÜφch oblastφ v celΘm poΦφtaΦovΘm oboru. Vytvß°ejφ je firmy, univerzity i jednotlivci. Za n∞kolik poslednφch let tak vznikly desφtky nov²ch jazyk∙, Φasto mnohem kvalitn∞jÜφch ne₧ ty vÜeobecn∞ znßmΘ. Poj∩me tedy trochu napravit nespravedlivΘ mlΦenφ o nich.
Pom∞rn∞ mlad²m exemplß°em programovacφho jazyka je Component Pascal. Nejednß se o ₧ßdnou exotiku "lispovsko-smalltalkovskΘho" typu, zato je k dostßnφ i s v²vojov²mi nßstroji a bohat²mi knihovnami pro b∞₧nΘ platformy, a hlavn∞ je velmi dob°e pou₧iteln² v praxi k normßlnφmu programovßnφ.
Prvnφ pohled
Component Pascal - mß to n∞co spoleΦnΘho s Pascalem? Ano, je tomu tak. Ale jde o trochu vzdßlen∞jÜφ p°φbuzensk² vztah, ne₧ by se mohlo podle jmΘna zdßt. Component Pascal nenφ dialektem Pascalu (jako t°eba TurboPascal), ale jeho o t°icet let mladÜφm potomkem.
Na poΦßtku (tΘm∞°) vÜeho stßl Üv²carsk² profesor Niklaus Wirth, Φlov∞k s mo₧nß nejv∞tÜφmi zßsluhami o celkov² v²voj vÜech modernφch programovacφch jazyk∙ v∙bec. Ten nejprve koncem 60. let navrhl dob°e znßm² Pascal, kter² kladn∞ ovlivnil naprostou v∞tÜinu dneÜnφch jazyk∙ od C++ a Javy p°es Eiffel a₧ po VisualBasic ("Jestli je na n∞m n∞co dobrΘ, pak dφky Pascalu," tvrdφ zlφ jazykovΘ...).
Ale vra¥me se k profesoru Wirthovi. Deset let po Pascalu vyvinul dokonalejÜφ jazyk Modula-2 a o dalÜφ desetiletφ pozd∞ji vytvo°il jejφ inovacφ a zjednoduÜenφm objektov∞ orientovan² Oberon. Ten jeÜt∞ stihl dosp∞t do verze Oberon-2, a potom se ho ujala Üv²carskß firma Oberon Microsystems, kterß n∞kdy v roce 1997 uvedla jeho nov² dialekt pojmenovan² Component Pascal.
Ale dosti historie a podφvejme se, jak² Component Pascal je. Je to univerzßlnφ objektov∞ orientovan² programovacφ jazyk vychßzejφcφ z rodiny Pascalu, kter² sv²m zam∞°enφm p°φmo konkuruje Jav∞ a C++. Mezi jeho hlavnφ vybavenφ pat°φ siln² typov² systΘm, mechanismus samostatn∞ p°eklßdan²ch modul∙ s exportem a importem, automatickß sprßva pam∞ti (garbage collection), jednoduchß d∞diΦnost, polymorfismus a v²bornΘ mo₧nosti definice architektury slo₧it∞jÜφch program∙.
Component Pascal je jazyk pom∞rn∞ bohat² sv²mi schopnostmi, p°esto ale nezvykle jednoduch². Jeho kompletnφ manußl nemß vφce ne₧ 32 stran vΦetn∞ rozsßhl²ch p°φklad∙ k≤du, syntaktick²ch diagram∙ a dalÜφch dodatk∙.
Tolik obecn∞, a podφvejme se u₧ na prvnφ mal² progrßmek:
Podobn∞ jako v jin²ch programovacφch jazycφch jsou i v Component Pascalu jistΘ elementßrnφ syntaktickΘ prvky - identifikßtory, klφΦovß slova, specißlnφ symboly, literßly (Φφsla, °et∞zce) a komentß°e. Je na mφst∞ upozornit, ₧e Component Pascal - na rozdφl od Pascalu (a podobn∞ jako t°eba Java) - chßpe v identifikßtorech malß a velkß pφsmena jako odliÜnß.
KlφΦovß slova se pφÜφ v²hradn∞ velk²mi pφsmeny. To se m∙₧e zdßt zpoΦßtku trochu divnΘ, ale jde jen a jen o zvyk (nakonec toto pravidlo vede k p°ehledn∞jÜφmu k≤du).
Celß Φφsla mohou b²t zapisovßna v desφtkovΘ nebo ÜestnßctkovΘ soustav∞. Ve druhΘm p°φpad∞ je Φφslo nßsledovßno velk²m pφsmenem H (32bitovΘ konstanty) nebo L (64bitovΘ konstanty). èestnßctkovΘ Φφslo p°itom v₧dy musφ zaΦφnat desφtkovou Φφslicφ (nap°. 0FFFFH).
TextovΘ °et∞zce mohou b²t uzav°eny do uvozovek nebo do apostrof∙ a ohraniΦujφcφ znak se nesmφ vyskytovat uvnit° (je vÜak dovoleno nap°. "She's like a wind."). JednoznakovΘ °et∞zce lze pou₧φvat i jako znakovΘ konstanty. Ty se jinak zadßvajφ jako ÜestnßctkovΘ Φφslo nßsledovanΘ pφsmenem X (t°eba 0DX, 0AX).
Komentß°e jsou ohraniΦeny sekvencemi (* a *) jako ve starΘm dobrΘm Pascalu, navφc sm∞jφ b²t vno°ovßny do sebe ve vφce ·rovnφch.
Zßkladnφ stavebnφ jednotkou programu je modul. M∙₧e obsahovat samotnΘ t∞lo programu nebo m∙₧e deklarovat sdφlenΘ typy, konstanty, procedury a prom∞nnΘ spolu s k≤dem pro jejich inicializaci. Tedy n∞co jako jednotky v TurboPascalu a t°φdy v Jav∞. Moduly jsou umφst∞ny v samostatn²ch souborech a majφ nßsledujφcφ strukturu:
MODULE MujPrvniModul;
IMPORT Modul1, Modul2, (* nebo zkrßcen∞ *) M3 := Modul3;
(* nßsledujφ deklarace CONST, TYPE, PROCEDURE, VAR *)
(* a t∞lo - hlavnφ blok *)
BEGIN
(* inicializaΦnφ p°φkazy *)
CLOSE
(* p°φkazy pro ·klid po skonΦenφ programu *)
END MujPrvniModul;
Identifikßtory z importovan²ch modul∙ se pou₧φvajφ i s uvedenφm jmΘna modulu (Modul1.KrasnyTyp), respektive jeho synonyma (M3.KdesiCosi). P°φstupnΘ jsou jen identifikßtory, kterΘ jejich domßcφ moduly v²slovn∞ exportujφ (o tom a₧ za chvφli).
P°φkazovΘ sekce vÜech pou₧it²ch modul∙ se provedou p°i startu programu (p°φkazy za BEGIN) a p°i jeho ukonΦenφ (p°φkazy za CLOSE - vhodnΘ pro zavφrßnφ soubor∙, ruÜenφ r∙zn²ch systΘmov²ch handler∙ apod.). Sekce BEGIN a CLOSE mohou b²t vynechßny. Pokud jsou vynechßny ob∞, nßsleduje po deklaracφch p°φmo zßv∞reΦn² END se jmΘnem modulu.
Deklarace
V Component Pascalu m∙₧eme deklarovat konstanty, prom∞nnΘ, typy a procedury. Na funkce se nezapomn∞lo, jen jsou pova₧ovßny za zvlßÜtnφ druh procedury. Deklarace nachßzejφcφ se na ·rovni modulu (tedy ne ty lokßlnφ, pat°φcφ procedurßm) mohou b²t exportovßny uvedenφm symbolu * (tzv. specifikßtor) za identifikßtorem.
Na deklaraci konstant nenφ vcelku nic novΘho. Tady je mßme:
CONST
Pi* = 3.14;
e* = 2.78;
Adr* = "http://www.oberon.ch";
Enter = 0DX;
TakΘ deklarace prom∞nn²ch se moc neliÜφ od Pascalu. Prom∞nnΘ mohou b²t exportovßny jeÜt∞ dalÜφm zp∙sobem - umφst∞nφm specifikßtoru minus za identifikßtor. V tom p°φpad∞ je prom∞nnß v jin²ch modulech p°φstupnß jen pro Φtenφ.
VAR
x, y, z : REAL;
m, n : INTEGER;
Size*: INTEGER;
Limit-: INTEGER;
Zb²vß se podφvat na smeΦku standardnφch typ∙ Component Pascalu. Mßme pom∞rn∞ sluÜn² v²b∞r:
* V prvnφ °ad∞ je tu klasick² typ BOOLEAN, jeho hodnoty jsou TRUE a FALSE.
* CeloΦφselnΘ typy jsou Φty°i - BYTE, SHORTINT, INTEGER a LONGINT. VÜechny jsou urΦeny pro Φφsla se znamΘnkem, jejich rozsahy jsou 8, 16, 32 a 64 bit∙.
* Dßle mßme dva typy pro reßlnß Φφsla, SHORTREAL a REAL, odpovφdajφcφ 32- a 64bitovΘmu formßtu podle standardu IEEE 754 (jin²mi slovy - single a double).
* TakΘ znakovΘ typy jsou dva, SHORTCHAR a CHAR. Prvnφ pro 8bitovΘ znaky ASCII/Latin-1, druh² pro 16bitov² Unicode.
* Poslednφm typem je SET, urΦen² pro mno₧inu Φφsel od 0 do 31. V praxi se pou₧φvß spφÜe jako bitovΘ pole o Üφ°ce 32 bit∙.
Deklarace vlastnφch typ∙ (de facto pouhΘ p°ejmenovßnφ) je op∞t naprosto samoz°ejmß pro toho, komu Pascal nenφ cizφ. Tak nap°φklad:
TYPE
Single* = SHORTREAL;
Double* = REAL;
Float* = Double;
FileSize* = LONGINT;
Samoz°ejm∞ si m∙₧eme vytvß°et i vlastnφ typy u₧ivatelsky definovanΘ. Component Pascal znß Φty°i druhy takov²ch typ∙. Jsou to pole, zßznamy, ukazatele a procedurßlnφ typy.
Definici typu pole si ukß₧eme nejlΘpe op∞t na p°φkladech:
TYPE
Vector = ARRAY 3 OF REAL;
Matrix = ARRAY 3, 3 OF REAL;
Polygon = ARRAY OF Point;
FileName = ARRAY 255 OF CHAR;
TextInput = ARRAY OF CHAR;
Za klφΦov²m slovem ARRAY se uvßdφ seznam rozm∞r∙. Pokud ₧ßdn² rozm∞r nenφ uveden, jednß se o pole jednorozm∞rnΘ o libovolnΘ velikosti, tzv. otev°enΘ. Otev°enΘ pole nesmφ b²t pou₧ito jako typ b∞₧nΘ prom∞nnΘ nebo prvku zßznamu. Pole se indexujφ od 0 po deklarovanou velikost minus 1.
Na zßznamech stojφ v Component Pascalu objektov∞ orientovanΘ programovßnφ, a proto jsou o n∞co propracovan∞jÜφ ne₧ v Pascalu. Prozatφm se seznßmφme jen s Φßstφ jejich mo₧nostφ.
TYPE
Complex* = RECORD
Re*, Im*: REAL;
END;
Date* = RECORD
Day-, Month-, Year-: INTEGER;
END
VÜimn∞te si, ₧e prvky zßznam∙ mohou mφt specifikßtory p°φstupov²ch prßv podobnΘ jako globßlnφ prom∞nnΘ. Specifikßtory ovÜem majφ smysl jen v p°φpad∞, ₧e cel² zßznamov² typ je exportovßn. Schßzφ-li specifikßtor, je prvek p°φstupn² jen uvnit° modulu, kde je zßznam deklarovßn. Kdy₧ za jmΘnem prvku nßsleduje hv∞zdiΦka, je tento prvek voln∞ dostupn² ve vÜech modulech, kterΘ zßznam pou₧φvajφ. A koneΦn∞, je-li uveden symbol minus, je prvek voln∞ p°φstupn² ve svΘm domßcφm modulu, v ostatnφch je k dispozici jen pro Φtenφ.
Ukazatele jsou v Component Pascalu na rozdφl od C/C++ naprosto bezpeΦnΘ - nenφ podporovßna adresnφ aritmetika, typecasting, manußlnφ dealokace. Deklarujφ se zßpisem POINTER TO t, kde t je libovoln² typ (i otev°enΘ pole).
D°φve ne₧ probereme tzv. procedurßlnφ typy, podφvejme se na samotnΘ procedury:
PROCEDURE DelejNeco(VAR MojeData, JehoData: Typ);
(* lokßlnφ deklarace *)
PROCEDURE^ Pocitej(x, y: REAL) : REAL;
BEGIN
(* ... *)
END DelejNeco;
PROCEDURE Pocitej(x, y: REAL) : REAL;
(* lokßlnφ deklarace *)
BEGIN
(* ... *)
END Pocitej;
Procedura smφ mφt deklarovßn typ v²sledku, v takovΘm p°φpad∞ jφ °φkßme funkce.
Parametry procedury jsou p°edßvßny hodnotou nebo odkazem. Nenφ-li v deklaraci parametru ₧ßdn² modifikßtor, pak je parametr p°edßvßn hodnotou a uvnit° procedury se chovß jako lokßlnφ prom∞nnß. M∙₧e b²t m∞n∞n, ale tyto zm∞ny nemajφ vliv mimo proceduru.
Modifikßtory IN, OUT a VAR specifikujφ p°edßvßnφ parametru odkazem. SkuteΦn² p°edßvan² parametr potom musφ b²t prom∞nnß, nikoli v²raz. Parametr IN je pouze pro Φtenφ, OUT pouze pro zßpis, VAR pro Φtenφ i zßpis. V p°φpad∞ modifikßtor∙ OUT a VAR se p°i°azenφ do parametru projevφ skuteΦnou zm∞nou pat°iΦnΘ prom∞nnΘ dosazenΘ za parametr. Typem parametru m∙₧e b²t i otev°enΘ pole.
Jestli₧e pot°ebujeme volat zevnit° procedury jinou proceduru, kterß je deklarovanß a₧ dßle, uvedeme v sekci lokßlnφch deklaracφ hlaviΦku tΘ procedury s klφΦov²m slovem PROCEDURE nßsledovan²m symbolem ^.
Te∩ ji₧ se m∙₧eme vrßtit k procedurßlnφm typ∙m. Definujφ se takto:
TYPE
Action = PROCEDURE (VAR data: POINTER TO MyRec);
Function = PROCEDURE (x, y: REAL) : REAL;
Do prom∞nn²ch procedurßlnφch typ∙ m∙₧eme p°i°azovat procedury s odpovφdajφcφmi hlaviΦkami a volat je pomocφ identifikßtoru prom∞nnΘ.
PokraΦovßnφ p°φÜt∞...
Pokud jste si k tomuto Φlßnku prßv∞ odskoΦili od studia n∞jak²ch cΘΦkov²ch Φi jim podobn²ch "komprimßt∙", mo₧nß si p°ipadßte jako v oΦistnΘ lßzni plnΘ pr∙zraΦnΘ ₧ivΘ vody. Ale samoz°ejm∞ - jsme teprve na zaΦßtku a nic zvlßÜ¥ slo₧itΘho jsme zatφm neprobφrali. Zda tento "osvobozujφcφ" pocit p°eΦkß i t∞₧Üφ zkouÜky, poznßme p°φÜt∞, kdy se podφvßme na "v²razivo", p°φkazy a zßkazy, a dojde i na objekty.