home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 July / Chip_2002-07_cd1.bin / obsahy / Chip_txt / txt / 158-159.txt < prev    next >
Text File  |  2002-06-07  |  11KB  |  123 lines

  1.  
  2. Jazyk Component Pascal 
  3. Java nenφ vÜechno (1)
  4. 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.
  5.  
  6. 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. 
  7. 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. 
  8. 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φ. 
  9.  
  10. Prvnφ pohled 
  11. 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. 
  12. 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Θ...). 
  13. 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. 
  14. 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∙. 
  15. 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∙. 
  16. Tolik obecn∞, a podφvejme se u₧ na prvnφ mal² progrßmek: 
  17. MODULE GoodBye;
  18. IMPORT StdLog;
  19. BEGIN
  20.   StdLog.String("Good bye, Java.")
  21. END GoodBye;
  22. JednoduchΘ, srozumitelnΘ. Äßdnß "cΘΦkovitß" p°φÜernost. 
  23.  
  24. Struktura programu 
  25. 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ß. 
  26. 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). 
  27. 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). 
  28. 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). 
  29. 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. 
  30. 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: 
  31. MODULE MujPrvniModul;
  32.  
  33. IMPORT Modul1, Modul2, (* nebo zkrßcen∞ *) M3 := Modul3;
  34.  
  35. (* nßsledujφ deklarace CONST, TYPE, PROCEDURE, VAR *)
  36.  
  37. (* a t∞lo - hlavnφ blok *)
  38. BEGIN
  39.   (* inicializaΦnφ p°φkazy *)
  40. CLOSE
  41.   (* p°φkazy pro ·klid po skonΦenφ programu *)
  42. END MujPrvniModul;
  43. 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). 
  44. 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. 
  45.  
  46. Deklarace 
  47. 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. 
  48. Na deklaraci konstant nenφ vcelku nic novΘho. Tady je mßme: 
  49. CONST 
  50.   Pi* = 3.14; 
  51.   e*  = 2.78;
  52.   Adr* = "http://www.oberon.ch";
  53.   Enter = 0DX;
  54. 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φ. 
  55. VAR
  56.   x, y, z : REAL; 
  57.   m, n : INTEGER;
  58.   Size*: INTEGER;
  59.   Limit-: INTEGER;
  60. Zb²vß se podφvat na smeΦku standardnφch typ∙ Component Pascalu. Mßme pom∞rn∞ sluÜn² v²b∞r: 
  61. * V prvnφ °ad∞ je tu klasick² typ BOOLEAN, jeho hodnoty jsou TRUE a FALSE. 
  62. * 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∙. 
  63. * 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). 
  64. * TakΘ znakovΘ typy jsou dva, SHORTCHAR a CHAR. Prvnφ pro 8bitovΘ znaky ASCII/Latin-1, druh² pro 16bitov² Unicode. 
  65. * 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∙. 
  66. 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: 
  67. TYPE
  68.   Single* = SHORTREAL;
  69.   Double* = REAL;
  70.   Float*  = Double;
  71.   FileSize* = LONGINT;
  72. 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. 
  73. Definici typu pole si ukß₧eme nejlΘpe op∞t na p°φkladech: 
  74. TYPE
  75.   Vector = ARRAY 3 OF REAL;
  76.   Matrix = ARRAY 3, 3 OF REAL;
  77.  
  78.   Polygon = ARRAY OF Point;
  79.  
  80.   FileName = ARRAY 255 OF CHAR;
  81.   TextInput = ARRAY OF CHAR;
  82. 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. 
  83. 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φ. 
  84. TYPE
  85.   Complex* = RECORD
  86.     Re*, Im*: REAL;
  87.   END;
  88.  
  89.   Date* = RECORD
  90.     Day-, Month-, Year-: INTEGER;
  91.   END
  92. 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φ. 
  93. 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). 
  94. D°φve ne₧ probereme tzv. procedurßlnφ typy, podφvejme se na samotnΘ procedury: 
  95. PROCEDURE DelejNeco(VAR MojeData, JehoData: Typ);
  96.   (* lokßlnφ deklarace *)
  97.   PROCEDURE^ Pocitej(x, y: REAL) : REAL;
  98. BEGIN
  99.   (* ... *)
  100. END DelejNeco;
  101.  
  102. PROCEDURE Pocitej(x, y: REAL) : REAL;
  103.   (* lokßlnφ deklarace *)
  104. BEGIN
  105.   (* ... *)
  106. END Pocitej;
  107. Procedura smφ mφt deklarovßn typ v²sledku, v takovΘm p°φpad∞ jφ °φkßme funkce. 
  108. 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. 
  109. 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.
  110. 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 ^. 
  111. Te∩ ji₧ se m∙₧eme vrßtit k procedurßlnφm typ∙m. Definujφ se takto: 
  112. TYPE
  113.   Action = PROCEDURE (VAR data: POINTER TO MyRec);
  114.   Function = PROCEDURE (x, y: REAL) : REAL;
  115. 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Θ. 
  116.  
  117. PokraΦovßnφ p°φÜt∞...
  118. 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. 
  119.  
  120. Ond°ej Hrabal
  121.  
  122.  
  123.