“pny” — 2003/6/6 — 10:00 — page vii — #8
¯
2
¯ 7 Fodor Szabina 1.1. Történeti áttekintés ¯ 7 A korai nyelvek ¯ 8 A szoftverfejlesztés kialakulása ¯ 9 1.2. A programozási nyelvek szerepe ¯ 11 1.3. A programozási nyelvek tervezésének alapelvei ¯ 13 A „jó” programozási nyelv tulajdonságai ¯ 13 A nyelvtervezés lépései ¯ 18 1.4. Programozási nyelvek csoportosítása ¯ 18 Imperatív, procedurális nyelvek ¯ 18 Applikatív, funkcionális nyelvek ¯ 19 Szabály alapú, logikai nyelvek ¯ 20 Objektumorientált nyelvek ¯ 20 1.5. A programozási nyelvek szabványosítása ¯ 21 1.6. Nemzetközi programozás ¯ 24 1.7. A programozási környezet nyelvre gyakorolt hatása ¯ 25 Önálló fordítási egységek ¯ 25 Tesztelés és nyomkövetés ¯ 26 ¯ 29 Nyékyné Gaizler Judit 2.1. A jelkészlet ¯ 29 Az ASCII kód ¯ 31 Az EBCDIC kód ¯ 31 Az ISO 8859 család ¯ 32 A Unicode szabvány ¯ 32
“pny” — 2003/6/6 — 10:00 — page viii — #9
¯
( 2 2.2. A programozási nyelvek jelkészletei ¯ 33 2.3. Azonosítók ¯ 35 A használható karakterek ¯ 36 A megengedett szintaxis ¯ 36 ˝ megkülönböztetése ¯ 37 A kis- és a nagybetuk Hosszúsági megkötések ¯ 37 A fenntartott szavak ¯ 37 2.4. Literálok ¯ 39 Számliterálok ¯ 39 Karakterek és karaktersorozatok ¯ 41 2.5. Megjegyzések ¯ 42
¯ 45 Csizmazia Albert, Csizmazia Balázs 3.1. A programozó feladata ¯ 45 Mondatszeru˝ leírás ¯ 46 Folyamatábrák ¯ 47 D-diagramok ¯ 48 Blokkdiagramok ¯ 49 Struktogramok ¯ 50 3.2. Az assembly nyelvu˝ megoldás ¯ 50 A Pascal nyelvu˝ program ¯ 51 A Motorola 68000-es család programozása ¯ 51 Az MC 68000-es assembly kód ¯ 56 Az assembly és a Pascal nyelvu˝ kód összevetése ¯ 57 3.3. Egy elemi megközelítés ¯ 58 A while-programok elemei ¯ 59 ¯ 59 ˝ Magasabb szintu˝ muveletek ¯ 3.4. Vezérlési megközelítések 61 Imperatív programozási nyelvek ¯ 61 Deklaratív és funkcionális nyelvek ¯ 61 Párhuzamos végrehajtás ¯ 62 Eseményvezérelt programozás ¯ 62 3.5. A vizsgált programozási nyelvek ¯ 63 Mondatszeru˝ algoritmusleírás: COBOL ¯ 63 Strukturált programozás: a Pascal nyelv ¯ 65 Hordozható assembly: a C nyelv ¯ 66 Minden objektum: a Smalltalk ¯ 67 Egyéb vizsgált programnyelvek ¯ 67
“pny” — 2003/6/6 — 10:00 — page ix — #10
( 2 3.6. Értékadás, aritmetikai utasítások ¯ 68 A COBOL eszköztára ¯ 68 Egyszeru˝ értékadás: a Pascal nyelv ¯ 69 Értékadás a C nyelvben ¯ 69 A Smalltalk megoldása ¯ 70 A többszörös értékadás és a CLU ¯ 70 Az értékadás szerepe a programokban ¯ 71 Az üres utasítás ¯ 71 3.7. Szekvencia és blokk utasítás ¯ 71 Blokk utasítás a Pascalban ¯ 72 Szakítás a Pascal hagyományaival: az Ada nyelv ¯ 73 ˝ ¯ 74 A C nyelvcsalád jellemzoi A Smalltalk blokk utasítása ¯ 74 3.8. Feltétel nélküli vezérlésátadás ¯ 75 A COBOL eszközei ¯ 76 Feltétel nélküli vezérlésátadás a Pascalban ¯ 76 Modula-3: búcsú a GOTO-tól ¯ 77 Különleges vezérlési utasítások a C-ben ¯ 77 A Java újdonságai ¯ 78 3.9. Elágazási szerkezetek ¯ 79 Elágazás a COBOL-ban ¯ 80 Feltételes utasítás a Pascalban ¯ 81 Többirányú elágazás a Pascalban ¯ 82 Biztonságos elágazások: a Modula-3 újításai ¯ 82 Biztonságos CASE a Modula-3-ban ¯ 84 A C nyelv elágazási szerkezetei ¯ 84 Többágú elágazás a C-ben ¯ 85 Többágú elágazás a C#-ban ¯ 85 Feltételes utasítás a Smalltalkban ¯ 86 3.10. Ciklusszerkezetek ¯ 87 A COBOL ciklusai ¯ 87 Ciklusutasítások a Pascalban ¯ 88 Modula-3: biztonságos ciklusok ¯ 90 loop–end–exit ciklusok ¯ 91 Az Ada nyelv eszközei ¯ 91 Ismétlési szerkezetek a C és a Java nyelvben ¯ 92 A C# nyelv újdonságai ¯ 93 Bejárók (iterátorok) ¯ 94 Ciklusutasítás a Smalltalkban ¯ 97 3.11. Önhívó kód (rekurzió) ¯ 98 3.12. Összefoglalás ¯ 99
¯
“pny” — 2003/6/6 — 10:00 — page x — #11
¯
( 2 ! ¯ 103 Balázs Iván József, Porkoláb Zoltán 4.1. A memóriaterülek típusai ¯ 104 A statikus memóriaterület ¯ 104 A dinamikus memóriaterület ¯ 104 Az automatikus memóriaterület ¯ 105 Egy egyszeru˝ példa ¯ 105 4.2. Hatókör ¯ 106 Globális hatókör ¯ 108 Fordítási egység mint hatókör ¯ 108 Függvény és kódblokk mint hatókör ¯ 109 Egy típus mint hatókör ¯ 110 4.3. Élettartam ¯ 110 4.4. Példák ¯ 113 " #$ ¯ 119 Pécsy Gábor 5.1. Mi a típus? ¯ 119 ˝ ¯ 119 Típus a fordítóprogram szemszögébol ˝ ¯ 120 Típus a programozó szemszögébol A programozási nyelvek típusossága ¯ 122 Típuskonverzió ¯ 123 5.2. Típusok osztályozása ¯ 127 Típusosztályok ¯ 128 Attribútumok az Ada nyelvben ¯ 128 5.3. Skalár típusosztály ¯ 129 Ábrázolás ¯ 129 ¯ 130 ˝ Muveletek Az Ada skalártípusai ¯ 130 5.4. Diszkrét típusosztály ¯ 131 Felsorolási típusok ¯ 131 Egész típusok ¯ 133 ˝ ¯ 138 Csellengok 5.5. Valós típusosztály ¯ 140 Típusértékhalmaz ¯ 140 ¯ 141 ˝ Muveletek Programozási nyelvek ¯ 142 5.6. Mutató típusok ¯ 143 Memóriagazdálkodás ¯ 144 Típusértékhalmaz ¯ 146 ¯ 148 ˝ Muveletek Alprogramra hivatkozó mutató ¯ 151 Nyelvi specialitások ¯ 152
“pny” — 2003/6/6 — 10:00 — page xi — #12
( 2 5.7. Kifejezések ¯ 155 Kifejezések szerkezete ¯ 155 Kifejezések kiértékelése ¯ 157 5.8. Egyéb nyelvi specialitások ¯ 161 5.9. Összefoglalás ¯ 162
% #$ & ¯ 167 Pécsy Gábor 6.1. Direktszorzat típus ¯ 170 Típusértékhalmaz ¯ 170 ¯ 171 ˝ Muveletek A direktszorzat ábrázolása ¯ 174 Egyedi nyelvi elemek ¯ 176 6.2. Unió típus ¯ 178 Típusértékhalmaz ¯ 178 ¯ 179 ˝ Muveletek Unió jellegu˝ típuskonstrukciók ¯ 180 6.3. Iterált típus ¯ 187 6.4. Vektor ¯ 188 Típusértékhalmaz ¯ 188 ¯ 189 ˝ Muveletek Nyelvi specialitások ¯ 190 Általánosítás több dimenzióra – tömbök 6.5. Halmaz ¯ 195 Típusértékhalmaz ¯ 195 ¯ 196 ˝ Muveletek 6.6. Egyéb iterált konstrukciók ¯ 196 6.7. Összefoglalás ¯ 198
¯
193
' ($ ¯ 203 Kozsik Tamás ˝ 7.1. Az alprogramok hatása a szoftverminoségre 7.2. Eljárások és függvények ¯ 205 Nyelvek, ahol nincs különbség ¯ 206 Nyelvek, ahol van különbség ¯ 208
¯
204
¯
“pny” — 2003/6/6 — 10:00 — page xii — #13
¯
( 2 7.3. Az alprogramok és hívások szerkezete ¯ 209 Mi lehet paraméter vagy visszatérési érték? ¯ 209 Az alprogramok specifikációja ¯ 216 Alprogramok törzse ¯ 222 Az alprogramok meghívása ¯ 227 Rekurzív alprogramok ¯ 232 Az alprogramok deklarációja ¯ 233 Makrók és inline alprogramok ¯ 235 Alprogram típusok ¯ 236 7.4. Paraméterátadás ¯ 237 Paraméterátadási módok ¯ 237 A paraméterátadási módok összehasonlítása ¯ 245 ˝ A lehetoségek néhány programozási nyelvben ¯ 247 7.5. Az alprogramok környezete ¯ 253 Külön fordíthatóság ¯ 254 Beágyazhatóság ¯ 255 Statikus és dinamikus hatókör ¯ 257 A változók élettartama ¯ 260 7.6. Az alprogramnevek túlterhelése ¯ 261 Operátorok túlterhelése ¯ 264 7.7. Az alprogramok megvalósítása ¯ 264 Paraméterként átadott alprogramok megvalósítása ¯ 267 7.8. Iterátorok ¯ 269 7.9. Korutinok ¯ 272 7.10. Összefoglalás ¯ 274
) * ¯ 277 Nohl Attila Rajmund 8.1. Bevezetés ¯ 277 A kivételkezelés alapfogalmai ¯ 277 Miért jó a kivételkezelés? ¯ 279 A kivételkezelések összehasonlításának szempontjai 8.2. A kivételkezelés kezdetei ¯ 285 Egy utasítás kivételkezelése: FORTRAN ¯ 285 Több utasítás kivételkezelése: COBOL ¯ 286 Dinamikus kivételkezelés: PL/I ¯ 286
¯
285
“pny” — 2003/6/6 — 10:00 — page xiii — #14
( 2 8.3. Fejlett kivételkezelés ¯ 288 Statikus kivételkezelés: CLU ¯ 288 Kivételek terjedése: Ada 95 ¯ 289 Kivételosztályok megjelenése: C++ ¯ 291 Helyességbizonyítás és kivételkezelés: Eiffel ¯ 292 A finally blokk: Modula-3 ¯ 294 ˝ Ellenorzött kivételek: Java ¯ 295 A Delphi kivételkezelése ¯ 296 Egymásba ágyazott kivételek: C# ¯ 297 Kivételkezelés függvényekkel: Common Lisp ¯ 297 Új megoldások: Perl ¯ 299 8.4. Összefoglaló ¯ 301 8.5. Példaprogramok kivételkezelésre ¯ 302 C++ ¯ 302 Java ¯ 304 Ada 95 ¯ 306 Eiffel ¯ 308
+ , - ¯ 315 Lakatos Attila 9.1. A moduláris tervezés ¯ 315 A moduláris tervezés kritériumai ¯ 315 A modularitás alapelvei ¯ 316 9.2. A modulok nyelvi támogatása ¯ 320 Alacsonyszintu˝ programnyelvek ¯ 320 Procedurális programnyelvek ¯ 321 Az Ada nyitott modulok támogatása ¯ 323 Objektumorientált programnyelvek ¯ 328 Funkcionális programnyelvek ¯ 329 . (/ -$ ¯ 333 Pécsy Gábor 10.1. Típuskonstrukciók és adatabsztrakció ¯ 333 10.2. Elvárások a programozási nyelvekkel szemben 10.3. Modulokra bontás ¯ 335 10.4. Egységbe zárás ¯ 335 10.5. Az ábrázolás elrejtése ¯ 335 Átlátszatlan típus a C-ben ¯ 336 Ada private típusok ¯ 338 CLU absztrakt adattípusok ¯ 338 Láthatósági szintek ¯ 339
¯
334
¯
“pny” — 2003/6/6 — 10:00 — page xiv — #15
¯
( 2 10.6. 10.7. 10.8. 10.9. 10.10.
A specifikáció és implementáció szétválasztása ˝ kezelése ¯ 342 A modulfüggoség Konzisztens használat ¯ 343 Általánosított programsémák ¯ 344 A programozási nyelvek értékelése ¯ 347
¯
340
#$ $ ¯ 353 Hegedus ˝ Hajnalka, Marcinkovics Tamás, Nyékyné Gaizler Judit, Kozsik Tamás 11.1. Polimorfizmus ¯ 359 Parametrikus polimorfizmus ¯ 360 Altípusos polimorfizmus ¯ 364 Túlterheléses polimorfizmus ¯ 368 Típuskényszerítéses polimorfizmus ¯ 370 A polimorfizmus megvalósítása monomorf nyelvekben ¯ 371 ˝ 11.2. A sablon-szerzodés modell ¯ 373 11.3. Sablonparaméterek ¯ 376 Típus és típusosztály ¯ 376 Alprogram ¯ 378 Objektum ¯ 379 Modul ¯ 379 11.4. Példányosítás ¯ 381 Explicit példányosítás ¯ 382 Igény szerinti példányosítás ¯ 382 Lusta példányosítás ¯ 382 Sablonparaméterek megfeleltetése ¯ 383 Specializáció ¯ 384 ¯ 385 ˝ 11.5. Sablonok és öröklodés ¯ 11.6. Összegzés 387 0/1 $ ¯ 391 Kovács D. Lehel István, Sergyán Szabolcs, Nyékyné Gaizler Judit 12.1. Az osztály és az objektum ¯ 391 Az osztályok és objektumok az egyes nyelvekben ¯ 393 12.2. Jelölési módok, diagramok ¯ 400 Osztálydiagram ¯ 400 Objektumdiagram ¯ 400 A példányosítás ábrázolása ¯ 400 12.3. Objektumok létrehozása és megszüntetése ¯ 400 12.4. Egységbezárás ¯ 405 12.5. Adatrejtés, interfészek ¯ 406 Friend metódusok, osztályok ¯ 409
“pny” — 2003/6/6 — 10:00 — page xv — #16
( 2 12.6. Osztályadat, osztálymetódusok ¯ 411 ¯ 415 ˝ 12.7. Öröklodés ¯ 423 ˝ Adatrejtés és öröklodés Polimorfizmus és dinamikus kötés ¯ 426 Absztrakt osztályok ¯ 438 ˝ ¯ 441 A közös os ¯ 442 ˝ Többszörös öröklodés Interfészek ¯ 451 Beágyazott osztályok, tagosztályok ¯ 455 12.8. Összefoglalás ¯ 456
( $ 2 34 ¯ 459 Juhász András 13.1. A helyességi specifikációs nyelv ¯ 463 ˝ Az Eiffel és az elsorend u˝ logika ¯ 464 ¯ Példa 469 ˝ és utófeltételek ¯ 470 EloOsztályinvariáns ¯ 476 Ciklusok ¯ 478 A check utasítás ¯ 482 ¯ 483 ˝ Öröklodés 13.2. A programhelyesség definiálása az Eiffelben ¯ 487 Az attribútumok helyessége ¯ 487 A metódusok helyessége ¯ 487 Az osztályok helyessége ¯ 490 A programok helyessége ¯ 491 ˝ 13.3. A programhelyesség-ellenorzés problémái ¯ 492 ¯ ˝ Függoségek 492 Helyességi specifikációs nyelv ¯ 493 13.4. A VEREM osztály ¯ 495 2 ¯ 501 Zsók Viktória (1., 2–3. alfejezet), Tejfel Máté (1., 4–6. alfejezet) 14.1. A párhuzamos nyelvek általános jellemzése ¯ 505 14.2. Ada ¯ 514 Taszkok ¯ 514 A taszk specifikációja és törzse ¯ 515 Taszk típusok, taszk objektumok ¯ 517 Taszkok elindítása, végrehajtása ¯ 518 Taszkok lezárása (terminálása) ¯ 519 A taszkok attribútumai ¯ 519 Entry, entry-hívás, accept utasítás ¯ 520 Belépésipont-családok ¯ 521
¯
“pny” — 2003/6/6 — 10:00 — page xvi — #17
¯
( 2
14.3. 14.4. 14.5. 14.6.
A select utasítás ¯ 522 Szelektív hívásfogadás ¯ 522 Feltételes hívásfogadás ¯ 523 A terminate alternatíva ¯ 524 A delay és az abort utasítás ¯ 524 Az else alternatíva ¯ 524 A feltételes entry hívás ¯ 526 ˝ Idohöz kötött entry hívás ¯ 526 Kivételkezelés ¯ 526 Példák ¯ 527 CSP ¯ 532 Occam ¯ 534 Java ¯ 537 C alapú könyvtárak ¯ 543 MPI ¯ 543 PVM ¯ 553
" ! ¯ 561 Csontos Péter, Lakatos Attila 15.1. Követelmények a programkönyvtárakkal szemben ¯ 562 A jó könyvtárfejleszto˝ tulajdonságai ¯ 562 ˝ Alapveto˝ minoségi követelmények ¯ 563 A programkönyvtárakra vonatkozó egyedi követelmények ¯ 566 A követelmények teljesítésének feltételei ¯ 569 15.2. Objektumorientált programkönyvtár-tervezés ¯ 569 Osztályhierarchia ¯ 570 Az osztályok mérete ¯ 573 A szolgáltatások mérete ¯ 576 Az osztályok fajtái ¯ 578 15.3. Új paradigmák ¯ 582 15.4. Általános programkönyvtárak ¯ 583 Adatszerkezetek ¯ 583 I/O ¯ 584 Memóriakezelés ¯ 584 15.5. Programkönyvtárak életciklusa ¯ 584 Tervezési fázis ¯ 585 Megvalósítási fázis ¯ 586 Karbantartási fázis ¯ 586
“pny” — 2003/6/6 — 10:00 — page xvii — #18
( 2 % ( 5& $ ¯ 589 Horváth Zoltán 16.9. alfejezet: Zsók Viktória, Tejfel Máté, Horváth Zoltán 16.1. Bevezetés ¯ 589 A funkcionális programozási stílus ¯ 590 Funkcionális program felépítése és kiértékelése ¯ 591 ˝ jellemzoi ˝ ¯ 593 A modern funkcionális nyelvek fobb ¯ A funkcionális nyelvek rövid áttekintése 596 16.2. Egyszeru˝ funkcionális programok ¯ 597 Egyszeru˝ függvények definíciója ¯ 597 Feltételek megadása ¯ 597 Mintaillesztés ¯ 598 16.3. Függvények típusa, magasabbrendu˝ függvények ¯ 599 Egyszeru˝ típuskonstrukciók ¯ 600 Lokális deklarációk ¯ 605 ˝ a sakktáblán ¯ 607 Egy érdekesebb példa: királynok ¯ 16.4. Típusok és osztályok 609 Polimorfizmus, típusosztályok ¯ 609 Algebrai adattípus ¯ 612 Típusszinonimák ¯ 614 Származtatott típusok ¯ 614 Típuskonstrukció osztályok ¯ 615 16.5. Modulok ¯ 615 Absztrakt algebrai adattípus ¯ 616 16.6. Frissítheto˝ változók, monádok, mellékhatás ¯ 619 Egyszeresen hivatkozott változók ¯ 619 Monádok ¯ 620 Frissítheto˝ változók ¯ 621 16.7. Interaktív funkcionális programok ¯ 622 16.8. Kivételkezelés ¯ 624 16.9. Párhuzamos kiértékelés és elosztott programok ¯ 625 Párhuzamos és elosztott programozás Concurrent Cleanben ¯ 626 Distributed Haskell with Ports ¯ 630 A JoCaml párhuzamos és osztott nyelvi elemei ¯ 632 ' $
¯
637
Ásványi Tibor 17.1. Logikai programok ¯ 638 Tények ¯ 639 Szabályok ¯ 640 Rekurzív szabályok ¯ 644
¯
“pny” — 2003/6/6 — 10:00 — page xviii — #19
¯
( 2 17.2. Bevezetés a Prolog nyelvbe ¯ 645 17.3. A logikai programok objektumai ¯ 646 17.4. Listakezelés rekurzív LP módszerekkel ¯ 647 A rekurzív keresés ¯ 649 Az eredmény fokozatos közelítése ¯ 649 Az akkumulátor módszer ¯ 650 Az általánosítás módszere ¯ 651 17.5. A Prolog gép ¯ 652 Tiszta Prolog programok végrehajtása ¯ 652 Az illesztés algoritmusa ¯ 653 NSTO programok ¯ 654 Elso˝ argumentum indexelés ¯ 656 Utolsó hívás optimalizáció ¯ 657 17.6. Vezérlésmódosítás a Prologban ¯ 658 Feltételes célok ¯ 658 Tagadás ¯ 660 17.7. A Prolog metalogikai predikátumai ¯ 662 Aritmetika ¯ 662 Termek típusa és összehasonlítása ¯ 664 ¯ 665 ˝ Termmuveletek ˝ 17.8. Prolog muveleti jelek ¯ 666 17.9. A Prolog logikán kívüli predikátumai ¯ 668 Programbetöltés ¯ 669 Bemenet és kimenet ¯ 669 Önmódosító programok ¯ 670 ¯ 672 ˝ 17.10. Prolog célok megoldásainak összegyujtése 17.11. Kivételkezelés a Prologban ¯ 673 17.12. Prolog modulrendszerek ¯ 675 A név alapú modulrendszer ¯ 675 Az eljárás alapú modulrendszer ¯ 675 A forrásmodul megváltoztatása ¯ 677 17.13. Kitekintés ¯ 679 Ajánlott irodalom ¯ 679 Klasszikus LP-kiterjesztések ¯ 680 Az ötödik generációs számítógépek és programjaik Újabb irányzatok ¯ 681 17.14. Összefoglalás ¯ 682
¯
680
“pny” — 2003/6/6 — 10:00 — page xix — #20
( 2 ) ($ $ ¯ 685 Csontos Péter, Kozsik Tamás 18.1. Az AOP áttekintése ¯ 686 Aspektusok és komponensek ¯ 687 Aspektusleíró nyelvek ¯ 688 ˝ ¯ 688 Aspektusszövok 18.2. Az AspectJ bemutatása ¯ 689 ˝ tulajdonságai ¯ 689 Az AspectJ elemei és fobb Egy rövid AspectJ példa ¯ 690 ˝ Fejlesztoeszközök és rokon nyelvek ¯ 690 18.3. Az AOP-vel rokon paradigmák és megvalósításaik ¯ 691 Vonatkozások többdimenziós szétválasztása (MDSC) ¯ 691 Adaptív programozás (AP) ¯ 692 ˝ ok ˝ (CF) ¯ 693 Kompozíciós szur Generatív programozás (GP) ¯ 693 Intencionális programozás (IP) ¯ 694 További ígéretes kezdeményezések ¯ 695 + !- Csontos Péter et al. 19.1. Ada 95 ¯ 697 19.2. ALGOL 60 ¯ 698 19.3. ALGOL 68 ¯ 698 19.4. BASIC ¯ 699 19.5. BETA ¯ 699 19.6. C ¯ 699 19.7. C++ ¯ 700 19.8. C# ¯ 700 19.9. Clean ¯ 701 19.10. CLU ¯ 701 19.11. COBOL ¯ 701 19.12. Delphi ¯ 702 19.13. Eiffel ¯ 702 19.14. FORTRAN ¯ 703 19.15. Haskell ¯ 703 19.16. Java ¯ 704 19.17. LISP ¯ 704 19.18. Maple ¯ 705 19.19. Modula-2 ¯ 705 19.20. Modula-3 ¯ 705 19.21. Objective-C ¯ 706 19.22. Pascal ¯ 706 19.23. Perl ¯ 706
¯
697
¯
“pny” — 2003/6/6 — 10:00 — page xx — #21
¯
( 2 19.24. 19.25. 19.26. 19.27. 19.28. 19.29. 19.30. 19.31.
PHP ¯ 707 PL/I ¯ 707 Python ¯ 707 SIMULA 67 ¯ 708 Smalltalk ¯ 708 SML ¯ 708 SQL ¯ 709 Tcl ¯ 709
. 67
¯
8 - 1 #
¯
711 ¯
732
714