13.07.2015 Views

Materiały pomocnicze do przedmiotu Języki Programowania II

Materiały pomocnicze do przedmiotu Języki Programowania II

Materiały pomocnicze do przedmiotu Języki Programowania II

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>Języki <strong>Programowania</strong>materiały uzupełniające <strong>do</strong> wykładów19 maj, 2006Wojciech SobieskiUniwersytet Warmińsko-MazurskiWydział Nauk TechnicznychKatedra Mechaniki i Podstaw Konstrukcji Maszyn10-957 Olsztyn, ul. M. Oczapowskiego 11.tel.: (89) 5-23-32-40fax: (89) 5-23-32-55wojciech.sobieski@uwm.edu.plNiniejszy <strong>do</strong>kument nie zawiera tekstów aktorskich lecz jest jedyniekompilacją różnych materiałów internetowych, powstałą w okresieopracowywania zakresu tematycznego <strong>przedmiotu</strong> Języki <strong>Programowania</strong> <strong>II</strong>(lata 2001-2003), realizowanego na specjalności Inżynierskie ZastosowaniaKomputerów WNT UWM w Olsztynie. Na podstawie zebranych materiałów(przedstawionych w opracowaniu oraz innych) opracowany został autorskicykl wykładów <strong>do</strong> tego <strong>przedmiotu</strong>.Olsztyn ©20061/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>Spis treści1 Historia rozwoju komputerów..........................................................................................................31.1 Od Starożytności <strong>do</strong> Średniowiecza......................................................................................... 31.2 Wiek XV<strong>II</strong> i XV<strong>II</strong>I................................................................................................................... 41.3 Charles Babbage (1791 - 1871)................................................................................................ 51.4 Przełom XIX i XX wieku......................................................................................................... 61.5 Początek XX wieku.................................................................................................................. 71.6 Pierwsze komputery..................................................................................................................81.7 John von Neumann (1903 - 1957) ........................................................................................... 91.8 Komputer typu PC.................................................................................................................... 91.9 Kronika................................................................................................................................... 102 Języki programowania....................................................................................................................172.1 Rozwój programowania..........................................................................................................172.2 Generacje języków programowania........................................................................................192.3 Podstawowe definicje............................................................................................................. 202.4 Śro<strong>do</strong>wisko programistyczne..................................................................................................222.5 Etapy kompilacji.....................................................................................................................232.6 Podział języków programowania............................................................................................242.7 Przegląd języków programowania..........................................................................................253 Elementy języków programowania................................................................................................ 313.1 Podstawowe cechy języków programowania:........................................................................ 313.2 Zmienne i stałe........................................................................................................................363.3 Wyrażenia............................................................................................................................... 373.4 Instrukcje................................................................................................................................ 393.5 Wyjątki....................................................................................................................................454 Styl programowania........................................................................................................................464.1 Elementy stylu programowania.............................................................................................. 464.2 Metody testowania programów.............................................................................................. 505 Algorytmy.......................................................................................................................................515.1 Rodzaje algorytmów...............................................................................................................515.2 Rodzaje zapisu algorytmów....................................................................................................515.3 Schematy blokowe..................................................................................................................525.4 Zasady tworzenia schematów blokowych:............................................................................. 535.5 Etapy rozwiązywania problemów:..........................................................................................535.6 Realizacja pętli i instrukcji warunkowych..............................................................................545.7 Przykłady schematów blokowych:......................................................................................... 555.8 Poprawność algorytmów.........................................................................................................566 Technologia programowania.......................................................................................................... 586.1 Fazy powstawania programu komputerowego:...................................................................... 586.2 Rodzaje programowania......................................................................................................... 622/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>1 Historia rozwoju komputerów.Ludzkość wytwarza coraz więcej informacji. Tak wiele, że jej przetwarzanie, czyli pamiętanie,klasyfikowanie, poszukiwanie, obrazowanie i zestawianie jest ponad ludzkie siły. Dlatego tak dużeznaczenie osiągnęły "maszyny", które radzą sobie z tym zadaniem lepiej i szybciej od człowieka -komputery.Komputery, czyli maszyny liczące (z ang. compute - obliczać) mają więcej lat niż się na ogółprzypuszcza. Za przodków komputera uznać bowiem należy wszystkie urządzenia służące <strong>do</strong>liczenia.1.1 Od Starożytności <strong>do</strong> Średniowiecza.W wykopaliskach między Mezopotamią i Indiami odnaleziono ślady stosowanych już w X wiekup.n.e. systematycznych metod znaj<strong>do</strong>wania wyniku najprostszych operacji za pomocą specjalnieprzygotowanych i poukładanych kamieni. Początkowo kamienie układano w rzędach na piaskutworząc w ten sposób plansze obliczeniowe, które nazywamy abakami (lub abakusami). Późniejzaczęto nawlekać kamienie na pręty, tworząc liczydła, czyli kompletne i przenośne przyrządy <strong>do</strong>obliczeń. W obu przypadkach, abakusa i liczydła, stan obliczeń określało rozmieszczenieelementów ruchomych na piasku lub na prętach. Liczydła przeżywały swój renesans w wiekachśrednich. Wtedy na przykład ukształtował się japoński soroban w swej obecnej postaci. Jest onjeszcze dzisiaj <strong>do</strong>ść powszechnie stosowanym liczydłem w Japonii. Soroban - jak każde liczydło -ma wady, które zostały naprawione częściowo w kalkulatorze, a ostatecznie <strong>do</strong>piero wkomputerach. Służy on bowiem tylko <strong>do</strong> odnotowania bieżących wyników obliczeń, gdyż nie ma wnim miejsca ani na pamiętanie wyników pośrednich, ani na pamiętanie kolejno wykonywanychdziałań.Rys. 1. Starożytna figurka przedstawiająca człowieka z abacusem.Wiemy, że Leonar<strong>do</strong> da Vinci był geniuszem, którego pomysły wykraczały daleko poza jegoepokę, ale mało kto wie, że próbował on również skonstruować maszynę liczącą. 13 marca 1967roku amerykańscy naukowcy pracujący w Madrycie w Bibliotece Naro<strong>do</strong>wej Hiszpanii napotkalidwie nieznane <strong>do</strong>tąd prace Leonarda da Vinci nazwane "Codex Madrid". Dotyczyły one maszynyliczącej. Dr Roberto Guatelli znany ekspert w dziedzinie twórczości Leonarda, tworzący takżerepliki jego prac postanowił razem ze swoimi asystentami odtworzyć również i tą maszynę.Dokonano tego w 1968 r. jednak dzisiejsze dzieje tej repliki są nieznane i nie wia<strong>do</strong>mo gdzie onasię znajduje. Specjaliści zarzucali Guatellemu, że w swojej rekonstrukcji nadmiernie kierował sięintuicją i współczesną wiedzą oraz, że wyszedł poza projekt Leonarda. Tak więc Leonar<strong>do</strong> da Vinci- geniusz epoki renesansu wniósł również wkład w rozwój maszyn liczących.3/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>Rys. 2. Na zdjęciach: oryginalne zapiski Leonarda da Vinci oraz replika maszyny jego pomysłu1.2 Wiek XV<strong>II</strong> i XV<strong>II</strong>I.Na początku XV<strong>II</strong> wieku John Neper opublikował najpierw swoje dzieło o logarytmach a następnieprzedstawił system wspomagający wykonywanie mnożenia, zwany pałeczkami Nepera. Genialnośćtego systemu polegała na sprowadzeniu mnożenia <strong>do</strong> serii <strong>do</strong>dawań. Pomysł Nepera wykorzystałowielu konstruktorów urządzeń liczących, jemu współczesnych i żyjących po nim.Za twórcę pierwszej w historii mechanicznej maszyny <strong>do</strong> liczenia jest uznawany WilhelmSchickard (1592 - 1635), który przez długie lata był zupełnie zapomniany. Schickard opisał projektswojej czterodziałaniowej maszyny, wykorzystując u<strong>do</strong>skonalone pałeczki Nepera w postaciwalców, w liście <strong>do</strong> Keplera, któremu miała ona pomóc w jego astronomicznych (<strong>do</strong>słownie i wprzenośni) rachunkach. Niestety jedyny zbu<strong>do</strong>wany egzemplarz maszyny spłonął wniewyjaśnionych okolicznościach, a dzisiejsze jej repliki zostały odtworzone <strong>do</strong>piero niedawno napodstawie opisu z listu Keplera.W XV<strong>II</strong> wieku żyli i tworzyli wielcy matematycy Gottfried Wilhelm Leibniz (1646 - 1716) i BlaisePascal (1623 - 1662). Pascal zainteresował się zbu<strong>do</strong>waniem maszyny liczącej z myślą o<strong>do</strong>pomożeniu swojemu ojcu, który był poborcą podatkowym. Wyprodukowano około 50egzemplarzy Pascaliny - maszyny według pomysłu Pascala. Kilka egzemplarzy istnieje w muzeach<strong>do</strong> dzisiaj; część z nich była przeznaczona <strong>do</strong> obliczeń w różnych systemach monetarnych, a część -dla różnych miar odległości i powierzchni (z przeznaczeniem dla geodetów). Pascal który zbu<strong>do</strong>wałmaszynę wykonującą tylko dwa działania (<strong>do</strong>dawanie i odejmowanie) przez ponad trzysta latuchodził niesłusznie za wynalazcę pierwszej mechanicznej maszyny <strong>do</strong> liczenia. Schickard i Pascalwprowadzili w swoich maszynach mechanizm <strong>do</strong> przenoszenia cyfr przy <strong>do</strong>dawaniu iodejmowaniu. Obie maszyny miały także pewne możliwości zapamiętywania niektórych wynikówpośrednich. Leibniz odkrył na nowo pochodzący ze starożytnych Chin system dwójkowy (zwanytakże binarnym) <strong>do</strong> zapisu liczb. Przypisuje się jemu także zbu<strong>do</strong>wanie pierwszej mechanicznejmaszyny mnożącej. Chociaż w tym czasie istniała już Pascalina i Leibniz miał możność zapoznania4/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>się z nią w Paryżu, projekt swojej "żywej ławy <strong>do</strong> liczenia" opisał przed pierwszą wizytą w Paryżu.W maszynie tej wprowadził wiele części, które zostały użyte w późniejszych maszynachbiurowych. Maszyny Schickarda, Pascala, i Leibniza wymagały od użytkownika manualnej pomocyw wielu czynnościach związanych z kolejnymi krokami obliczeń. Za ich pomocą nie było jeszczemożna w pełni automatycznie i w całości wykonać prostego działania na dwóch liczbach.Rys. 3. Z lewej: pascalina; z prawej: maszyna Laibnizta.W tym miejscu wypada wspomnieć o udziale naszego rodaka w dziele tworzenia maszyn liczących.Abraham Stern (1769 - 1842), z zawodu zegarmistrz, wykonał serię maszyn, które poza czteremadziałaniami podstawowymi, wyciągały także pierwiastki kwadratowe. Jedna z jego maszyn, razuruchomiona, potrafiła wykonać za pomocą mechanizmu zegarowego wszystkie operacje bezingerencji człowieka. Maszyny skonstruowane przez Sterna okazały się jednak mało praktyczne zewzględu na wyjątkowo delikatną bu<strong>do</strong>wę.1.3 Charles Babbage (1791 - 1871).Za najwybitniejszego twórcę maszyn liczących, żyjącego przed erą elektroniczną, uważa sięAnglika Charlesa Babbage'a.Swoją pierwszą maszynę nazwaną maszyną różnicową, (gdyż wykonywała obliczenia metodąróżnicową), konstruował przez ponad 10 lat. Trapiony jednak wieloma kłopotami rodzinnymi ifinansowymi oraz nie mogąc <strong>do</strong> końca porozumieć się ze swoim głównym wykonawcą -konstruktorem Clementem zaprzestał dalszych prac nad nią w 1842 roku. Zmontowaną częśćmaszyny (po<strong>do</strong>bno nadal sprawną) można oglądać w Muzeum Nauk w Londynie. Należy <strong>do</strong>dać, żew odróżnieniu od maszyn Leibniza i Pascala, po ręcznym ustawieniu początkowego stanu, dalszedziałania maszyny różnicowej nie wymagają już żadnej ingerencji użytkownika poza kręceniemkorbą. Prace Babbage'a zainspirowały wielu jemu współczesnych, którzy jak na przykład SzwedziGeorge i Edward Scheutzowie, często z większym powodzeniem ukończyli swoje, może mniejambitne ale nadal praktyczne konstrukcje maszyn różnicowych.Ale Babbage nie poprzestał na próbie skonstruowania maszyny różnicowej. Marzył o maszynie,która mogłaby rozwiązywać bardziej złożone zadania. Tak narodził się jeszcze w trakcie prac nadmaszyną różnicową pomysł zbu<strong>do</strong>wania maszyny analitycznej, którym Babbage żył <strong>do</strong> śmierci.Było to przedsięwzięcie czysto abstrakcyjne - przewidywane przeszkody techniczne i trudnościfinansowe nie pozwoliły nawet na rozpoczęcie prac konstrukcyjnych. W projekcie Babbage zawarłjednak wiele pomysłów zrealizowanych <strong>do</strong>piero we współczesnych komputerach. Między innymirozdzielił pamięć (zwaną magazynem) od jednostki liczącej (młyna), czyli miejsce przechowywaniadanych od jednostki wykonującej na nich działania. Obie te części maszyny analitycznej miały być5/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>sterowane za pomocą <strong>do</strong>datkowego urządzenia kontrolnego, które otrzymywało polecenia nakartach perforowanych, u<strong>do</strong>skonalonych i rozpowszechnionych przez Jacquarda <strong>do</strong> programowaniamaszyn tkackich. Można więc uznać maszynę analityczną Babbege'a za pierwszy pomysłkalkulatora sterowanego programem zewnętrznym.Rys. 4. Maszyna Babbaga.Opis działania maszyny analitycznej trafił w ręce Ady ( jej pełne nazwisko: Ada Augusta hrabinaLovelace), znanej w owych czasach z błyskotliwego umysłu. Urzeczona <strong>do</strong>skonałością projektuuważała, że... " maszyna analityczna tkać będzie wzory algebraiczne, tak jak krosna Jacquarda tkająlicie i kwiaty...".Nie czekając na skonstruowanie maszyny (czego i tak by nie <strong>do</strong>czekała), Ada zajęła sięsporządzaniem opisów jej używania <strong>do</strong> rozwiązywania konkretnych zadań obliczeniowych. Opisyte nazwano by dzisiaj programami, dlatego uważa się ją za pierwszą programistkę komputerów. Dlauczczenia zasług Ady na tym polu nazwano jej imieniem jeden z najbardziej uniwersalnychjęzyków programowania.1.4 Przełom XIX i XX wieku.Koniec XIX wieku był początkiem rozwoju urządzeń mechanograficznych, których głównymprzeznaczeniem było usprawnienie rachunków statystycznych, księgowych i biurowych. Zaczęłosię w Stanach Zjednoczonych od Hermana Holleritha, który postanowił zautomatyzować pracestatystyczne związane ze spisem ludności przeprowadzanym wtedy w Stanach co dziesięć lat.Hollerith sięgnął po elektryczność, jako źródło impulsów i energii, rozwinął postać kartyperforowanej, na której zapisywano dane i zbu<strong>do</strong>wał elektryczny czytnik - sorter kart. Olbrzymimsukcesem Holleritha okazał się spis 1890 roku, którego wyniki zostały całkowicie opracowane zapomocą jego urządzeń na podstawie danych zebranych na jego kartach. W następnych latachHollerith <strong>do</strong>starczał lub wypożyczał swoje urządzenia <strong>do</strong> przeprowadzenia spisów w wielu krajach,w tym także w Europie, między innymi w Rosji. Na przełomie XIX i XX wieku powstało wielefirm, które początkowo oferowały maszyny sterowane kartami perforowanymi i z latami zyskiwałyna swojej potędze a wiele z nich przetrwało <strong>do</strong> dzisiaj, jak na przykład IBM, Bull, Remington -Rand, Burroughs, a także NCR (kasy), i Bell (telefony).U<strong>do</strong>skonalona i znormalizowana karta perforowana przez wiele dziesięcioleci była uniwersalnymnośnikiem informacji, a pierwsze maszyny mechaniczne <strong>do</strong> przetwarzania danych zapoczątkowałystale rosnący popyt na przetwarzanie informacji. Wniosło to także zmiany w stosunkach6/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>międzyludzkich, a w szczególności między państwem (posiadaczem maszyn <strong>do</strong> obróbki informacji)i obywatelem.1.5 Początek XX wieku.Wśród modeli obliczeń powstałych w pierwszej połowie XX wieku największą popularnośćz<strong>do</strong>były maszyny Turinga. W swojej fundamentalnej pracy z 1936 roku, Alan Turing bardzoprzystępnie opisał tok mylenia prowadzący od obliczeń wykonywanych ręcznie <strong>do</strong> obliczeńwykonywanych przez bardzo prostą maszynę. Oto jej opis.Obliczenia ręczne są najczęściej wykonywane na pokratkowanej kartce papieru, której pojedynczekratki są wypełnione cyframi i symbolami działań. Dysponujemy tylko skończoną liczbą znaków( cyfr, np. 0 oraz 1 i symboli działań ), które mogą być wpisywane w kratki. To, co robimy wustalonej chwili, zależy od znaków, które obserwujemy i od działania, jakie podjęliśmy. Możnaprzyjąć, że liczba kratek obserwowanych w danej chwili jest ograniczona. Przejrzenie za większejich liczby sprowadza się <strong>do</strong> wykonania ciągu obserwacji. Możemy także założyć, że liczbawszystkich stanów, w jakich może znaleźć się nasz umysł wykonujący obliczenia, chociaż duża jestskończona.Turing <strong>do</strong>szedł <strong>do</strong> koncepcji swojej maszyny wprowadzając pewne uproszczenia i uściślenia wdziałaniach na kartce i nad nią. Po pierwsze, zapis obliczeń na kartce papieru (a <strong>do</strong>kładniej nadwuwymiarowym układzie kratek) można sprowadzić <strong>do</strong> zapisu na jednowymiarowejpokratkowanej kartce, czyli na tamie podzielonej na kratki. Wystarczy w tym celu treść obliczeńwypełniających kartkę zapisać wierszami. Traci się przy tym czytelność, ale zyskuje redukcjęwymiaru kartki. Po drugie, umysł wykonujący obliczenia można zastąpić przez obiekt bardziejfizyczny zwany głowicą, która znajduje się nad tamą, może się poruszać w obie strony tamy, a wdanej chwili widzi jedynie symbol umieszczony w kratce, nad którą zawisła. Działanie głowicy jestokreślone przez ustalony zbiór instrukcji, zgodnie z którymi może poruszać się w lewo, w prawolub stać w miejscu, potrafi rozpoznawać symbole i może zmieniać zawartości kratki, nad którą sięznajduje. Wykonanie instrukcji przez maszynę Turniga jest działaniem głowicy, uzależnionym odstanu, w jakim się znajduje i co widzi.Obliczenia wykonywane za pomocą maszyny Turinga zależą od początkowego zapisu symboli natamie i od przyjętego zestawu <strong>do</strong>zwolonych instrukcji. Zatem działa ona po<strong>do</strong>bnie jak dzisiejszekomputery - wyniki obliczeń zależą od zapisanych w pamięci komputera danych i od zestawuwykonywanych instrukcji. Zawartoć tamy po zatrzymaniu się maszyny zależy od obu tychczynników. Nieodparcie nasuwa się pytanie o to, co można policzyć za pomocą tak prostychmaszyn. Okazuje się, że bardzo wiele. Sam Turing sformułował tezę, iż na maszynie tego typumożna zrealizować każdy algorytm. Do dzisiaj nie obalono tej tezy. Zauważa się, że w związku ztym można przyjąć, iż algorytmem jest <strong>do</strong>wolny opis wykonania obliczeń na maszynie Turinga.Analizując moc swoich maszyn, Turing <strong>do</strong>szedł jednak <strong>do</strong> wniosku, że istnieją funkcje, którychwartości nie mogą one obliczać.Wspomnieć tutaj należy jeszcze o dwóch innych dziedzinach działalności Turinga ściślezwiązanych z automatyzacją obliczeń i komputerami. W latach <strong>II</strong> wojny światowej Turing zostałwłączony <strong>do</strong> grupy specjalistów zajmujących się w Wielkiej Brytanii deszyfracją kodów Enigmy -maszyny, którą Niemcy używali <strong>do</strong> ko<strong>do</strong>wania meldunków i rozkazów rozsyłanych swoimjednostkom na wszystkich frontach. W 1941 roku działalność tej grupy przyczyniła się <strong>do</strong>zredukowania brytyjskich strat na morzach o 50%. Brytyjscy specjaliści korzystali z materiałów( wśród których był egzemplarz Enigmy oraz maszyna deszyfrująca zwana bombą ) przekazanychim w 1939 roku przez grupę Polaków kierowaną przez Mariana Rejewskiego, zajmujących się od7/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>pięciu lat skonstruowaniem maszyny deszyfrującej. Chociaż Brtyjczycy u<strong>do</strong>skonalili maszynędeszyfrującą otrzymaną od Polaków, pozostawała ona nadal maszyną mechaniczną i jej działanienie nadążało za ciągle u<strong>do</strong>skonalanymi i zmienianymi przez Niemców egzemplarzami Enigmy.Ocenia się że w szczytowym okresie <strong>II</strong> wojny światowej Niemcy używali ponad 70 tysięcy maszynszyfrujących Enigma.Prace nad maszyną deszyfrującą Enigmę przyczyniły się <strong>do</strong> powstania pod koniec wojny wWielkiej Brytanii kalkulatorów elektronicznych. Powstało kilka wersji maszyny o nazwie Coloss,których głównym konstruktorem był T.H. Fowers.Były to już maszyny elektroniczne, w których wykorzystano arytmetykę binarną, sprawdzane byływarunki logiczne (a więc można było projektować obliczenia z rozgałęzieniami), zawierały rejestry,mogły wykonywać programy (poprzez uruchomienie tablic rozdzielczych) i wyprowadzać wynikina elektryczną maszynę <strong>do</strong> pisania.1.6 Pierwsze komputery.Pierwsze komputery zbu<strong>do</strong>wano <strong>do</strong>piero w naszym stuleciu, chociaż pomysły, jakie w nichzrealizowano, pojawiły się przynajmniej sto lat wcześniej, już za czasów Babbage'a. Zastosowanew komputerach środki techniczne pojawiły się bowiem <strong>do</strong>piero w latach międzywojennych. Zanajwiększego inspiratora powstania komputera w jego obecnej postaci uważa się Johna vonNeumanna. Ale najpierw trzeba oddać właściwe miejsce twórcom rzeczywiście najwcześniejszychkonstrukcji, pretendujących <strong>do</strong> miana komputera. Pojawienie się większości z nich przyspieszyła <strong>II</strong>wojna światowa.W 1941 roku Konrad Zuse ukończył w Niemczech prace nad maszyną Z 3, która wykonywałaobliczenia na liczbach binarnych zapisanych w reprezentacji, nazywanej dzisiaj zmiennopozycyjną,sterowane programem zewnętrznym podawanym za pomocą perforowanej tamy filmowej. MaszynaZ 3 została całkowicie zniszczona w czasie bombar<strong>do</strong>wania w 1945 roku. Następny model maszynyZusego, Z 4 przetrwał i działał <strong>do</strong> końca lat pięćdziesiątych. Maszyny Zusego były kalkulatoramiprzekaźnikowymi. W tym czasie znane już były prace Claude Shannona <strong>do</strong>tyczące działańbinarnych (logicznych) za pomocą układów elektronicznych zgodnie z regułami Boole'a.Rys. 5. ENIAC.W roku 1942 zespół specjalistów pod kierunkiem J.W. Mauchly'ego i J.P. Eckerta zaprojektował izbu<strong>do</strong>wał maszynę ENIAC (ang. Electronic Numerical Integrator And Computer). Pierwszeobliczania maszyna ta wykonała w listopadzie 1945 roku. Maszyna ENIAC jest uznawanapowszechnie za pierwszy kalkulator elektroniczny, chociaż w 1976 roku okazało się, że wczeniejzaczęły pracować w Wielkiej Brytanii maszyny Coloss I i <strong>II</strong>. Maszyna ENIAC była monstrualnąkonstrukcją złożoną z 50 szaf o wysokości 3 metrów zawierających około 20 tysięcy lamp.8/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>Słabością tej maszyny było: użycie zwykłego systemu dziesiętnego <strong>do</strong> pamiętania liczb, brakrozdziału między funkcjami liczenia i pamiętania oraz bardzo uciążliwy sposób zewnętrznegoprogramowania. Wady te zostały usunięte <strong>do</strong>piero w projekcie EDVAC.1.7 John von Neumann (1903 - 1957) .John von Neumann, z pochodzenia Węgier, był w swoich czasach jednym z najwybitniejszychmatematyków. W 1946 roku zainspirował on prace w projekcie EDVAC (ang. Electronic DiscreteVariable Automatic Computer ), których celem było zbu<strong>do</strong>wanie komputera bez wad poprzednichkonstrukcji. Zaproponowano architekturę, zwaną odtąd von neumannowską, według której budujesię komputery <strong>do</strong> dzisiaj.W komputerze von Neumanna można wyróżnić przynajmniej następujące elementy: pamięćzłożoną z elementów przyjmujących stan 0 lub 1, arytrometr z<strong>do</strong>lny wykonywać działaniaarytmetyczne, logiczne i inne, sterowanie, wprowadzanie danych i wyprowadzanie wyników.Program, czyli zbiór instrukcji, według których mają odbywać się obliczenia, jest wpisywany <strong>do</strong>pamięci. Kolejne rozkazy programu są pobierane przez jednostkę sterującą komputerem w taktcentralnego zegara i rozpoznawane zgodnie z mikroprogramem wpisanym w układ elektroniczny.Należy podkreślić, że program jest przechowywany w pamięci komputera i jego działanie możezmieniać zawartość <strong>do</strong>wolnego obszaru pamięci (programy mogą się także same modyfikować).Fizycznie nie ma żadnej różnicy między danymi i programami przechowywanymi w pamięcikomputera: są po<strong>do</strong>bnie ko<strong>do</strong>wane jako ciąg zer i jedynek i tak samo zrealizowane technicznie.Można więc powiedzieć, że celem działania komputera von neumannowskiego jest przejście w taktzegara od jednego stanu zawartości pamięci (danego na początku) <strong>do</strong> innego, zawierającegooczekiwany wynik. Można zauważyć po<strong>do</strong>bieństwo tego spojrzenia na komputer von Neumanna <strong>do</strong>maszyny Turinga. Nie ma w tym nic dziwnego gdyż von Neumann bardzo <strong>do</strong>brze znał osiągnięciaTuringa.Postęp w elektronice umożliwił dalszy rozwój komputerów. W latach sześćdziesiątych lampyzastąpiono tranzystorami. Pierwszy tranzystorowy komputer zbu<strong>do</strong>wano w 1956 roku wMassachusettes Institute of Technology. Z kolei układy scalone zastąpiły tranzystory (układ scalonyzawierał w jednej obu<strong>do</strong>wie kilkadziesiąt tranzystorów i innych elementów elektronicznych).Dalszy postęp produkcji tych układów pozwolił umieszczać w jednej "kostce" dziesiątki tysięcytranzystorów. Obwody takie nazwano układami wielkiej skali integracji ( VLSI z ang. Very LargeScale of Integration ).Wymyślono termin: " generacja komputerów " i nazwano komputery lampowe mianem pierwszejgeneracji, tranzystorowe - drugiej, zbu<strong>do</strong>wane z układów scalonych - trzeciej, a w technologii VLSI- czwartej.Postęp w technologii produkcji komputerów odbywał się tak szybko, że zaczęto mówić o rewolucjikomputerowej. Wprowadzenie na rynek tanich układów scalonych umożliwiło powstaniemikrokomputerów, w których elementy przetwarzające informacje umieszczono w jednym układzie- mikroprocesorze.1.8 Komputer typu PC.Pierwsze komputery osobiste (PC z ang. Personal Computer) zostały opracowane przez IBM.Ponieważ firma ta nie miała nic przeciwko temu, by inne przedsiębiorstwa skorzystały z jejpomysłu i podążyły jej śladem, wielu producentów sprzedaje dziś własne komputery, które jednaksą wciąż bu<strong>do</strong>wane według tej samej koncepcji firmy IBM. Ponieważ na rynku pojawiało się corazwięcej produktów, zaczęto pisać programy dla tego typu komputerów. Producenci sprzętu9/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>odpowiedzieli na to kolejną falą unowocześnionych komputerów typu IBM - PC. Proces tenrozwijał się na zasadzie lawiny: komputery, nowe komponenty i oprogramowanie są obecnietworzone przez setki najróżniejszych producentów. Tym sposobem PC stał się najbardziejrozpowszechnionym typem komputera na wiecie.Niemal w tym samym czasie, którym narodził się PC, firma Apple zaczęła bu<strong>do</strong>wać swój własnytyp komputera osobistego, dzieło Steve Woźniaka i Steve Jobsa. System Apple nie był jednakzgodny z IBM - PC ani pod względem sprzętu, ani oprogramowania. Swój sukces zawdzięczał onfaktowi, iż po raz pierwszy wykorzystano tam graficzny sposób komunikowania się zużytkownikiem bazujący na obrazkach i oknach - na rok przed rozpowszechnieniem się Win<strong>do</strong>wsfirmy Microsoft.Komputery Apple od samego początku były systemami kompletnymi. Oznaczało to, że w ichprzypadku nie było już konieczne kupowanie <strong>do</strong>datkowych komponentów, aby na przykła<strong>do</strong>siągnąć dźwięk odpowiedniej jakości. W przeciwieństwie <strong>do</strong> ówczesnych komputerów PC - tów,komputery Apple były znacznie prostsze w obsłudze. Mac, jak chętnie nazywa się komputer firmyApple, szybko stał się ulubionym narzędziem ludzi z kręgów twórczych. Używali go przedewszystkim architekci, muzycy i projektanci, którym najczęściej potrzebny był właśnie wydajny iłatwy w obsłudze komputer. Tak więc Mac wciąż pozostaje główną alternatywą dla komputerówtypu IBM - PC, a fakt, iż w porównaniu z PC -tem jest mniej <strong>do</strong>stępny na rynku, wynika główniestąd, że firma Apple nie u<strong>do</strong>stępniła nikomu praw <strong>do</strong> kopii swojego projektu.Większość producentów skorzystała co prawda z koncepcji peceta firmy IBM, niemniej niektórzywyłamali się i podążyli własną drogą tworząc komputery osobiste niezgodne ze standardem. Stądteż oprogramowanie stworzone dla typowego komputera PC z reguły nie może być na nichuruchamiane.W zupełnym oderwaniu od standardu IBM - a powstały rozwiązania, które przewyższająpierwowzór czy to pod względem ceny, czy przydatności <strong>do</strong> gier, czy też obróbki dźwięku czy teżgrafiki. Niejeden z tego typu systemów był i wciąż jeszcze jest wspaniałym narzędziem, jednakżeprzeznaczonym wyłącznie dla specjalistów skupiających się na wykonywaniu określonej grupyzadań.1.9 Kronika 1 .1642:• Blaise Pascal skonstruował jedną z pierwszych maszyn matematycznych.1822:• Brytyjski matematyk Charles Babbage zaprezentował model maszyny różnicowej, którymiał różnice drugiego rzędu i osiem miejsc po przecinku. Zajął się on następnie maszyną oróżnicach siódmego rzędu i 290 miejscach po przecinku, poniósł jednak porażkę przyrozwiązywaniu problemu wykonania skomplikowanego napędu zębatego.1http://www.republika.pl/pomoce/komputer.htmhttp://www.computerworld.plhttp://386.bajo.pl/chronologicznie.htmhttp://fizar.pu.kielce.pl/history/hist1.htmlhttp://www.teleinfo.com.pl/ti/1999/51/t30.html10/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>1833:• Charles Babbage przedstawił pomysł pierwszej cyfrowej maszyny analitycznej. Nie zostałaona nigdy zbu<strong>do</strong>wana. Projekt przewidywał jednak istotne składniki nowoczesnegoprzetwarzania danych.1930:• W Massachusetts Institute of Technology w Cambridge (USA) grupa naukowców podkierownictwem inżyniera elektryka Vannevara Busha konstruuje pierwszy - pracującyelektromechanicznie - komputer analogowy.1936:• Francuz R. Valtat zgłosił <strong>do</strong> opatentowania maszynę liczącą, której zasada działania opartabyła na systemie dwójkowym.1937:• Niemiec Konrad Zuse zbu<strong>do</strong>wał elektromechaniczną maszynę liczącą opartą na systemiedwójkowym.• George Stibitz zbu<strong>do</strong>wał binarną maszynę sumującą Model K. George Stibitz tworzy wLaboratoriach Bella pierwszy cyfrowy obwód.1940:• Alianci zbu<strong>do</strong>wali pierwszą nadającą się <strong>do</strong> użytku maszynę deszyfrującą.1941:• Niemiecki inżynier Konrad Zuse zaprezentował swoją cyfrową maszynę liczącą "ZuseZ3".Była to pierwsza sterowana programowo maszyna matematyczna, o wysokichparametrach eksploatacyjnych. "Zuse Z3" posiadała binarny mechanizm liczący z prawie600 przekaźnikami jako bistabilnymi elementami i pamięcią z około 1400 przekaźnikami.1942:• Amerykanin John V. Atanasoff ukończył pierwszą sprawną elektroniczną maszynę liczącąw technice lampowej. Atanasoff podjął plan już w roku 1937. Był przekonany, że metodacyfrowa i zastosowanie liczb binarnych będzie najwłaściwsze <strong>do</strong> bu<strong>do</strong>wy maszyn liczących.1943:• Niemiecki inżynier Henning Schreyer zgłosił <strong>do</strong> opatentowania pełnoelektroniczną pamięć iurządzenie liczące z lampami jarzeniowymi. Schreyer od 1937 r. wspólnie z Konradem Zusezajmował się konstruowaniem układu połączeń lampowych <strong>do</strong> przetwarzania danych. Terazopracował on ideę bu<strong>do</strong>wy pełnoelektronicznej maszyny liczącej. Jednakże w czasie wojnyw Niemczech brakowało środków na realizację jego planów.1944:• Węgiersko-amerykański matematyk i chemik John von Neuman rozpoczął próby z modelempierwszej maszyny liczącej z pamięcią EDVAC (Electronic Discrete Variable AutomaticComputer). W urządzeniu ko<strong>do</strong>wano program, składający się z serii pojedynczychinstrukcji. Program zawierał instrukcje warunkowe, które umożliwiały tworzenie pętli.Każda instrukcja programowa mogła być zmieniona przez samą maszynę, jak każdy innyargument operacji. Z takim sposobem działania maszyna zdecy<strong>do</strong>wanie górowała nadwszystkimi <strong>do</strong>tychczasowymi maszynami matematycznymi.• Fizyk Howard Hathavay oddał <strong>do</strong> użytku na Universytecie Harvarda cyfrową maszynęliczącą. Nazywała się MARK I bądź ASCC - miała potężne wymiary i była pierwsząsterowaną programowo maszyną liczącą USA.11/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>1945:• Na Uniwersytecie Pensylwania uruchomiono pierwszą wielką elektroniczną maszynęliczącą wiata ENIAC (Electronic Numerical Integrator and Computer). Zbu<strong>do</strong>wana zostałaprzez Johna Prespera Ecckerta i Johna Williama Mauchly. Do czasu aż wszystkie jej zespołystały się całkowicie z<strong>do</strong>lne <strong>do</strong> użytku, minęły jeszcze dwa lata. Wielka maszynamatematyczna wyposażona była w lampy elektronowe i liczyła 2000 razy szybciej niżkomputer z elektromechanicznymi przekaźnikami. ENIAC zajmował powierzchnięzasadniczą 140 m.kw., posiadał przeszło 17 486 lamp elektronowych, 1500 przekaźników izużywał 174 000 W mocy. Całe urządzenie waży ok. 80 ton i może wykonać maksymalnie5000 operacji <strong>do</strong>dawania i 360 mnożenia w ciągu sekundy. Komputer cechuje dużaawaryjność – średnio co 5 minut przepala się jedna z kilkunastu tysięcy lampelektronowych. Szybkość taktowania zegara ENIAC-a wynosi 100. Powstaje pierwszypodręcznik obsługi komputera. Instrukcję posługiwania się komputerem ENIAC piszeAmerykanka Emily Goldstine. Grace M. Hopper w prototypie komputera Mark <strong>II</strong> znajdujepierwszą „pluskwę”. Jest nią ćma, która spowo<strong>do</strong>wała błąd w pracy jednego zprzekaźników. John von Neumann opracowuje koncepcję programu, który – umieszczony wpamięci – steruje komputerem. Rozpoczyna karierę termin „bit”.• Niemiecki inżynier Konrad Zuse zakończył prace nad swoją maszyną liczącą " Zuse Z4".Komputer był rozwinięciem poprzedniego typu Z3.1947:• W Stanach Zjednoczonych zbu<strong>do</strong>wano maszynę liczącą " Mark <strong>II</strong> " w techniceprzekaźnikowej.• Amerykańska firma IBM buduje komputer SSEC z 12500 lampami i 21400 przekaźnikami.Jest on sterowany za pomocą tamy dziurkowanej. Umożliwiono ingerencję w program.1948:• W toku rozwoju elektronicznych maszyn liczących, opartych na dwójkowym systemieliczbowym, znaczenie praktyczne zyskuje ugruntowana już przed ok. stu laty algebraBoole'a. Posługuje się ona wartościami logicznymi "Tak / Nie" lub " 0 / 1". Ten " krokbinarny" określa matematyk John W. Tukey jako " bit" (binarny digit). Bit staje sięjednostką informacji w przetwarzaniu danych.• IBM 604 jest pierwszą dużą maszyną liczącą sterowaną tamą perforowaną.• Richard Hamming opracowuje sposób wykrywania błędów w programach.1949:• Short Order Code, wymyślony przez Johna Mauchly, jest pierwszym językiemprogramowania wysokiego poziomu.• Na Uniwersytecie Manchester (Anglia) pod kierownictwem Maurica V. Wilkesaskonstruowano po trzech latach pierwszy komputer lampowy z programowalną pamięciąEDSAC (Electronic Delay Storage Automatic Computer).• W tym samym czasie również IBM uruchamia w Nowym Jorku pod kierownictwem JohnaPrespera Eckerta układ z programowalną pamięcią - SSEC (Selective Sequence ElectronicCalculator). EDSAC pracuje z 4500 lampami elektronowymi, a SSEC z 12500 lampamielektronowymi i 21400 przekaźnikami. Nowością w tych komputerach jest to, że takprzebieg programu jak i obróbka danych są zako<strong>do</strong>wane w pamięci maszyny, programzawiera rozkazy warunkowe, które umożliwiają rozgałęzienia i skoki i wreszcie każdyrozkaz programowy z operacyjną częścią adresową może samodzielnie zmienić. Koncepcjętych komputerów opracował już w 1944 r. matematyk amerykański pochodzeniawęgierskiego John von Neamann. Jednakże jego urządzenie EDVAC rozpoczyna pracę<strong>do</strong>piero w roku 1952. Np. w 1945 r. Zuse sformułował ogólny algorytmiczny język formuł,który uwzględniał możliwe warianty programowania pamięci.12/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>1950:• Univac I firmy Eckert and Mauchly Computer Company jest komputerem produkowanymseryjnie.• Komputer " Mark <strong>II</strong>I " używa tamy magnetycznej zamiast kart perforowanych.1951:• Grace Murray Hopper wymyśla pierwszy kompilator A-0.• Na Uniwersytecie Harwarda w Cambridge (Massachusetts) matematyk Howard H. Aikenuruchomił swoją maszynę cyfrową MARK <strong>II</strong>I. Urządzenie to było kontynuacją urządzeńpoprzednich MARK I i MARK <strong>II</strong>, które Aiken bu<strong>do</strong>wał już od roku 1939. W niedługimczasie Aiken buduje pierwszy, wykonany w pełni w technice lampowej maszynę liczącąMARK IV.1952:• Pierwsze asemblery.• Howard H. Aiken uruchomił w USA lampową maszynę liczącą MARK IV.1954:• J.W. Backus stworzył język komputerowy FORTRAN (formula translator). Umożliwia ondialog pomiędzy użytkownikiem a bankiem danych bez konieczności korzystania z pomocyprogramisty. FORTRAN jest skomplikowanym językiem komputerowym, który nie tylkoprzekazuje maszynie polecenia, lecz zawiera w sobie szereg wzorów ułatwiającychprogramowanie.1955:• W Bell Telephone Laboratory w USA rozpoczęła pracę pierwsza tranzystorowa maszynalicząca " Tradic " skonstruowana przez zespół pod kierownictwem J. H. Felkera. Jest onaznana jako " komputer drugiej generacji ".Wkrótce pojawiły się na rynku tranzystorowekomputery ("7090 IBM" i "Gamma 60 Bull").1957:• Fortran <strong>II</strong>.• John McCarthy tworzy wydział sztucznej inteligencji na Uniwersytecie MIT.1958:• Opracowano komputerowy język programowania ALGOL (Algorithmic Language).Po<strong>do</strong>bnie jak FORTRAN - ALGOL jest językiem problemowo zorientowanym, ale niebardziej niż te, które są specjalistycznymi językami naukowo-technicznymi. Ma on innąstrukturę niż FORTRAN.1959:• John McCarthy opracowuje język programowania Lisp (list processing).1960:• Powstaje język programowania Algol 60.• Zostaje opracowany język programowania COBOL (Common Business OrientedLanguage). COBOL używa stosunkowo dużej liczby symboli słownych.• Powstaje LISP.• W listopadzie firma DEC przedstawia PDP-1, pierwszy komputer wyposażony w monitor iklawiaturę.13/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>1962:• Powstaje APL, APL/PC, APL*PLUS.• Powstaje SIMULA.• Maleńkie tranzystory zwiększają prędkość elektronicznego przetwarzania danych (trzeciageneracja komputerów).1963:• Powstaje program Eliza, który wykazuje pewne przejawy inteligencji. Potrafi prowadzićproste rozmowy z człowiekiem.• Na uniwersytecie Kalifornijskim rozpoczynają się prace nad logiką rozmytą (fuzzy logic),która ma pomóc w stworzeniu komputera myślącego.• Zatwierdzony zostaje 7-bitowy kod ASC<strong>II</strong>.1964:• Powstaję języki PL/I, dialekty: EPL, PL/S, XPL.• Thomas Kurz i John Kemeny opracowują w Dartmouth College prosty językprogramowania Basic.1966:• Fortran IV (1966).1967:• Ole-Johan Dahl i Kristen Nygaard z Norwegian Computing Centre opracowują językSimula, który jest pierwszym obiektowo zorientowanym językiem programowania.• Holender Edsger Dijkstra opracowuje zasady programowania strukturalnego.• Powstaje firma Intel założona przez dwóch byłych pracowników Fairchild Semiconductor.• Powstaje pierwszy radziecki superkomputer - BESM-6.1968:• Powstaje Algol 68.• Edsger Dijkstra przekonuje, że instrukcja GOTO może być szkodliwa i nie powinno się jejstosować.• Monolityczne układy przełączające zastępują minitranzystory i hybry<strong>do</strong>we układy scalone.Zaczyna się czwarta generacja komputera. Podczas gdy komputery drugiej generacjiwykonywały na sekundę 1300 <strong>do</strong>dawań, a trzeciej 160 000 <strong>do</strong>dawań, to nowe urządzeniawykonują ponad 300 000.• Dzięki upowszechnieniu się komputerów Odra powstają pierwsze ZETO - ZakładyElektronicznej Techniki Obliczeniowej.1969:• IBM podejmuje decyzję o nie<strong>do</strong>starczaniu programów aplikacyjnych razem ze sprzętem.Tak powstaje rynek oprogramowania.• Szwajcar Niklaus Wirth opracowuje język programowania Pascal.• Douglas Engelbart z Xerox PARC (Palo Alto Research Center) tworzy podstawy hipertekstu(pierwowzoru HTML). Engelbart jest również twórcą myszy komputerowej (1964 r.).1970:• Powstaje Prolog, Prolog-2, Prolog++, Prolog-D-Linda.• W IMM powstają dwa zespoły zajmujące się technikami kompilacji. Zespół Jana Walaskabuduje kompilatory COBOL i Pascala. Zespół Stanisława Niewolskiego tworzy kompilatorFortran IV dla RIAD. Prace te podjęto, by możliwe było samodzielne opracowywanie i14/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>rozpowszechnianie kolejnych języków oprogramowania oraz tworzenie przy ich użyciuprogramów systemowych i aplikacyjnych.1972:• Dennis Ritchie opracowuje język programowania C w firmie Bell Labs.• W laboratoriach PARC powstaje obiektowy języka programowania Smalltalk, stworzonyprzez Alana Kaya.• Powstaje procesor Intel 8008 (200 Khz), pierwszy 8 bitowy układ, zastąpiony niebawemprzez Intel 8080.1974:• W kwietniu powstaje 8 bitowy procesor 8080 (2 Mhz). Składa się z 6 tys. tranzystorów.1976:• Departament Obrony USA ogłasza przetarg na opracowanie śro<strong>do</strong>wiska i języka <strong>do</strong>produkcji oprogramowania, które ma być wbu<strong>do</strong>wane w postaci sterowników <strong>do</strong> działokrętowych, stacji radiolokacyjnych, wyrzutni rakietowych. W konkursie wygrywa zespółreprezentujący kilka wydziałów informatyki uczelni francuskich. Ostatecznie DepartamentObrony zatwierdza specyfikację wynikową języka ADA oraz związane z nim śro<strong>do</strong>wiskoprogramistyczne.• Cray 1 - pierwszy komputer wektorowy <strong>do</strong> intensywnych obliczeń numerycznych.• Zilog wprowadza na rynek procesor Z80.1977:• Fortran 771978:• W czerwcu Intel przedstawia pierwszy 16-bitowy procesor - 8086 (4,77 Mhz). Składał się z29 tys. tranzystorów.1979:• Powstają Modula-2, Modula-2+, Modula-3, Modula-P, Modula/R.1980:• Powstaje język programowania Ada.• Powstaje dBASE <strong>II</strong> - wersje późniejsze: dBASE <strong>II</strong>I, <strong>II</strong>I+, IV, V• Brytyjscy inżynierowie wprowadzili na rynek komputer osobisty (Sinclair ZX - 80).• Microsoft tworzy pierwowzór DOS-u.1981:• IBM <strong>do</strong>starcza pierwszy Personal Computer (PC) z 16-bitowym procesorem 8088,pracującym z częstotliwością 4,7 MHz pod kontrolą DOS.1982:• W lutym Intel prezentuje 16-bitowy procesor 80286 (6 Mhz). Zawiera on 134 tys.tranzystorów.• John Warnock opracowuje w firmie A<strong>do</strong>be język PostScript.1983:• Bjarne Stroustroup opracowuje C++.• Borland wprowadza Turbo Pascal.• Powstaje Smalltalk-80, Smalltalk/V na PC.15/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>• Powstaje standard Ada 83, rozszerzenia Ada++, Ada 9X.• Microsoft wprowadza edytor Word dla DOS.1984:• Powstaje Macintosh.• Microsoft prezentuje system operacyjny Win<strong>do</strong>ws.1985:• Powstaje COBOL 85• W październiku Intel przedstawia 32 bitowy procesor 80386.1986:• Intel wprowadza procesor 80386.1989:• W kwietniu powstaje procesor Intel 80486, który zawiera 1,2 mln tranzystorów.1990:• Powstaje procesor Intel i486.• Microsoft wprowadza ikony <strong>do</strong> Win<strong>do</strong>ws 3.0.1991:• Fortran 90• Linus Thorvalds opracowuje system operacyjny Linux.1992:• Pojawia się Win<strong>do</strong>ws 3.1 przeznaczony dla krajów naszego regionu. System Microsoftu niema jeszcze polskego menu, ale obsługuje polskie znaki diakrytyczne.1993:• W marcu powstaje procesor Pentium• Microsoft wprowadza Win<strong>do</strong>ws NT. Do sprzedaży trafiają polskie wersje Word i Excel. ZWordem konkuruje edytor QR-Tekst firmy Malkom.1994:• Uchwalona przez Sejm Ustawa o prawie autorskim miała ograniczyć piractwokomputerowe.1995:• Sun przedstawia światu język Java.• Powstaje Visual Fortran 95.• 24 sierpnia na rynku pojawia się Win<strong>do</strong>ws 95.1996:• Powstaje Pentium Pro1998:• W kwietniu Intel przedstawia procesor Pentium <strong>II</strong> (350 MHz i 400 MHz).• W czerwcu Microsoft wypuszcza system operacyjny Win<strong>do</strong>ws 98.16/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>2 Języki programowania.2.1 Rozwój programowania.Możliwość zaprogramowania maszyny, a tym samym <strong>do</strong>stosowanie jej działania <strong>do</strong> wymogówużytkownika w danym momencie, przyczyniła się <strong>do</strong> tego, że komputer stał się obecnieurządzeniem niemal niezbędnym w wielu dziedzinach. Byłoby to niemożliwe bez znaczącychpostępów w programowaniu, a w szczególności bez rozwoju języków i narzędzi automatyzującychpracę programisty. Pierwsze komputery były programowanie przez fizyczną zmianę układówelektronicznych (tzw. hardware'u) lub przestawienie przeznaczonych <strong>do</strong> tego przełączników. Byłato metoda powolna, kosztowna, o bardzo ograniczonych możliwościach. W ten sam sposób byływprowadzane dane. Z biegiem czasu ilość danych <strong>do</strong> opracowywania wzrosła tak bardzo, że niepozostało nic innego, jak tylko poszukać nowego systemu. Tak powstały dziurkowane karty itaśmy. Kolejnym krokiem było zastosowanie takich samych kart i taśm <strong>do</strong> przechowywaniaprogramów. Dzięki temu komputery zyskały pewną elastyczność. Można było stosunkowo szybko iłatwo zała<strong>do</strong>wać dany program <strong>do</strong> pamięci maszyny. Możliwość przechowywania w pamięcikomputera programu i danych stanowiła wielki krok naprzód, lecz jednocześnie stworzyła noweproblemy. Teraz bowiem okazało się, że potrzebny jest prosty system porozumiewania się zkomputerem i ko<strong>do</strong>wania programów, które maszyna ma wykonywać. I tak <strong>do</strong>szło <strong>do</strong> pojawieniasię pierwszych języków programowania. Żeby komputer wykonał określone zadanie, należywskazać mu sposób, w jaki ma to uczynić. Nie jest to proste, gdyż trzeba posłużyć się językiemzrozumiałym dla maszyny, którego podstawę stanowi szereg precyzyjnych instrukcji. Takieporozumiewanie się z komputerem odbywa się za pomocą środków, których <strong>do</strong>starczają językiprogramowania, a które w swoich początkach były bardzo prymitywne i trudne w użyciu.Wszystkie języki programowania wykorzystują system ściśle ustalonych reguł, które w większymlub mniejszym stopniu mają zbliżyć <strong>do</strong> siebie język naturalny człowieka i maszyny; sąpośrednikiem między skompilowanym kodem maszynowym (zrozumiałym dla komputera) ajęzykiem naturalnym.Ponieważ jednak komputer rozumie i posługuje się tylko tzw. językiem binarnym, któregopodstawę stanowi rozróżnienie dwóch stanów, jakie może przyjąć wyłącznik(włączone/wyłączone), a reprezentowanych przez 0 i 1, to ciąg instrukcji - czyli program - trzebaprzetworzyć tak, aby stał się zrozumiały dla maszyny. Na szczęście, tłumaczenie takiego kodu najęzyk zrozumiały dla komputera jest procesem mechanicznym i powtarzalnym, więc może byćwykonane przez samą maszynę. Służy <strong>do</strong> tego specjalny program tłumaczący zwany translatorem.Obecnie <strong>do</strong> tłumaczenia kodu z języka programowania na język maszynowy używa się dwóchtypów programów tłumaczących: kompilatorów i interpreterów. Kompilator przekształca programnapisany w języku wysokiego poziomu na program w języku zrozumiałym dla maszyny. W tensposób otrzymuje się tak zwany kod wynikowy, który może być wykonywany <strong>do</strong>wolnie wiele razy.W przypadku kompilatorów należy rozróżniać trzy języki: ten, w którym napisano program i któryjest mniej lub bardziej zbliżony <strong>do</strong> naturalnego (kod źródłowy); właściwy dla danego typukomputera język maszynowy, na który tłumaczony jest program (kod wynikowy); język samegokompilatora, którym może być język programu źródłowego lub maszynowy (albo jeszcze jakiśinny).Interpreter natomiast tłumaczy kolejno poszczególne instrukcje programu napisanego w językuwysokiego poziomu (może to być ten sam język, co w przypadku kompilatora), a te są natychmiastwykonywane. Tak więc, odmiennie niż kompilator, który jednorazowo przekształca program wcałości, interpreter tłumaczy każdą instrukcję oddzielnie, bezpośrednio przed jej wykonaniem.Interpreter nie generuje programu wynikowego. Dlatego za każdym razem, kiedy wykonuje się17/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>dany program, interpreter ponownie musi go tłumaczyć linia po linii. Co więcej, równieżpowtarzające się fragmenty programu muszą być tłumaczone oddzielnie, za każdym razem odnowa. W przypadku interpretera rozróżnia się tylko dwa języki. Jeden - to język programuźródłowego, a drugi - to język, w jakim został napisany sam interpreter. Nie wyodrębnia się koduwykonywalnego, gdyż jest on podawany stopniowo, w miarę jak mikroprocesor zgłasza takąpotrzebę. Programy interpretowane wykonują się wolniej niż kompilowane, ale interpreter, jakośro<strong>do</strong>wisko programowania i uruchomieniowe, jest bardziej elastyczny, gdyż wszelkie błędy(termin przejęty z angielskiego: bug - pluskwa) mogą być wyłapywane i poprawiane już w trakcienormalnego wykonywania programu.Techniki programowania rozwijały się równolegle <strong>do</strong> ewolucji komputera. Pierwsze języki starałysię maksymalnie wykorzystać niewielką moc ówczesnych procesorów oraz skromne możliwościsystemów operacyjnych. W tamtym czasie <strong>do</strong> programowania używano często języka niskiegopoziomy zwanego asemblerem (w jęz. angielskim assembler), który jest językiem symbolicznym,lecz ściśle związanym z maszyną, na której program będzie wykonywany. W asemblerze jednainstrukcja tłumaczy się na jedną instrukcję procesora. Mimo tej nie<strong>do</strong>godności asembler był <strong>do</strong>brąalternatywą dla żmudnego wprowadzania <strong>do</strong> pamięci maszyny nie kończących się ciągów zer ijedynek lub liczb szesnastkowych, z drugiej strony, wpisany weń stopień komplikacji sprawił, żeśro<strong>do</strong>wisko to było wyłączną <strong>do</strong>meną wysokiej klasy profesjonalistów. Wprowadzenie asembleraprzyczyniło się głównie <strong>do</strong> tego, że programy stały się czytelniejsze, chociaż <strong>do</strong> kodusymbolicznego <strong>do</strong>dano instrukcje nie mające swojego odpowiednika w rozkazach procesora. Służąone <strong>do</strong> przekazywania informacji kompilatorowi i zostały nazwane "pseu<strong>do</strong>rozkazami".Pseu<strong>do</strong>rozkazem są na przykład te, które określają początek i koniec pewnych części programu(podprogramów i procedur) lub wskazują kompilatorowi sposób wykonania konkretnego zadania.Wkrótce stwierdzono, że język symboliczny nie rozwiązuje ostatecznie problemów związanych zprogramowaniem, gdyż zmiana procesora wymaga nowego asemblera, <strong>do</strong>stosowanego <strong>do</strong> instrukcjinowej maszyny, a programowanie w asemblerze wymaga bardzo <strong>do</strong>brego poznaniamikroprocesora, jego rejestrów, struktury pamięci i wielu innych rzeczy. Mimo tych wad językisymboliczne są nadal stosowane z dwóch zasadniczych powodów. Po pierwsze, istnieje jeszczeolbrzymia ilość oprogramowania napisanego w tych językach, z którego nie można po prostuzrezygnować. Po drugie, z języków symbolicznych korzysta się <strong>do</strong> pisania niektórych krytycznychsekcji programów, gdyż dzięki temu, że stoją blisko języka wewnętrznego maszyny, mają bardzowydajny kod, co pozwala bu<strong>do</strong>wać zajmujące niewiele miejsca i szybko działające programy,specjalnie <strong>do</strong>stosowane <strong>do</strong> danego modelu.Reasumując można powiedzieć, że programowanie w języku maszynowym lub symbolicznym mapewne zalety (lepsze <strong>do</strong>stosowanie <strong>do</strong> sprzętu, maksymalna prędkość działania, minimalne zajęciepamięci), ale i znaczne wady (niemożność napisania kodu nie związanego z maszyną, wyższystopień trudności przy pisaniu programu oraz w rozumieniu kodu programu).Kolejny krok naprzód w dziedzinie programowania nastąpił wraz z pojawieniem się językówwysokiego poziomu. Ponieważ języki te nie są tak ściśle związane z konkretną maszyną,programista znający którykolwiek z nich jest w stanie zaprogramować <strong>do</strong>wolny komputer, podwarunkiem, że istnieje odpowiedni dla niego kompilator lub interpreter. Zazwyczaj kompilatoryjęzyków wysokiego poziomu działają dwuetapowo. W pierwszej fazie kod źródłowy jestprzekształcany <strong>do</strong> pewnej postaci pośredniej, również niezależnej od maszyny. W drugiej fazie,otrzymany w ten sposób kod pośredni jest tłumaczony na kod wewnętrzny maszyny, na której mabyć wykonywany dany program. W ten sposób, zmieniając jedynie program tłumaczący w drugiejfazie, niewielkim wysiłkiem można przekształcić dany kod <strong>do</strong> postaci różnych językówmaszynowych.18/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>Pierwsze języki wysokiego poziomu, jak COBOL, FORTRAN i APL, pochodzą z latpięćdziesiątych i sześćdziesiątych. Choć znacznie uprościły proces, w praktyce nie wyszły pozakrąg zastosowań zawo<strong>do</strong>wych. Wszystkie języki programowania - również asembler - muszą byćtłumaczone na język zrozumiały dla komputera, a ten rozumie tylko ciągi zer i jedynek i jedynie nanich operuje. Obecnie oprócz języków dysponujących zarówno kompilatorem jak i interpreterem,na przykład BASIC, stosowane są inne, tradycyjnie interpretowane, np. APL, oraz takie, które sąniemal wyłącznie kompilowane, np. COBOL i FORTRAN.W miarę pojawiania się na rynku kolejnych języków wysokiego poziomu użytkownicy stwierdzili,że <strong>do</strong> konkretnych zadań jedne były lepsze od innych. Dlatego też COBOL stał się ulubionymnarzędziem <strong>do</strong> tworzenia aplikacji <strong>do</strong>tyczących zarządzania, podczas gdy FORTRANrozpowszechnił się jako język <strong>do</strong> prac naukowo-technicznych dzięki łatwości,z jaką radzi sobie z wyrażeniami i skomplikowanymi działaniami matematycznymi. Pomimo żejęzyki, o których wyżej mowa, są nadal stosowane, to obecnie zawo<strong>do</strong>wi programiści korzystajązazwyczaj z bardziej rozwiniętych języków wysokiego poziomu, w szczególności dla śro<strong>do</strong>wiskakomputerów osobistych PC, które bardzo upraszczają programowanie. Takimi językami są np.PASCAL i C, choć ten ostatni jest stopniowo wypierany przez swoją wydajniejszą odmianę C++.Innym, szybko rozpowszechniającym się językiem, jest JAVA. Z założenia przeznaczony <strong>do</strong>wykorzystania w Internecie, umożliwia jednak konstruowanie złożonych aplikacji. Główne cechywyróżniające język JAVA to przenośność pomiędzy różnymi platformami sprzętowymi isystemami operacyjnymi oraz czytelny kod źródłowy programów napisanych w tym języku. Dotworzenia stron Internetu korzysta się również z innego języka - HTML (angielski skrót nazwyHypertext Markup Language). Oferuje on mniej możliwości niż Java, a zasadniczym jegoprzeznaczeniem jest właśnie tworzenie stron WWW.Odpowiedzią na konieczność szybkiego i łatwego konstruowania złożonych programów byłopojawienie się na rynku tzw. języków programowania wizualnego. Są to narzędzia, które na baziejęzyków wysokiego poziomu, takich jak BASIC, PASCAL i C++ , pozwalają na bu<strong>do</strong>wanieprogramu przez wybranie obiektów i elementów, które mają pojawić się na ekranie. Główną zaletąjęzyków wizualnych jest to, że u<strong>do</strong>stępniają użytkownikowi śro<strong>do</strong>wisko graficzne, pozwalającebu<strong>do</strong>wać kompletne aplikacje, nawet bez <strong>do</strong>brej znajomości skomplikowanej składni danegojęzyka. Spośród tego typu śro<strong>do</strong>wisk programistycznych należy wymienić, w szczególności, Delphii ObjectVision firmy Borland oraz Visual Basic Microsoftu. Czasem narzędzia te są określane takżemianem automatycznych generatorów kodu źródłowego.2.2 Generacje języków programowania.Języki programowania można podzielić na pięć wyraźnie różniących się generacji (niektórzymówią o czterech). W miarę jak zmieniał się komputer, wystąpiła konieczność <strong>do</strong>starczaniaużytkownikowi narzędzi programistycznych, które umożliwiłyby mu maksymalne wykorzystaniesprzętu. Nie ma jednak pełnej zbieżności chronologicznej między poszczególnymi generacjamijęzyków i sprzętu.Pierwsza generacja - Programowanie pierwszych komputerów akceptujących zmianęoprogramowania odbywało się bezpośrednio w kodzie binarnym, który można przedstawić jakociągi zer i jedynek. Każdy typ komputera operuje własnym kodem, który dlatego został określonynazwą język maszynowy lub wewnętrzny. I to właśnie stanowi główną wadę tych języków, gdyżprogramista każ<strong>do</strong>razowo musi <strong>do</strong>stosowywać się <strong>do</strong> języka konkretnej maszyny.Druga generacja - Ponieważ operowanie ciągami zerojedynkowymi nie jest wygodne dlaprogramisty, przypisano im łatwiejsze <strong>do</strong> zrozumienia znaki mnemotechniczne. Tak narodziły się19/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>języki symboliczne, zwane też asemblerami. Choć stanowią proste tłumaczenie językamaszynowego na symbole i są ściśle związane z danym modelem komputera, to ułatwiają pisanieinstrukcji i czynią je bardziej czytelnymi.Trzecia generacja - Kolejnym krokiem w rozwoju języków programowania było powstaniejęzyków wysokiego poziomu. Symbole asemblera reprezentujące konkretne instrukcje zostałyzastąpione kodem nie związanym z maszyną, bardziej zbliżonym <strong>do</strong> języka naturalnego lubmatematycznego.Czwarta generacja - Na czwartą generację języków programowania składa się szereg narzędzi,które umożliwiają bu<strong>do</strong>wę prostych aplikacji przez zestawianie „prefabrykowanych” modułów.Obecnie wielu specjalistów uważa, że nie są to języki programowania w ścisłym znaczeniu, gdyżczęstokroć stanowią jedynie rozszerzenie języków już istniejących. Niektórzy autorzy proponująstosować nazwę „czwarta generacja” wyłącznie w odniesieniu <strong>do</strong> programowania obiektowego(OOP).Piąta generacja - Nazwę „język piątej generacji” stosuje się czasem w odniesieniu <strong>do</strong> językówużywanych <strong>do</strong> tworzenia programów wykorzystujących tzw. sztuczną inteligencję (AI) lub inaczej- systemów ekspertowych.2.3 Podstawowe definicje.Język - jest to ogólna nazwa zdefiniowanego zbioru znaków i symboli oraz reguł określającychsposoby i kolejność ich użycia. Język, który jest stosowany <strong>do</strong> przetwarzania algorytmów nosinazwę języka algorytmicznego, a przy zastosowaniu go <strong>do</strong> celów programowania określony jestjako język programowania. Ponieważ komputer posługuje się językiem binarnym, tzn. rozróżniastany 0,1, program w języku programowania należy przetworzyć tak, aby był zrozumiały dlamaszyny – zadaniem tym zajmują się translatory.Język programowania - zbiór zasad składni, instrukcji, dzięki którym powstaje kod źródłowyprogramu. Procesor jest w stanie wykonywać program w kodzie maszynowym. Jednakże tworzenieprogramów w tym języku jest praktycznie niemożliwe. Dlatego programista używa językazrozumiałego dla człowieka, który następnie jest kompilowany bądź interpretowany <strong>do</strong> postacimaszynowej. Istnieje wiele rodzajów języków programowania. Można je podzielić na językistrukturalne i obiektowe. Innym kryterium podziału jest zastosowanie języków (innych używa się<strong>do</strong> tworzenia programów multimedialnych, a innych <strong>do</strong> obliczeń numerycznych czy np. aplikacjisieciowych). Niektóre z języków są bardziej uniwersalne niż inne.Język niskiego poziomu (angielskie low-level language) – język programowania, w którym środkistrukturalizacji kodu są ograniczone <strong>do</strong> co najwyżej podprogramów i makroinstrukcji. Polecenia wnim są zapisywane symbolicznie, a jednemu rozkazowi dla komputera odpowiada jeden rozkazprogramisty. Do języków niskiego poziomu zalicza się języki adresów symbolicznych, czyliasemblery. Poziom języków programowania nie określa jego jakości, lecz rodzaj zastosowań.Język wysokiego poziomu (angielskie high-level language) – język programowania, zazwyczaj obu<strong>do</strong>wie blokowej, spełniający wymagania programowania strukturalnego, programowania zużyciem obiektów lub nawet programowania obiektowego. Typowymi i najczęściej używanymijęzykami wysokiego poziomu są języki: C, C++, Smalltalk, Java, Pascal i Lisp, lecz również językispecjalizowane, np. język SQL służący <strong>do</strong> formułowania zapytań <strong>do</strong> baz danych lub edukacyjnyjęzyk Logo. Istnieje wiele modyfikacji języków starszej generacji, np. Fortranu, Basica lub Cobolu,które po unowocześnieniu spełniają w zupełności kryteria języków wysokiego poziomu. Cechąznamienną dla nich jest możliwość bezpieczniejszego programowania, tj. programowania mniej20/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>podatnego na błędy, i wynikająca z tego możliwość opracowywania większych programów(powyżej 10 000 wierszy kodu).Język maszynowy, język wewnętrzny (angielskie machine language) - wewnętrzna, dwójkowareprezentacja rozkazów procesora. Do początku lat siedemdziesiątych rozruch niektórych typówkomputerów wymagał wprowadzenia z konsoli elementarnego programu ładującego w postacidwójkowych kodów języka maszynowego. Moduły wyrażone w <strong>do</strong>wolnym języku programowaniasą po ostatecznym przetłumaczeniu sprowadzane <strong>do</strong> postaci języka maszynowego.Język strukturalny (angielskie structural language) - język spełniający paradygmat programowaniastrukturalnego, tj. zaopatrzony w instrukcje strukturalne. Większość języków zaprojektowanych po1970 spełnia wymogi strukturalności.Język proceduralny (angielskie procedural language) - język spełniający paradygmatprogramowania proceduralnego, np. Fortran, Pascal lub C, lecz także każdy nowszy język w swejwarstwie proceduralnej.Język imperatywny (angielskie imperative language) – język, w którym program jest pojmowanyjako ciąg wykonywanych po sobie instrukcji. Programista używający języka imperatywnego osiągazamierzony efekt przez manipulowanie wartościami zmiennych. Przykładami językówimperatywnych są Pascal i C.Język problemowy - jest przeznaczony <strong>do</strong> określonych zadań. Do tworzenia programówpowiązanych czymś ze sobą. Jego przeciwieństwo to język uniwersalny, taki jak np. Pascal, którymoże być zastosowany praktycznie <strong>do</strong> wszystkiego.Język obiektowy (angielskie object-oriented language) – język, który umożliwia realizowanieparadygmatu obiektowego, tzn. programowanie z użyciem hierarchii klas (zwłaszcza klasabstrakcyjnych). Popularnymi językami obiektowymi są: C++, Java, Smalltalk, Object Pascal, Beta,Theta, CLOS, Eiffel, Ada98, Python i in. W języku angielskim rozróżnia się też słabsze pojęcie:object-based language, tj. język umożliwiający stosowanie obiektów, w którym użytkownik możedefiniować i stosować własne typy danych. Od lat osiemdziesiątych języki obiektowe uważa się zaszczytowe osiągnięcie inżynierii oprogramowania.Kod maszynowy - język rozumiany przez procesor. Program w kodzie maszynowym składa się zciągu wartości binarnych, które oznaczają zarówno instrukcje jak i dane. Program, który jestnapisany w pewnym języku programowania, musi zostać skompilowany, aby mógł byćwykonywany przez komputer. Postać kodu maszynowego zależy od architektury procesora, naktóry dany program jest przeznaczony. Dlatego program musi zostać skompilowany na konkretnejmaszynie, ewentualnie na systemie kompatybilnym z systemem <strong>do</strong>celowym.Kod źródłowy - program komputerowy napisany w języku programowania. Jest to postać programu,która jest zrozumiała dla programisty (bez konieczności jego uruchamiania). Kod źródłowy jestprzekształcany na kod maszynowy w procesie kompilacji programu.Kod wynikowy (angielskie object code) - rezultat pracy translatora (np. kompilatora), nadający się<strong>do</strong> bezpośredniego wykonywania przez procesor albo wymagający dalszej obróbki (np.konsolidacji).21/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>2.4 Śro<strong>do</strong>wisko programistyczne.Jak zostało to wcześniej wspomniane, stworzenie działającego programu komputerowego wymagaposiadania translatora. Większość języków programowania, powstałych szczególnie w ostatnichlatach, zawiera jednak znacznie więcej elementów:translator – służy <strong>do</strong> wykonania kompilacji lub interpretacji kodu źródłowego. Standar<strong>do</strong>wymkatalogiem, w których umieszcza się pliki translatora jest katalog BIN(w systemach Win<strong>do</strong>ws) w głównym katalogu aplikacji. Aby proces translacji był możliwy, systemoperacyjny musi znać <strong>do</strong>kładne położenie translatora i jego bibliotek.W tym celu należy <strong>do</strong>konać odpowiedniego wpisu w pliku wsa<strong>do</strong>wym autoexec.bat (czasami wpistworzony jest automatycznie podczas instalacji).Przykłady:Fortran 90SET PATH=C:\F90\BIN;"%PATH%"SET INCLUDE=C:\F90\INCLUDE;"%INCLUDE%"SET LIB=C:\F90\LIB;"%LIB%"VFortSET PATH=%PATH%;C:\VFort\BinSET LIBRARY_PATH=C:\VFort\LibDelphi 6.0SET PATH=C:\ DELPHI6\BIN;C:\ DELPHI6\PROJECTS\BPL;%PATH%FreePascalSET PATH=C:\FreePas\Bin\Win32;%PATH%Przykłady są przedstawione dla przypadku, gdy każdy program zainstalowany jest bezpośrednio wkatalogu głównym – inne położenie wymaga odpowiedniego wpisu. Podczas instalacji programu(języka programowania) należy pamiętać, że niektóre translatory, szczególnie starsze, nie akceptujądługich nazw (np. kompilator G77) – co może stać się powodem niezrozumiałych z pozoru błędów(translator nie będzie działał). Może się również zdarzyć, że w pliku autoexec.bat będzie tak dużowpisów <strong>do</strong> zmiennej PATH, że zajmą one całą przeznaczoną na nią pamięć, co w efekcie może<strong>do</strong>prowadzić <strong>do</strong> problemów z uruchomieniem systemu (plik win.com) – należy wówczas w miaręmożliwości ograniczyć długości ścieżek.biblioteki i <strong>do</strong>datkowe pliki wsa<strong>do</strong>we – służą <strong>do</strong> rozszerzania możliwości języka, szczególnie wzakresie pewnych zastosowań (np. obliczeń matematycznych, numerycznych, obróbki grafiki).Standar<strong>do</strong>wo instalowane są w katalogach LIBRARY i INCLUDE w głównym katalogu aplikacji.Biblioteki podstawowe <strong>do</strong>starczane są wraz z śro<strong>do</strong>wiskiem programistycznym, biblioteki<strong>do</strong>datkowe rozprowadzane są w postaci osobnych pakietów.edytor kodu – służący <strong>do</strong> pisania tekstu kodu źródłowego. Edytory mogą być uniwersalne (np.ConText, Amigo, Crimson, Codex, EditPlus, UltraEdit, Editeur, EmEditor i inne) lub teżzintegrowane z konkretną implementacją języka (np. Borland Delphi, Compaq Visual Fortran iinne). Edytory uniwersalne pozwalają na podłączanie kompilatorów jednego lub wielu języków i sąrozprowadzane jako oddzielne programy. Podłączenie konkretnego kompilatora odbywa siępoprzez odpowiednią definicję opcji programu. Zaletą edytorów jest to, że poprawiają znacznieprzejrzystość i wygodę tworzenia kodu, a także „pomagają” pisać kod źródłowy programu22/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>wyróżniając, zazwyczaj kolorem lub wytłuszczoną czcionką, słowa kluczowe danego języka –łatwo wówczas zauważyć błąd już na etapie jego popełniania.debugger (analizator kodu) – służy <strong>do</strong> analizy poprawności tworzonego kodu źródłowego i stanowizazwyczaj integralną część translatora (może być to również oddzielny program). Podczas analizykodu źródłowego generowane są informacje o błędach – czasami wymaga to podania <strong>do</strong>datkowychopcji kompilacji – na bieżąco (analizator zatrzymuje się w miejscu wykrycia błędu) lub też wpostaci końcowego raportu. Oprócz sygnałów o błędach, analizatory podają również tzw.ostrzeżenia, tzn. informacje o znalezieniu niejasności w kodzie lub o wykryciu miejsca potencjalnieniebezpiecznego. Typowym ostrzeżeniem jest wia<strong>do</strong>mość o wykryciu deklaracji zmiennej, która niezostała nigdzie w kodzie wykorzystana.edytor formularzy – służy <strong>do</strong> bu<strong>do</strong>wy okien widzianych przez użytkownika po uruchomieniuprogramu (formularzy). Element ten występuje jedynie w językach wizualnych, takich jak VisualBasic, Delphi, Compaq Visual Fortan i innych. W różnych implementacjach języków, edytorformularzy może być <strong>do</strong>stępny bezpośrednio po uruchomieniu programu lub też po wybraniuodpowiedniej opcji z menu. Zaletą stosowania tego narzędzia jest łatwość tworzenia <strong>do</strong>wolnieskomplikowanych okien i określania ich właściwości. Nie traci się wówczas czasu na pisanieelementów kodu, odpowiedzialnych za tworzenie się formularzy i ich elementów, a programistaskupia się jedynie na realizacji założonego algorytmu. Brak edytora formularzy nie przesądza otym, że nie można tworzyć standar<strong>do</strong>wych, „okienkowych” aplikacji – wygląd definiowany jestwówczas przez programistę w kodzie źródłowym.menadżer projektu – służy <strong>do</strong> zarządzania modułami i plikami projektu. Rzadko bowiem tak sięzdarza, że cały kod źródłowy zawarty jest w jednym pliku – przeważnie jest ich wiele i zawierająnie tylko poszczególne moduły kodu, ale również biblioteki, różne pliki wsa<strong>do</strong>we, grafikę i plikimultimedialne. Zazwyczaj istnieje główny plik projektu zawierający wszystkie potrzebne <strong>do</strong>kompilacji informacje. Z pomocą menadżera łatwo można modyfikować zawartość i strukturęprojektu.narzędzia <strong>do</strong>datkowe – służą <strong>do</strong> tworzenia systemu pomocy, ikon i kursorów, programówinstalacyjnych. Ilość narzędzi i poziom ich zaawansowania zależy od implementacji języka.system pomocy – służy <strong>do</strong> uzyskiwania informacji o śro<strong>do</strong>wisku programistycznym, zasadach jegoużytkowania, elementach języka (wraz z przykładami), rodzaju licencji, autorach i kontaktach.Zależnie od implementacji języka oraz jego rodzaju pomoc może być mniej lub bardziej rozwinięta.Dobrze zorganizowanie, obszerne systemy pomocy zawierają często kompendium wiedzy na tematdanego języka programowania.2.5 Etapy kompilacji.Proces przetwarzania kodu źródłowego na plik wykonywalny typu *.exe składa się kilku etapów:etap preprocesingu – jego zadaniem jest wstępne przygotowanie programu <strong>do</strong> właściwej kompilacji.W tej fazie mogą być również <strong>do</strong>łączane <strong>do</strong>datkowe pliki, realizuje się to specjalną instrukcją (np.INCLUDE) umieszczoną na początku kodu źródłowego.Po napotkaniu takiej instrukcji preprocesor wstawi zawartość odpowiedniego pliku. Zazwyczaj wten sposób włącza się <strong>do</strong> kodu źródłowego pliki z deklaracjami funkcji lub informacją o rozmiarachzmiennych indeksowanych.etap kompilator – służy <strong>do</strong> przetłumaczenia kodu źródłowego na kod wynikowy (binarny),zrozumiały dla komputera.23/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>etap konsolidacji (linkowania) – służy <strong>do</strong> <strong>do</strong>łączania bibliotek <strong>do</strong> tworzonego programu. Jeżelidany program używa funkcji z bibliotek, niezbędne jest aby taka biblioteka została <strong>do</strong> tegoprogramu <strong>do</strong>łączona. Biblioteka jest również pewnym „programem”, który różni się tylko tym iżnie może być samodzielnie uruchomiony. Po prostu zawiera on tylko funkcje, <strong>do</strong> których odwołująsię inne programy. Po konsolidacji program jest gotowy <strong>do</strong> użycia.kod źródłowypreprocesorkompilatorkonsolidator (linker)plik wykonywalnyRys. 1. Etapy kompilacji.2.6 Podział języków programowania.Podział ze względu na rodzaj translacji:• kompilowane,• interpretowane.Podział ze względu na strukturę 2 (1):• języki proceduralne (imperatywne) – programista określa JAKIE operacje maja byćwykonane i JAKIEJ KOLEJNOŚCI• języki nie proceduralne (deklaratywne) – programista opisuje to, CO chce wykazać.Decyzja JAK to wykonać należy <strong>do</strong> kompilatora.Podział ze względu na strukturę 3 (2):• języki strukturalne – program rozbity na procedury (podprogramy), z których każdaodpowiada za rozwiązanie określonego problemu. Procedury stanowią wtedy odrębne,samodzielnie działające całości, które możemy wykorzystać także i w innych pisanychprogramach.• języki niestrukturalne – brak wydzielonych obszarów odpowiedzialnych za rozwiązywanieokreślonych problemów.2http://orfi.geo.kortowo.pl/kierunek/przedmioty/wstep/99/jez1.htm3http://orfi.geo.kortowo.pl/kierunek/przedmioty/wstep/99/jez1.htm24/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>Podział języków ze względu na zastosowania 4 :a) algorytmiczne: <strong>do</strong> zapisywania algorytmów• algebraiczne (Fortran, Pascal, C) - <strong>do</strong> zapisu algorytmów numerycznego przetwarzaniainformacji• ekonomiczne (COBOL, PL/1) - opis algorytmów przetwarzania informacji o charakterzeekonomicznym, bankowym, handlowym. Rozbu<strong>do</strong>wane mechanizmy operacji we/wy ipewne możliwości wykonywania operacji na danych nienumerycznych.• <strong>do</strong> symbolicznego przetwarzania informacji (LISP) - <strong>do</strong> zapisu algorytmów przetwarzaniainformacji numerycznych i na danych symbolicznych• języki symulacyjne (SIMULA) - ułatwiają opisywanie algorytmów modelowania isymulacji• bezpośredniego <strong>do</strong>stępu (BASIC) - pozwalają na konwersję z maszyną.b) problemowe - ściśle <strong>do</strong>stosowane <strong>do</strong> konkretnej klasy zadań.Podział według struktury (3):• języki strukturalne (Fortran, Pascal, Algol)• języki zorientowane obiektowo 5 (C++ , Visual C++, Turbo Pascal, Delphi, Smalltalk,Objective-C, Eiffel , Lisp, Oberon, Actor , CLOS, Ada95, Prolog++, Zink, JAVA, J++,Visual Objects, Python):W ostatnich latach w projektowaniu oprogramowania zorientowanego obiektowo wykształcił sięwyraźny podział na:• OOA - Object Oriented Analysis (Analiza Zorientowana Obiektowo)• OOD - Object Oreinted Design (Projektowanie Zorientowane Obiektowo)• OOP - Object Oriented Programming (Programowanie Zorientowane Obiektowo)2.7 Przegląd języków programowania.Asembler – język najbliższy kodu maszynowego. Języki wyższego rzędu często tłumaczą najpierwna asembler, potem na kod maszynowy. Darmowe kompilatory: Flat Assembler, New BasicAssembler. Visual Assembler.BASIC (Begginers All-purpose Symbolic Instruction Code) - przełomowy w chwili powstania w1964, potem mocno krytykowany za brak strukturalności, prosty, interpretowany językprogramowania, spopularyzowany w komputerach ośmiobitowych i kalkulatorachprogramowanych. Jego twórcy – J. Kemeny i T. Kurtz (Dartmouth College, USA) – przedstawili gojako rewolucyjną propozycję wobec języków algolopo<strong>do</strong>bnych. Basic z założenia nadawał się <strong>do</strong>pracy interakcyjnej i miał ujmować prostotą (m. in. brak typów, numerowane instrukcje ułatwiałyredagowanie programu). Pierwsze implementacje Basica były wykonywane na minikomputerach, anawet na komputerach stacjonarnych (m. in. na polskich komputerach ODRA 1204 i ODRA 1305,także w wersji kompilowanej). Oprzyrzą<strong>do</strong>wany w podstawowe operacje plikowe Basic na długostał się nie tylko podstawowym językiem mikrokomputerów, lecz także ich systemem operacyjnym.Mimo przydatności <strong>do</strong> programowania <strong>do</strong>raźnego w małej skali, oryginalny Basic został odrzuconyjako nieprzystosowany <strong>do</strong> nauczania początkowego informatyki i wyparty przez strukturalny językLogo. Odrodzony i zmetamorfozowany zarówno pod względem struktur sterowania i danych, jak i4http://orfi.geo.kortowo.pl/kierunek/przedmioty/wstep/99/jez1.htm52725/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>interfejsu systemowego Basic znajduje szerokie zastosowanie w programowaniu aplikacji dlakomputerów typu PC pod postacią platformy programowania RAD o nazwie VisualBasic. W tymnowoczesnym produkcie z Basica pozostała głównie nazwa.Fortran (FORmula TRANslation - czyli „tłumacz formuł") - jeden z pierwszych szerokoużywanych, algorytmicznych języków programowania, opracowany przez J. Backusa w 1957 roku.Po wielu unowocześnieniach jest stosowany <strong>do</strong> dzisiaj. Język Fortran powstał jako wynikwczesnych <strong>do</strong>świadczeń w programowaniu komputerów za pomocą autokodów z lat 1951-56.Pierwszą implementację Fortranu wykonano dla maszyny IBM-704. W 1958 powstała wersjaFortran <strong>II</strong> wprowadzająca możliwość kompilacji niezależnej (IBM-704), a w 1959 jej odpowiednikdla komputera IBM-709. Kolejna wersja Fortranu nosiła nazwę XTRAN, jej autorzy weszli w składgrupy projektującej język Algol 58. Wersja Fortran IV nosiła już wyraźny wpływ języka Algol.Kolejne implementacje to: Fortran <strong>II</strong>, Fortran IV, Fortran 77, Fortran 90, Fortran 95, Lahey Fortran,Compaq Visual Fortran. W latach sześćdziesiątych XX wieku IBM-owski Fortran spopularyzowałsię na komputerach różnych typów – zaletą jest duży stopień standaryzacji: od PC <strong>do</strong>superkomputerów. Fortran posiada z reguły kompilatory (interpreter o nazwie „Watfive” małopopularny). Główne zastosowanie Fortranu to zastosowania numeryczne (rozbu<strong>do</strong>wane bibliotekiprocedur numerycznych), naukowe i inżynierskie, wymagające programów o dużej szybkościdziałania. Darmowe kompilatory: G77 (VFort, Prospero).APL (A Programming Language) - język wysokiego poziomu, stosowany <strong>do</strong> obliczeń w wyższejmatematyce i zagadnieniach inżynierskich (w USA w śro<strong>do</strong>wisku inżynierów 80% programówbazuje na APL). Cechą charakterystyczną śro<strong>do</strong>wiska APL są specjalne klawiatury z greckimiliterami. Język APL umożliwia wykorzystania komputera jako super-kalkulatora: oferujewielowymiarowe tablice liczb - główne struktury danych.Język J - nowsza wersja APL, nie wymagającą znaków specjalnych na klawiaturze.APL2 - lansowany przez IBM jako interakcyjne narzędzie <strong>do</strong> rozwiązywania problemów,wizualizacji danych i <strong>do</strong>stępu <strong>do</strong> baz danych.Pascal – strukturalny język programowania stworzony w 1971 roku N. Wirth z Politechniki wZurychu jako język przeznaczony <strong>do</strong> nauki programowania. Pozostaje on przez to jednym znajszerzej znanych i popularnych języków, zwłaszcza wśród początkujących programistów.Popularność z<strong>do</strong>był dzięki implementacji TurboPascal (1983) firmy Borland. TP ma wielerozszerzeń, <strong>do</strong>bre zintegrowane śro<strong>do</strong>wisko: edytor, debuger, projekty, <strong>do</strong>skonała pomoc,stosunkowo duża szybkość kompilacji i wykonania, ale bardzo długo ograniczenia pamięci <strong>do</strong> 64K. Istnieje wiele udanych kompilatorów i narzędzi <strong>do</strong> programowania w Pascalu. Siła języka -rozbu<strong>do</strong>wane struktury danych. Typ prosty porządkowy, wyliczeniowy, okrojony, całkowity(shortint, longint, byte), logiczny znakowy (bajt), rzeczywisty (single, <strong>do</strong>uble, extended, comp),łańcuchowy, strukturalny, tablicowy, rekor<strong>do</strong>wy, zbiorowy, plikowy, wskaźnikowy. Darmowekompilatory: Free Pascal, TMTPascal, Inno Pascal, Bloodshed Dev-Pascal, Virtual Pascal, Compas,Ipcute, Irie Pascal.Modula, Modula-2 - wersje języka programowania wysokiego poziomu, będącego pochodnąjęzyka pascal. Język Modula-2 został opracowany przez N. Wirtha w 1980 (pierwszaimplementacja na PDP-11 w 1979). W języku Modula (po<strong>do</strong>bnie jak w nowszych wersjach językaPascal), <strong>do</strong>ceniono znaczenie modularyzacji w bu<strong>do</strong>wie oprogramowania. Poszczególne częściprogramu w tym języku mogą niezależnie opracowywać różne osoby, przy czym istnieje systemkomunikacji między modułami będącymi jednostkami kompilacji. Język pozwala odwoływać siębezpośrednio <strong>do</strong> sprzętu oraz umożliwia programowanie współbieżne. Implementacje języka:26/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>Modula-Prolog - <strong>do</strong> programowania logicznego Modula/R - <strong>do</strong> programowania baz danych.Modula-2 i Modula-3 o orientacji obiektowej.Oberon, Oberon-2 – są to kolejne dwa języki Wirtha, zbliżone <strong>do</strong> języków obiektowych, małoznane.Język C – proceduralny język programowania wysokiego poziomu, zaprojektowany w 1972 przezD. M. Ritchiego i zrealizowany pod systemem operacyjnym UNIX dla komputera PDP-11.Początkowo C był językiem oprogramowania systemowego (powstał jako język <strong>do</strong>przeprogramowania systemu UNIX). Szybko zyskał popularność jako uniwersalny językprogramowania. Cechami języka C są zwięzłość i elastyczność, przy jednoczesnym przerzucaniudużej odpowiedzialności na programistę (nie ma np. wbu<strong>do</strong>wanej kontroli indeksowania tablic).Język C ma duże możliwości, pozwala <strong>do</strong>bierać się <strong>do</strong> rejestrów procesora po<strong>do</strong>bnie jak asembler,łatwo przenosić programy C między różnymi systemami komputerowymi. Struktury danych w C sąprostsze niż w Pascalu. W latach 1983-1988 język C uległ standaryzacji. Znormalizowany język Cnosi nazwę ANSI C. Jest to jeden z najczęściej obecnie używanych języków na PC.Ada - język powstał na zlecenie Departamentu Obrony (DoD) USA, gdyż żaden istniejący języknie spełniał ich wymagań. Wymagania: zmniejszyć koszty oprogramowania, zapewnić bezbłędnośćprogramu (bezpieczeństwo), ułatwić dalszy rozwój oprogramowania (czytelność), stosowaćnaturalne konstrukcje, zapewnić sprawność.Ada 95 - rozszerza wymagania o większe możliwości współpracy z innymi językami, giętkośćkonstrukcji języka (używanie obiektów), kontrolę nad zarządzaniem bazami danych isynchronizacją rozproszonych danych oraz standaryzacją bibliotek oprogramowania. Ada 95 jestpierwszym obiektowo zorientowanym językiem, który przeszedł przez proces standaryzacji. Jestuniwersalnym językiem programowania, nadaje się również <strong>do</strong> programowania w czasierzeczywistym (sterowanie procesami). Pozwala nawet wstawiać fragmenty kodu maszynowego <strong>do</strong>programu. Ada jest językiem bogatym, niełatwo go <strong>do</strong>brze opanować. Przeprowadzone w połowielat 90-tych badania efektywności programowania w C i w Adzie pokazały, ze koszty rozwojuprogramów w C były dwukrotnie wyższe. Składa się na to kiepska czytelność programównapisanych w C i trudności w usuwaniu w nich błędów. Na etapie tworzenia programówzanotowano 70% mniej błędów, a na etapie obsługi klienta aż 90% mniej błędów korzystając z Adyzamiast C. Kompilatory muszą przejść ostre testy zgodności ze standardem. GNAT to darmowykompilator Ady 95. Darmowe kompilatory: Gnat.Forth - ciekawy język, opracowany przez Charlesa Moore około 1970 roku <strong>do</strong> sterowaniaradioteleskopem, początkowo realizacje na 8-bitowych komputerach, 1994 - standard ANSI Forth.Prosty język, programy są niewielkie, efektywne ale mało czytelne. Odwrotna Polska notacja(Reverse Polish Notation, RPN), używaną również w popularnych kalkulatorach Hewletta-Packarda. Np. (3+4)*5 trzeba napisać: 3 4 + 5 * . __35 ok. Programowanie = definiowanie słów zlisty ok. 30 słów bazowych, słowa kompilowane są w całość i <strong>do</strong>dawane <strong>do</strong> listy słów. Hierarchiasłów = program. Wady: mało używany i nie ma chyba szans na rozpowszechnienie. Darmowekompilatory: Forth, Forth CMP, GForth, KForth, PForth, Tile-Forth, WForthLogo – edukacyjny język programowania, biorący początek z badań nad psychologią uczenia się ijego wpływem na kształtowanie osobowości (J. Piaget). Logo stworzone zostało w latach 60-tychprzez Daniela Bobrowa, Wallace'a Feurzeiga oraz Seymura Paperta, profesora informatyki z MIT(język ten został spopularyzowany przez niego w książce, rewolucyjnej z punktu widzeniameto<strong>do</strong>logii nauczania, pt. Burze mózgów – dzieci i komputery - Wydawnictwo Naukowe PWN,1996). Logo "ucieleśnia" wiele idei Piageta <strong>do</strong>tyczących sposobu uczenia się dzieci. Językprogramowania ma umożliwiać łatwy start - już siedmiolatki mogą go używać - a przy tym27/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>stwarzać nieograniczone możliwości w miarę nauki. Sterowanie "żółwiem" na ekranie lubprawdziwym robotem: "DOPRZODU 10" (FORWARD 10) lub "WPRAWO 90" (RIGHT 90).Logo jest stosowane w początkowym nauczaniu matematyki oraz jako język komunikacji dziecka zkomputerem; odznacza się interakcyjnością, znakomicie przemyślanym, prostym zestawem operacjigraficznych i ogólnością składni wzorowanej na języku Lisp. W Polsce język Logo jest powszechnyod połowy lat osiemdziesiątych XX w. Ze względu na swoje szczególne zastosowanie słownikjęzyka Logo ma liczne realizacje naro<strong>do</strong>we, w szczególności z użyciem wyrazów polskich, np. ACLogo, lub Logo Komeniusz (pracujące w systemie Win<strong>do</strong>ws). Darmowe kompilatory: MSW Logo,Visual Logo, Berceley Logo, Elica, Geomland, rLogo, NetLogo, StarLogo, TinyLogo.Cobol (COmmon Business Oriented Language) - uniwersalny język programowania <strong>do</strong>zastosowań gospodarczych, głównie <strong>do</strong> zagadnień finansowych, dla banków, mniejadministracyjnych (brak bazy danych). Bardzo wielu programistów i wielkie na nichzapotrzebowanie, gdyż problem roku 2000 - głównie z powodu programów napisanych w Cobolu.Język wywodzi się z USA z końca lat pięćdziesiątych. Raport pierwotny o języku Cobol z 1961 (G.Hopper), ulepszany <strong>do</strong> 1965, kolejne wersje <strong>do</strong> 1973. Proces normalizacji języka Cobol podjęto w1963. Język Cobol umożliwia przetwarzanie tabel, sekwencyjny i bezpośredni <strong>do</strong>stęp <strong>do</strong> danych,sortowanie i indeksowanie, generowanie raportów, segmentowanie programu i stosowaniebibliotek. Charakterystyczną cechą tego języka jest rozwlekła notacja (konstrukcje zbliżone <strong>do</strong>naturalnego opisu problemu w języku angielskim, auto<strong>do</strong>kumentacja). Programy długie ale łatwozrozumiałe. Rozbu<strong>do</strong>wane struktury danych, np. rozgałęzione typu drzewa, rekordy. W Coboluwykonano olbrzymie ilości oprogramowania przetwarzania danych użytkowanego <strong>do</strong> dzisiaj.Ostatni standard ISO/ANSI wprowadzony w 1985 roku. The Cobol Foundation dba o rozwójjęzyka. Istnieją <strong>do</strong>bre kompilatory na PC, również darmowe. Śro<strong>do</strong>wiska <strong>do</strong> bu<strong>do</strong>wania graficznegointerfejsu użytkownika i śro<strong>do</strong>wiska 4 generacji. Darmowe kompilatory: Fujitsu Cobol, Tiny Cobol,Cobol 650, GNU Cobol2c.PL/I – język opracowany w 1964 roku, stanowi połączenie Fortranu i Algolu z COBOLem.Rozbu<strong>do</strong>wane i niezależne od sprzętu typy danych, dynamiczna alokacja pamięci, prawie 200wbu<strong>do</strong>wanych operacji na zmiennych numerycznych i tekstowych, <strong>do</strong>bra komunikacja zurządzeniami zewnętrznymi. Nigdy nie z<strong>do</strong>był większej popularności.LISP (LISt Processing) – język programowania oparty na przetwarzaniu list. Główny wkład w jegopowstanie w latach 50. wniósł J. McCarthy, profesor wielu amerykańskich uczelni, m.in. InstytutuTechnologicznego Massachusetts i Uniwersytetu Stanforda. Wywodzi się z badań teoretycznychnad tzw. rachunkiem lambda i stał się podstawowym językiem sztucznej inteligencji. Prowadzeniedialogu w języku naturalnym, programy diagnostyki medycznej, systemy algebry symbolicznej.Język aplikatywny: wszystkie konstrukcje LISPu są wynikiem zastosowania funkcji <strong>do</strong>argumentów. Np. wyrażenie x^2+y wymaga funkcji plus i times: (plus (times x x) y). Rekurencja,programy jak i dane są listami, programy mogą zmieniać siebie. Wiele implementacji: CommonLISP (1984), rozszerzenia, np. CLOS, CLIM, Iterate i Screamer.PROLOG (PROgraming in LOGic) – język programowania używany w logice (stąd jego nazwabędąca akronimem słów). Rozwijany od początku lat 70-tych, Marsylia, Edynburg. Łatwiejszy niżLISP, reprezentacja logiczna wiedzy, analiza języka naturalnego. Wbu<strong>do</strong>wana baza danych,rekurencja. Dobre realizacje na PC, np. TurboProlog (Borland). Liczne rozszerzenia, Prolog <strong>II</strong>,Prolog <strong>II</strong>I, Prolog ++ (obiektowy), Visual Prolog. Używany <strong>do</strong> bu<strong>do</strong>wy powłok systemówekspertowych (Expert system shells) - wystarczy wpisać wiedzę by prowadzić rozumowania.KEE - Knowledge Engineering Environment, czyli Śro<strong>do</strong>wisko Inżynierii Wiedzy. LOOKS -system reprezentacji wiedzy <strong>do</strong> projektowania systemów <strong>do</strong>radczych korzystających zprogramowania logicznego; POP (Package for On-Line Programming, czyli pakiet programowania28/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>interakcyjnego) i nowsze wersje: POP-11, POP++, POPLER, POPLOG (śro<strong>do</strong>wisko), PopTalk <strong>do</strong>programowania systemów <strong>do</strong>radczych. Autoprogramowanie i języki naturalne: <strong>do</strong> prostychzastosowań, np. raportów z baz danych.The Last One - język autoprogramowania, napisany już w1982 roku ...Smalltalk - uniwerslany język obiektowy, dla potrzeb muzyki, gier komputerowych, inteligentnychbaz danych, programów dla robotów, przetwarzania sygnałów z oscyloskopu, zarządzaniacentralami telefonicznymi (USA), systemami kolejkowania na dużych instalacjach komputerowych,testowania półprzewodników i oceny kosztów produkcji samochodów, zastosowania w systemachinformacyjnych dla potrzeb biznesu. Sporo udanych implementacji, darmowy kompilator GNUSmalltalk. Darmowe kompilatory: Dolphin, Squeak.Eiffel – język obiektowy, <strong>do</strong>bry <strong>do</strong> treningu metod konstrukcji oprogramowania i <strong>do</strong> nauczaniaprogramowania. Darmowe kompilatory: Eiffel.C++ - najczęściej stosowany język obiektowy - nie jest to język czysto obiektowy, ma pewneograniczenia. Ogromne rozbu<strong>do</strong>wanie i trudne <strong>do</strong> opanowania śro<strong>do</strong>wiska, pełne bardzo rzadkoużywanych obiektów. Wiele udanych realizacji: Borland C++ Builder, śro<strong>do</strong>wisko 4GL dla C++.Darmowe kompilatory: Bloodshed C++, Borland C++ Builder, LCC Win, Mars.Visual C++ - Warsztat Programisty (Visual Workbench) - śro<strong>do</strong>wisko obiektowe <strong>do</strong> tworzeniaprogramów, pozwalające na edycję, kompilację i śledzenie błędów w opracowywanym programie;Studio Aplikacji (AppStudio) - <strong>do</strong> bu<strong>do</strong>wania graficznego systemu dialogu z użytkownikiem iedycji programów; Czarodziej Aplikacji (AppWizard) - szybkie "składanie" obiektów znajdującychsię w bibliotece i tworzenie szkieletu programu; Czarodziej Klas (ClassWizard) - śledzeniewykonywania programu i modyfikację obiektów.SQL – popularny język <strong>do</strong> zarządzania bazami danych. Bazy danych zawierają własne języki, np.:Oracle, Ingres, Informix, Para<strong>do</strong>x, dBase, Sybase, FoxPro, MS Access.HTML (HyperText Markup Language) – specjalny język służący <strong>do</strong> opisu strony oraz odniesieńz poszczególnych jej elementów <strong>do</strong> innych <strong>do</strong>kumentów. Język ten powstał na potrzebyinternetowej usługi WWW. Umożliwia umieszczenie na stronie tekstu zdefiniowanych dyrektyw co<strong>do</strong> sposobu jego prezentacji, wyróżnienia pewnych jego elementów edytorskich jak akapity,nagłówki itp. Pozwala także umieszczać bezpośrednio na opisywanych stronach grafikę, a wnajnowszych wersjach również inne typy <strong>do</strong>kumentów. Pewne zdefiniowane przez autora stronyelementy (np. fragmenty tekstu) mogą <strong>do</strong>datkowo wskazywać na inne <strong>do</strong>kumenty. Wskazanie takieodbywa się przez zdefiniowanie tzw. URL jednoznacznie określającego <strong>do</strong>kument w obrębieodpowiedniej przestrzeni (np. w lokalnej kartotece lub w sieci Internet). Technikę tą określa sięmianem hipertekstu. Strony napisane tym języku są interpretowane przez przeglądarkę WWW takąjak np. Netscape Navigator lub Internet Explorer. HTML jest stale rozwijany, a kolejne jego wersjewzbogacane są o nowe możliwości. Pliki zawierające strony napisane w języku HTMLcharakteryzują się rozszerzeniem “.html” bądź “.htm”.DHTML - (z angielskiego Dynamic HTML), rozszerzenie języka HTML o wzorce stylu (stylesheets), rozmieszczanie elementów na stronie WWW według upo<strong>do</strong>bań użytkownika (contentpositioning) oraz możliwość stosowania indywidualnych krojów pisma, sprowadzanych zkomputera macierzystego danej strony WWW (<strong>do</strong>wnloadable fonts).Java - popularny język programowania obiektowego autorstwa J. Goslinga, zaprojektowany wfirmie Sun Microsystems, używany szeroko <strong>do</strong> oprogramowywania specjalizowanychmikroprocesorów, wzbogacania prezentacji danych zawartych w <strong>do</strong>kumentach HTML,29/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>pamiętanych w komputerach sieci Internet oraz <strong>do</strong> opracowywania samodzielnych aplikacjiwielowątkowych i rozproszonych. Kompilatory języka Java produkują bajtokod, który nadaje się <strong>do</strong>interpretacji w śro<strong>do</strong>wisku JVM. Znaczenie języka Java systematycznie rośnie.30/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>3 Elementy języków programowania.Języki programowania wymyślono po to, by można było dzięki nim tworzyć różnorodne programykomputerowe. Oczekuje się również, że tworzone aplikacje będą wykonywać swoje zadania wsposób jednoznaczny i zgodny z określoną na etapie projektowania specyfikacją wymagań - językiprogramowania muszą się więc opierać na ogólnie obowiązujących zasadach logiki i arytmetyki. Ztego też względu, można wyodrębnić w strukturach różnych języków szereg elementówuniwersalnych, spełniających w nich analogiczną rolę.3.1 Podstawowe cechy języków programowania 6 :• Ściśle określony zbiór znaków i symboli. Używanie znaków nie<strong>do</strong>zwolonych spowodujewystąpienie błędów podczas translacji kodu źródłowego. Zakres znaków obejmuje duże imałe litery alfabetu (rozróżniane bądź nie), cyfry oraz znaki specjalne i symbolewieloznakowe. Mimo, że wiele języków programowania posiada po<strong>do</strong>bny zestaw znaków<strong>do</strong>puszczalnych, niektóre z nich mogą mieć zupełnie inne znaczenie. Przykładem może byćznak „//” - w FORTRANIE służący <strong>do</strong> łączenia łańcuchów tekstowych, zaś w PASCALU<strong>do</strong> oznaczenia wiersza komentarza.FortranPascalA B C D E F G H I J K L M N O P Q R S T U V W X Y Za b c d e f g h i j k l m n o p q r s t u v w x y z1 2 3 4 5 6 7 8 9 0+ - / * . , = ( ) : _ + - * / = ^ < > ( ) [ ] { } . , : ; ‘ # $ @ spacja _.LT. .LE. .EQ. .NE. .GE. .GT. .AND. .OR. := = .. (. .) (* *).NOT. .EQV. .NEQV.Tab. 1. Zestaw znaków i symboli <strong>do</strong>puszczalnych w językach Fortran oraz Pascal.• Skończona (zazwyczaj) liczba słów kluczowych i deklaratorów. Słowa kluczowe są tookreślone zbiory znaków posiadające konkretne znaczenie dla translatora (najczęściej są towyrazy z języka angielskiego, np. WRITE, READ, PROGRAM, FOR, DO, itd.).FortranPascalassign endfile parameter and if repeatbackspace entry pause array implementation setblock data equivalence print asm in shlcall err program begin inherited shrcharacter external read case inline stringclose file real const interface thencommon format return constructor label tocomplex function rewind destructor mod typecontinue goto save div nil unitdata if single <strong>do</strong> not untildimension implicit status <strong>do</strong>wnto object uses<strong>do</strong> integer stop else of var<strong>do</strong>uble precision inquire subroutine end or whileelse intrinsic then file packed withelseif iostat unit for procedure xorend logical write function programendif open goto recordTab. 2. Zestaw słów kluczowych występujących w językach Fortran oraz Pascal.6Poniższy rozdział <strong>do</strong>tyczy języków najbardziej przydatnych z punktu widzenia inżyniera nie-informatyka, takich jak:FORTRAN, PASCAL czy BASIC.31/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>Bardzo często edytory kodu źródłowego stosują wyróżnienia dla słów kluczowych(pogrubienie czcionki lub kolory), co ułatwia jego pisanie i zmniejsza praw<strong>do</strong>po<strong>do</strong>bieństwowystąpienia błędu. W przypadku braku automatycznego wyróżnienia należy stosować duże imałe litery, np. instrukcje pisać dużymi literami, a inne nazwy małymi. Nazwy takie jak SIN,COS, LOG, MOD, itd. nie są słowami kluczowymi lecz nazwami funkcji wewnętrznych.Oprócz słów kluczowych w językach programowania występują również deklaratory, czylisłowa odpowiadające za określanie obiektów lub ich właściwości.• Ściśle określona struktura i zasady pisania kodu źródłowego. Kod źródłowy składa się zprzynajmniej jednego modułu (programu), który musi mieć sztywno określoną bu<strong>do</strong>wę.Moduł musi posiadać wyraźnie określony początek i koniec, obszary deklaracji obiektów itypów występujących zmiennych oraz obszary zawierające bloki instrukcji, funkcji lubprocedur. Bu<strong>do</strong>wa kodu źródłowego zależy w decydujący sposób od rodzaju języka isposobu realizacji drogi punktu sterowania.FortranPascalUżywanie jedynie znaków <strong>do</strong>puszczalnychUżywanie jedynie znaków <strong>do</strong>puszczalnychBrak rozróżnienia znaków pisanych małą lub wielką Brak rozróżnienia znaków pisanych małą lub wielkąliterą.literą.Znaków naro<strong>do</strong>wych nie należy używać (nawet w Znaków naro<strong>do</strong>wych nie należy używać (nawet wkomentarzach).komentarzach).Nazwy (identyfikatory) zmiennych, stałych, Nazwy (identyfikatory) zmiennych, stałych,podprogramów, funkcji, itd. powinny zaczynać się od podprogramów, funkcji, itd. powinny zaczynać się odlitery i nie powinny być dłuższe niż 6 znaków (słowa litery – długość <strong>do</strong>wolna.kluczowe mają bu<strong>do</strong>wę identyfikatorów, ale mogą byćdłuższe).Treść instrukcji wpisuje się między 7 a 72 kolumną. Treść instrukcji wpisuje się w <strong>do</strong>wolnej kolumnie.Nie ma obowiązku zaczynania od 7 kolumny. Znaki za72 kolumną są ignorowane.Odstępy umieszczane w instrukcjach są ignorowane. Odstępy w kodzie (spacje) są ignorowane. Dlatego teżDlatego też nie ma różnicy pomiędzy np. instrukcją nie ma różnicy pomiędzy zapisem np. x:=4 a x := 4.GOTO 10 a GO TO 10.W celu zwiększenia czytelności programu należy W celu zwiększenia czytelności programu należystosować wcięcia – szczególnie podczas stosowania stosować wcięcia – szczególnie podczas stosowaniainstrukcji zagnieżdżonych.instrukcji zagnieżdżonych.W jednym wierszu może znaj<strong>do</strong>wać się tylko jedna W jednym wierszu może znaj<strong>do</strong>wać się kilka instrukcji,instrukcja (polecenie wykonujące jakiś fragment np. if x=1 then y:=1 else y:=0;algorytmu programu).Instrukcje przypisania realizowane są za pomocą Instrukcje przypisania realizowane są za pomocą znakuznaku „=”.„;=”.Na końcu wiersza nie stawia się żadnego znaku. Na końcu wiersza stawia się zazwyczaj średnik.Poszczególne bloki programu zaczynają się i kończą w Poszczególne bloki programu zaczynają się i kończą wsposób <strong>do</strong>wolny.sposób <strong>do</strong>wolny, ale muszą być umieszczone międzysłowami BEGIN i END.Główny blok programu rozpoczyna się słowem Główny blok programu rozpoczyna się słowemPROGRAM z nazwą, a kończy słowem END. Po PROGRAM z nazwą, a kończy słowem END z kropkąEND nie stawia się kropki.na końcu.Warunki arytmetyczne i logiczne określane są Warunki arytmetyczne określane są znakiem „=”.znakami literowymi (patrz punkt 1).Jedna instrukcja może zajmować maksymalnie 20wierszy, przy czym pierwszy wiersz nazywa sięwierszem początkowym, a pozostałe wierszamikontynuacji. Każdy wiersz kontynuacji należyzaznaczyć poprzez umieszczenie w szóstej kolumnieznaku różnego od zera i spacji.W programie należy umieszczać komentarze. Są tofragmenty programu, które są ignorowane przezkompilator i służą jedynie <strong>do</strong> orientacji dla32/64Jedna instrukcja może zajmować <strong>do</strong>wolną liczbęwierszy.W programie należy umieszczać komentarze. Blokkomentarza zaznacza się nawiasem klamrowym{ komentarz }. Pojedyncze wiersze komentarza można


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>programisty. Wiersz komentarza zaczyna się znakiem* lub C w pierwszej kolumnie – dalej mogą być<strong>do</strong>wolne znaki. Komentarz można również <strong>do</strong>dać nakońcu linii, w której znajdują się instrukcje – należywówczas postawić znak !. Wiersze z samymi spacjamitraktowane są jak wiersze komentarzy.W kolumnach 1-5 można wpisywać tzw. etykiety –niepowtarzalny ciąg cyfr (<strong>do</strong> 5 cyfr) – identyfikująceokreślone miejsce w programie.Numery etykiet powinny być nadawane w odstępach –standar<strong>do</strong>wo co 10 – daje to możliwość <strong>do</strong>pisanianowych etykiet pomiędzy już istniejące.W programie najpierw umieszcza się deklaracje, a<strong>do</strong>piero po nich instrukcje.Deklaracja zmiennych: typ nazwaZmienne są lokalne, tzn. obowiązują w obszarzejednego modułu. Wymiana wartości jest możliwapoprzez stosowanie określonych instrukcji.Podczas pisania programu należy dążyć <strong>do</strong>zminimalizowania liczby zmiennych.Podczas pisania programu należy dbać o jegoprzejrzystość - dlatego też zalecane jest używaniepodprogramów i funkcji.zaczynać od znaku //.Brak etykiet (istnieje możliwość przypisywania etykietinstrukcją LABEL).–W programie najpierw umieszcza się deklaracje, a<strong>do</strong>piero po nich instrukcje.Deklaracja zmiennych: nazwa : typ;Zmienne mogą być lokalne lub globalne. Zależy to odmiejsca deklaracji zmiennej (PRIVATE lub PUBLIC).Podczas pisania programu należy dążyć <strong>do</strong>zminimalizowania liczby zmiennych.Podczas pisania programu należy dbać o jegoprzejrzystość - dlatego też zalecane jest używaniepodprogramów i funkcji.Tab. 3. Zasady pisania kodu źródłowego w językach Fortran oraz Pascal.• Występowanie zasady jednoznaczności identyfikatorów w obrębie jednego projektu.Identyfikatory są to nazwy programów, modułów, bloków, podprogramów, procedur,funkcji i zmiennych. Ponieważ działanie każdego programu oparte jest na pewnychlogicznych zasadach, nie może <strong>do</strong>chodzić <strong>do</strong> sytuacji, w których translator nie wie o jakimoduł, funkcję czy procedurę chodzi. Większość języków programowania kontroluje,przynajmniej w podstawowym zakresie, nazwy poszczególnych struktur i zgłasza błędy opowtarzających się nazwach lub ich błędnej bu<strong>do</strong>wie. Po<strong>do</strong>bnie jest z nazwami zmiennych,istnieje jednak możliwość deklarowania takich samych nazw w obszarach różnychpodprogramów, funkcji lub procedur (tzw. zmienne lokalne) – może to jednak prowadzić <strong>do</strong>wystąpienia niejasności i w konsekwencji błędów.FortranPrzykłady:PascalPrzykłady:program Silnia - poprawnieprogram Kalkulator; - poprawnieprogram Write - błędnieprogram Public; - błędnieinteger n, krok - poprawnien, krok : byte; - poprawniereal program, sin - błędnieprogram, sin : real; - błędnieprocedure read - błędnieprocedure open; - błędnieTab. 4. Przykłady poprawnego i błędnego deklarowania nazw w językach Fortran oraz Pascal.• Konieczność komunikacji z użytkownikiem. Potrzeba taka <strong>do</strong>tyczy również innychurządzeń komputera, a także zapisu i odczytu danych z plików. Czynności takie nazywanesą operacjami wejścia-wyjścia. Standar<strong>do</strong>wo <strong>do</strong> komunikacji z użytkownikiem służyklawiatura (ewentualnie myszka) i monitor. Pobieranie danych z klawiatury (lub pliku)wymaga wcześniejszego zadeklarowania typu zmiennej (chyba, że istnieje możliwośćniejawnej deklaracji typu) - wprowadzany typ będzie wówczas jednoznaczny i zgodny zoczekiwaniami. Podczas wyprowadzania danych na monitor (lub <strong>do</strong> pliku) należy ustalić ichformat (wygląd). Podczas zapisu (odczytu) danych <strong>do</strong> pliku należy <strong>do</strong>datkowo określićrodzaj pliku.33/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>• Potrzeba sterowania formatem (wyglądem) zmiennych. Formatowanie jest <strong>do</strong>konywanepodczas wyprowadzania wartości danych na ekran monitora lub podczas zapisu <strong>do</strong> plików.Formatowanie zmiennych nie zawsze jest konieczne (każdy język programowania posiada<strong>do</strong>myślne sposoby zapisu poszczególnych typów zmiennych) ale może być bardzoprzydatne – można zażądać, aby wszystkie liczby miały tą samą ilość znaków i byłyzapisane np. w postaci wykładniczej o określonej liczbie cyfr po przecinku.• Konieczność jawnego lub niejawnego deklarowania typów zmiennych. Rozróżnia się typcałkowity, rzeczywisty, zespolony, tekstowy, logiczny i inne. Zależnie od języka,poszczególne typy mogą mieć wiele odmian. Oprócz typów prostych, wiele językówumożliwia tworzenie własnych typów lub struktur danych o bardziej złożonej bu<strong>do</strong>wie.Odpowiednie <strong>do</strong>branie typów zmiennych pozwala zaoszczędzić pamięć operacyjną orazskrócić czas wykonywania obliczeń. Często istnieje konieczność konwersji typów, czylizamiany zawartości jednego typu na inny. Należy pamiętać, że nie każdy rodzaj konwersjijest możliwy (przykła<strong>do</strong>wo: nie da się zamienić łańcucha liter na liczbę) i że nie zawszekonwersja jest <strong>do</strong>kładna (np. podczas konwersji zmiennej rzeczywistej na całkowitą traci sięczęść ułamkową). Konwersję wykorzystuje się między innymi podczas używania kodówASC<strong>II</strong> (często stosowane w FORTANIE), wyprowadzania danych na ekran monitora(OBJECT PAASCAL) lub <strong>do</strong>stosowywania <strong>do</strong> innych standardów danych (np. konwersjatypów STRING i PCHAR w języku OBJECT PASCAL).Nazwa typu Zakres min. Zakres max. Bajty DokładnośćFortranINTEGER - 2.147483648 + 2.147483647 4 -REAL - 3.4028235 . 10 38 + 3.4028235 . 10 38 4 6-7DOUBLE - 1.797693134862316 . 10 308 + 1.797693134862316 . 10 308 8 15-16PRECISIONCOMPEX Wartość typu COMPEX jest uporządkowaną parą liczb typu REAL.DOUBLE Typ DOUBLE COMPEX jest uporządkowaną parą liczb typu DOUBLE PRECISION.COMPEXLOGICAL TRUE lub FALSE 4 -CHARACTER 0 znaków 256 znaków 1 na -znakPascalINTEGER - 32768 + 32767 2 -SHORTINT - 128 + 128 1 -LONGINT - 2147483648 + 2147483647 4 -BYTE 0 255 1 -REAL - 2.9 . 10 39 + 1.7 . 10 38 6 11-12SINGLE - 1.5 . 10 45 + 3.4 . 10 38 4 7-8DOUBLE - 5.0 . 10 324 + 1.7 . 10 308 8 15-16EXTENDED - 1.9 . 10 4951 + 1.1 . 10 4932 10 19-20COMP 0 + 9.2 . 10 18 8 19-20BOOLEAN TRUE lub FALSE 4 -STRING 0 znaków 256 znaków 1 na -znakTab. 5. Typy występujących zmiennych oraz ich zakresy w językach Fortran oraz Pascal.• Potrzeba wymiany danych między różnymi modułami (podprogramami, funkcjami iprocedurami). Sposób wymiany danych (wartości zmiennych) zależy w dużej mierze o<strong>do</strong>rganizacji i struktury konkretnego języka programowania. Podstawowe metody to:34/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>• deklarowanie wspólnych bloków pamięci,• deklarowanie wspólnych adresów pamięci,• deklarowanie bloków zawierających zbiory zmiennych (ła<strong>do</strong>wanych następnie <strong>do</strong>wybranych podprogramów, procedur lub funkcji),• przenoszenie wartości zmiennych w nagłówkach nazw procedur i funkcji,• podział zmiennych na zmienne lokalne i publiczne,• ła<strong>do</strong>wanie pliku wejściowego,• wykorzystanie plików (zapis i odczyt).• Potrzeba wykonywania działań na zmiennych. Rozróżnia się trzy podstawowe rodzajezmiennych: liczbowe, tekstowe i logiczne, przy czym każda grupa wymaga innegopodejścia. Zdarza się, że języki programowania (szczególnie starsze) są ukierunkowane najeden rodzaj danych. Działania na zmiennych wymagają stosowania operatorów, relacji,wyrażeń, instrukcji, funkcji lub procedur.• Potrzeba wykonywania działań na plikach. Bardzo często programy komputerowe odczytująpewne dane z plików, przekształcają je lub na ich podstawie obliczają nowe dane, anastępnie zapisują wyniki <strong>do</strong> pliku. Język programowania powinien nie tylko umożliwiaćzapis i odczyt, ale także wykonywanie podstawowych działań na plikach (tworzenie,kasowanie, przenoszenie czy zmiana nazwy). Zależnie od rodzaju języka i jegoimplementacji możliwości w tym zakresie są bardzo zróżnicowane.• Potrzeba komunikacji z systemem operacyjnym. Przydatnym elementem językaprogramowania jest możliwość korzystania w funkcji systemu operacyjnego. Jest tozazwyczaj możliwe na dwa sposoby:• język posiada własne instrukcję odpowiadające poleceniom systemu operacyjnego(ale i tak przeważnie w jakiś sposób z nich korzysta),• język posiada mechanizm wywoływania poleceń systemowych i ich parametrów.Cecha ta w znacznym stopniu rozszerza możliwości języka programowania, dającnowe sposoby realizacji zadań.• Potrzeba zarządzania pamięcią operacyjną komputera. Istnieją dwa podstawowe rodzajezarządzania pamięcią: statyczne i dynamiczne. Zarządzanie statyczne polega na ścisłymprzydzielaniu zmiennym określonej ilości pamięci operacyjnej (identyfikowanej tzw.adresami), przy czym ilość ta zależna jest od zadeklarowanego typu zmiennej. Ilośćprzydzielonej pamięci nie może się już zmienić – wskutek czego nie można np.zadeklarować tablicy o nieznanym z góry rozmiarze. Zarządzanie dynamiczne nie posiadatakich ograniczeń, a pamięć operacyjna przydzielana jest automatycznie, w zależności odpotrzeb. Zarządzanie dynamiczne umożliwia ponadto swobodne zwalnianie zajmowanejwcześniej pamięci. Zarządzanie pamięcią odnosi się nie tylko <strong>do</strong> zmiennych, ale i innychobiektów, np. formularzy, list, plików graficznych, wideo, itd.• Potrzeba obsługi błędów (wyjątków). Jest to konieczne ze względu na dwa podstawoweczynniki: niemożność przewidzenia wszystkich działań użytkownika oraz możliwośćwystąpienia awaryjnych stanów pracy komputera (np. uszkodzenie pliku, nośnika danych,systemu operacyjnego).35/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>3.2 Zmienne i stałe.Zmienna - jest to symboliczna nazwa komórki w pamięci operacyjnej komputera i służy <strong>do</strong> zapisuwartości liczbowej, tekstowej, logicznej, itd. Zmienne są podstawowym elementem algorytmuobliczeniowego. W czasie działania programu wartości przypisane zmiennym mogą się <strong>do</strong>wolniezmieniać, zależnie od wykonywanych operacji. Zmienne są rozróżniane po nazwach, czyli tzw.identyfikatorach. Nadanie wartości zmiennym odbywa się poprzez instrukcję przypisania –bezpośrednio podczas deklaracji typu lub później (zależy to od języka programowania).Zmienna indeksowana – zmienna zawierająca nie jedną wartość lecz cały ich zbiór.W przypadku zmiennych indeksowanych oprócz deklaracji typu należy podać jej wymiar. Służy <strong>do</strong>zapisywania list, wektorów i tablic. Maksymalna ilość wymiarów zmiennej indeksowanej jestzależna od języka programowania.Stała – jest to symboliczna nazwa komórki w pamięci operacyjnej komputera i również służy <strong>do</strong>zapisu określonej wartości. Różnica pomiędzy zmienną a stałą jest taka, że wartości stałej niemożna zmienić podczas wykonywania obliczeń. Deklaracja stałej i nadanie wartości realizuje sięodpowiednią instrukcją.Podstawowy podział zmiennych i stałych:a) ze względu na typ:• zespolone,• rzeczywiste,• całkowite,• logiczne,• walutowe,• daty lub czasu,• tekstowe.b) ze względu na sposób deklaracji:• deklarowane jawnie,• deklarowane niejawnie.c) ze względu na <strong>do</strong>kładność (<strong>do</strong>tyczy zmiennych zespolonych i rzeczywistych):• o pojedynczej precyzji,• o podwójnej precyzji.d) ze względu na strukturę:• prosty,• indeksowany (wektory i tablice).e) ze względu na ilość zajmowanej pamięci:• o określonej ilości bajtów (1, 2, 4, 6, 8 lub 10 bajtów),• o <strong>do</strong>wolnej ilości bajtów.36/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>f) ze względu na sposób przydziału pamięci:• statyczne,• dynamiczne.3.3 Wyrażenia.Rozróżnia się następujące rodzaje wyrażeń:a) arytmetyczne – służą <strong>do</strong> obliczania wartości zmiennych liczbowych na podstawie wzorówmatematycznych. W wyrażeniach arytmetycznych mogą wystąpić następujące elementy:• stałe arytmetyczne,• odwołania <strong>do</strong> zmiennych,• odwołania <strong>do</strong> elementów tablic,• wywołania funkcji wewnętrznych i zewnętrznych.Wyrażenia realizowane są przy pomocy operatorów (znaków <strong>do</strong>dawania, odejmowania, mnożenia,dzielenia i potęgowania) oraz funkcji (wewnętrznych i zewnętrznych). Podczas tworzenia wyrażeńarytmetycznych należy zwrócić uwagę na typ wyniku, szczególnie w przypadku, gdy w wyrażeniubiorą udział zmienne różnych typów.Operatory arytmetyczneFortran Pascal BASIC C+++ - * / ** + - * / ** div mod shl shr + - * / (**) + - / * % ++ -- >Tab. 6. Rodzaje operatorów arytmetycznych w językach Fortran G77, Pascal, BASIC i C++.Generalnie panuje zasada, że typ wyniku będzie zgodny z najbardziej <strong>do</strong>kładnym typem zmiennej,wg kolejności: zmienne zespolone, zmienne rzeczywiste o podwyższonej <strong>do</strong>kładności, zmiennerzeczywiste o standar<strong>do</strong>wej <strong>do</strong>kładności, zmienne całkowite.Kolejność wykonywania operacji zależy od priorytetu operatora, wg kolejności: potęgowanie,mnożenie i dzielenie oraz <strong>do</strong>dawanie i odejmowanie. Kolejność wykonywania działań można<strong>do</strong>wolnie zmienić stosując nawiasy.b) Tekstowe – służą <strong>do</strong> wykonywania działań na zmiennych tekstowych. Elementami wyrażeńtekstowych są:• stałe i zmienne tekstowe,• podłańcuchy,• wywołania funkcji tekstowych.Funkcje tekstowe służą <strong>do</strong> przetwarzania zmiennych tekstowych (np. tworzenie podłańcuchów)oraz <strong>do</strong> zbierania określonych informacji (np. określanie długości łańcucha, położenia określonegoznaku w łańcuchu, itp.)c) relacji – służą <strong>do</strong> porównania wartości dwóch wyrażeń arytmetycznych lub logicznych.Dostępne operatory relacji to znaki:• mniejsze niż,• mniejsze lub równe,37/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>• równe,• nierówne,• większe lub równe,• większe niż.Operatory relacji mogą być zapisywane symbolami matematycznymi lub tekstowymi w zależnościod języka programowania. Często zdarza się, że operator relacji nie pokrywa się z operatoremprzypisania - poniżej przedstawiony jest przykład:F77 F90/95 PASCAL BASICoperator przypisania = = := =operator relacji – równe .EQ. = = =Tab. 7. Operatory przypisania w językach Fortran, Pascal oraz BASIC.d) logiczne – służą <strong>do</strong> wyznaczania wartości logicznej typu PRAWDA lub FAŁSZ.Elementami wyrażenia logicznego są:• stałe i zmienne logiczne,• elementy tablic logicznych,• wywołania funkcji logicznych,• wyrażenia relacji.Najczęściej stosowane operatory logiczne to:• negacja,• koniunkcja,• alternatywa,• tożsamość,• nie tożsamość.Podane operatory zostały uporządkowane według priorytetów, czyli kolejności w jakiejwykonywane są operacje podczas wyznaczania wartości wyrażenia logicznego. Argumentyoperatorów logicznych muszą być typu logicznego. Kiedy dwa następujące po sobie w wyrażeniuoperatory mają równe priorytety, to najpierw wykonywana jest operacja stojąca z lewej strony.Operator negacji poprzedza argument, pozostałe operatory wymagają podania dwóch argumentóww porządku (operator w środku).A B negacja koniunkcja alternatywa tożsamość nie tożsamość(zmienna A)1 1 0 1 1 1 01 0 0 0 1 0 10 1 1 0 1 0 10 0 1 0 0 1 0Tab. 8. Tabela wyrażeń logicznych.Jeżeli w jakimś wyrażeniu występują jednocześnie operatory arytmetyczne, relacji i logiczne, tokolejność wykonywania działań jest następująca:• operacje arytmetyczne,• operacje relacji,• operacje logiczne.38/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>3.4 Instrukcje.Instrukcje są jednym z najbardziej podstawowych elementów języka programowania. Podstawoweinstrukcje, występujące w wielu językach programowania (np. FORTRAN, PASCAL, BASIC) to:a) instrukcje czynne:• instrukcja przypisania,• instrukcje sterujące:• instrukcja skoku,• instrukcja zatrzymania,• instrukcja wstrzymania,• instrukcja końca,• instrukcja powrotu,• instrukcja warunkowa,• instrukcja wyboru,• instrukcje powtórzeń (pętli),• instrukcje wejścia-wyjścia,b) instrukcje bierne:• specyfikacje segmentów i ich wejść,• specyfikacje cech obiektów,• specyfikacje formatu danych,• instrukcje funkcji i procedur,• instrukcje inicjowania danych.Instrukcje czynne związane są bezpośrednio z tokiem obliczeń i wpływają na wartościposzczególnych zmiennych. Instrukcje bierne są elementami pomocniczymi, służącymi <strong>do</strong>organizacji kodu źródłowego i określenia ogólnych właściwości poszczególnych obiektów.Instrukcja przypisania – zwana inaczej instrukcją podstawienia, pozwala nadawać zmiennymokreśloną wartość. Instrukcja przypisania ma postać:zmienna = wyrażeniegdzie zmienna oznacza zmienną prostą lub element tablicy, zaś wyrażenie jest <strong>do</strong>wolną wartościąliczbową, logiczną lub tekstową (w zależności od typu zmiennej) lub odpowiednio wzoremmatematycznym, funkcją tekstową lub zwrotem logicznym. Zależnie od języka programowania,jako symbol przypisania stosuje się znak „=” (np. FORTRAN, BASIC),„:=” (np. PASCAL) lub też wyrażenie słowne. W wyniku zastosowania instrukcji przypisaniazmienia się bezpowrotnie wartość lewej strony zależności, elementy strony prawej nie ulegajązmianie. Tworząc instrukcję przypisania pamiętać należy o odpowiednim <strong>do</strong>borze typów ikonsekwencjach ich mieszania.Warto podkreślić, że instrukcja przypisania nie jest tożsama ze wzorem matematycznym, stądmożliwe są podstawienia typu i = i+1, fałszywe z punktu widzenia matematyki, ale poprawne iczęsto stosowane w językach programowania.Instrukcja skoku – służy <strong>do</strong> przeniesienia punktu sterowania w inne, wcześniej zdefiniowane,miejsce programu. Instrukcja skoku nie jest zalecana przez teoretyków programowania,jednak często znacznie ułatwia realizację algorytmu. Instrukcja skoku ma ogólną postać logiczną:39/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>IDŹ DO nazwa miejscagdzie nazwa miejsca musi być już jednoznacznie zdeklarowana: może to być etykieta (FORTRAN)lub nazwa (PASCAL).Instrukcja zatrzymania – służy <strong>do</strong> bezwarunkowego zakończenia wykonywanego programu.Instrukcja często spotykana w blokach podejmowania decyzji, uruchamiana gdy nie są spełnionewarunki <strong>do</strong> wykonywania dalszych działań.Instrukcja wstrzymania – służy <strong>do</strong> chwilowego zatrzymania wykonywania programu. Kontynuacjamoże być podjęta wskutek działania użytkownika bądź też po upływie określonego czasu.Instrukcja powrotu – służy <strong>do</strong> wyjścia z podprogramu, procedury, funkcji lub też <strong>do</strong> wskazaniaponownego wykonania pętli.Instrukcja końca – służy <strong>do</strong> określenia końca programu, procedury, funkcji, bloku deklaracji,bloku instrukcji bądź bloku inicjacji danych.Instrukcje warunkowe – służą <strong>do</strong> określania dalszego toku postępowania (podejmowania decyzji)w zależności od postawionych warunków. Typową instrukcją warunkową jest instrukcja JEŻELI(IF) o następującej bu<strong>do</strong>wie logicznej:lubJEŻELI warunek TO instrukcjaJEŻELI warunek1 TO instrukcja1 W INNYCH PRZYPADKACH instrukcja2gdzie warunek jest <strong>do</strong>wolnym wyrażeniem arytmetycznym, relacją lub wyrażeniem logicznym, ainstrukcja <strong>do</strong>wolnym blokiem poleceń, wykonywanym gdy warunek jest prawdziwy. Częstozachodzi konieczność rozważenia większej liczby możliwości, wówczas stosuje się innąkonstrukcję logiczną:JEŻELI warunek1 TO instrukcja1JEŻELI ZAŚ warunek2 TO instrukcja2JEŻELI ZAŚ warunek3 TO instrukcja3……W INNYCH PRZYPADKACH instrukcjaNZależnie od języka programowania bu<strong>do</strong>wa instrukcji warunkowych może być nieco inna, mogą teżwystępować odmiany instrukcji. Tworząc instrukcję warunkową należy uwzględnić wszystkiemożliwe przypadki – zaniedbanie może spowo<strong>do</strong>wać błędne działanie programu lub też jegozawieszenie.Inną typową instrukcją warunkową, występującą w wielu językach programowania, jest instrukcjawyboru (CASE) o ogólnej postaci logicznej:WYBIERZ ZALEŻNIE OD WARTOŚCI zmiennaJEŻELI (lista przypadków 1) TO instrukcja1JEŻELI (lista przypadków 2) TO instrukcja2JEŻELI (lista przypadków 3) TO instrukcja3...DOMYŚLNIE instrukcjaN40/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>gdzie zmienna jest identyfikatorem zmiennej, zaś lista przypadków zawiera oczekiwane wartości,dla których mają być wykonane odpowiednie instrukcje. W instrukcji wyboru występuje częstomożliwość określenia wartości <strong>do</strong>myślnej - instrukcjaN, dla przypadku,gdy wartość zmiennej nie należy <strong>do</strong> żadnej wymienionej wyżej listy przypadków. Konkretnarealizacja instrukcji wyboru zależy od składni użytego języka programowania.Instrukcje powtórzeń (pętle) – służą <strong>do</strong> wielokrotnego wykonania tego samego bloku instrukcji.Rozróżnia się dwa podstawowe typy instrukcji powtórzeń:a) o znanej z góry liczbie powtórzeń:• realizowane „od <strong>do</strong>łu”,• realizowane „od góry”,b) o nieznanej z góry liczbie powtórzeń:• z warunkiem „na początku”,• z warunkiem „na końcu”.Ogólna postać logiczna pętli o znanej liczbie powtórzeń wygląda następująco:POWTARZAJ OD wartość1 DO wartość2instrukcjegdzie wartość1 i wartość2 są liczbami typu całkowitego, a instrukcje <strong>do</strong>wolnym zestawem poleceń.Zestaw poleceń musi posiadać wskazanie początku i końca bloku. Czasami możliwe jest równieżokreślenie kroku przyrostu – licznik pętli nie musi bowiem wzrastać lub maleć zawsze o 1.Ogólna postać logiczna pętli o nieznanej liczbie powtórzeń z warunkiem na początku wyglądanastępująco (tzw. warunek WHILE w PASCALU):JEŻELI warunek= prawda WYKONAJ instrukcje I POWRÓĆ= fałsz WYJDŹ Z PĘTLINależy podkreślić, że w przypadku, gdy warunek jest od razu fałszywy blok instrukcje nie zostaniewykonany ani razu.Ogólna postać logiczna pętli o nieznanej liczbie powtórzeń z warunkiem na końcu wyglądanastępująco (tzw. warunek REPEAT-UNTIL w PASCALU):WYKONAJ instrukcje I JEŻELI warunek= prawda WYJDŹ Z PĘTLI= fałsz POWRÓĆW tym przypadku blok instrukcje wykonany zostanie przynajmniej raz.Konkretna struktura i bu<strong>do</strong>wa pętli zależy od użytego języka programowania.Instrukcje wejścia-wyjścia – służą <strong>do</strong> przesyłania danych pomiędzy różnymi elementamikomputera, takimi jak monitor, klawiatura, drukarka czy plik. Dla informacji wysyłanych<strong>do</strong>myślnym urządzeniem jest monitor, zaś dla informacji wczytywanych: klawiatura. Przesyłane41/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>informacje składają się z rekordów. Rekord jest to elementarna porcja informacji, jaka może byćprzesyłana pomiędzy urządzeniami zewnętrznymi a pamięcią operacyjną.W przypadku monitora i klawiatury pojedynczy rekord odpowiada wierszowi znaków na ekraniemonitora, w przypadku drukarki wierszowi poleceń.Proces wprowadzania i wyprowadzania danych może być ograniczony <strong>do</strong> jednej tylko zmiennej,lub może być bardziej rozbu<strong>do</strong>wany – służą <strong>do</strong> tego celu tzw. listy wejścia i wyjścia. Lista zawieraspis zmiennych, którym mają być przypisywane wprowadzane wartości według ich kolejności.Ważne jest, aby wartości wprowadzane odpowiadały zadeklarowanym typom zmiennych i abyliczba wprowadzonych wartości była zgodna z liczbą elementów listy. Składnikami listy mogą byćzmienne proste, elementy tablic, łańcuchy znakowe oraz nazwy tablic (oznacza to przesłaniewszystkich elementów tej tablicy).W przypadku korzystania z plików należy określić rodzaj pliku oraz wskazać, że to on będzie„odbiorcą” lub „dawcą” informacji.Rozróżnia się dwa podstawowe rodzaje plików:o <strong>do</strong>stępie sekwencyjnym. Pliki o <strong>do</strong>stępie sekwencyjnym oferują odczyt elementów pliku „odpoczątku”. W takim przypadku, aby odczytać n-ty element pliku, należy najpierw odczytaćwszystkie elementy go poprzedzające. Pliki o <strong>do</strong>stępie sekwencyjnym są wygodne w przypadkuzapisu i odczytu zmiennych indeksowanych (wektorów lub tablic), w których i tak trzeba przejśćprzez wszystkie indeksy. Pliki takie nie nadają się natomiast <strong>do</strong> zapisu i odczytu informacjiprzetwarzanych „na wyrywki” – jest to co prawda możliwe, ale dużo wolniejsze niż w przypadkukorzystania z plików o <strong>do</strong>stępie swobodnym.o <strong>do</strong>stępie swobodnym. Pliki o <strong>do</strong>stępie swobodnym składają się z ponumerowanych rekordów,umożliwiających bezpośredni zapis i odczyt w <strong>do</strong>wolnym rekordzie(bez konieczności odczytu rekordów poprzedzających). Są bardzo przydatne <strong>do</strong> przetwarzaniadanych o strukturze baz danych.Oba typy plików umożliwiają zapis od początku (jeżeli w pliku były jakieś dane, to zostaną oneskasowane) lub też kontynuację zapisu w miejscu końca pliku.Specyfikacje segmentów i ich wejść – służą <strong>do</strong> wyodrębniania określonych bloków instrukcji ipoleceń stanowiących pewną logiczną całość. Segmentem może być podprogram, procedura lubfunkcja. Segmenty mogą być wywoływane w głównym bloku programu lub też w innychsegmentach (co zależy często od odpowiedniej deklaracji).Podprogram (moduł) – samodzielny fragment programu, posiadający zazwyczaj bu<strong>do</strong>wę po<strong>do</strong>bną<strong>do</strong> segmentu głównego: zawiera oznaczenie początku i końca, obszar deklaracji typów, blokiinstrukcji, itd. Podprogram może być wywoływany w segmencie głównym lub w innychpodprogramach. W całym programie może być zazwyczaj tylko jeden podprogram o określonejnazwie, zaś ilość podprogramów jest nieograniczona. Ogólna bu<strong>do</strong>wa logiczna podprogramu jestnastępująca:POCZĄTEK BLOKU segment…instrukcjeinstrukcjeWYWOŁAJ PODPROGRAM nazwainstrukcjeinstrukcje42/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>…KONIEC BLOKU segmentPODPROGRAM nazwa…instrukcje…KONIEC PORPROGRAMU nazwagdzie segment oznacza główny segment programu lub inny podprogram, instrukcje – <strong>do</strong>wolnyzestaw poleceń i instrukcji, nazwa – identyfikator podprogramu.Procedura – element po<strong>do</strong>bny <strong>do</strong> podprogramu, stanowiący jego rozszerzenie dla językówsterowanych zdarzeniami w systemie. Ogólna postać logiczna procedury sterowanej zdarzeniemjest następująca:PROCEDURA nazwa JEŻELI zdarzenie…instrukcje…KONIEC PROCEDURY nazwagdzie nazwa jest identyfikatorem procedury, instrukcje - <strong>do</strong>wolnym zestawem poleceń i instrukcji,zaś zdarzenie – <strong>do</strong>wolnym, ale konkretnie określonym zdarzeniem w systemie. Procedury niemuszą być sterowane zdarzeniami - spełniają wówczas rolę podprogramów i mogą byćwywoływane z <strong>do</strong>wolnego miejsca programu (jeżeli mają status „publiczny”),lub też w obrębie bieżącego modułu (jeżeli mają status „prywatny”). W nagłówku procedury możebyć zawarta lista przekazywanych zmiennych. Nie jest to zazwyczaj konieczne i zależy od woliprogramisty.Zdarzenie – <strong>do</strong>wolne działanie wykonane przez program lub użytkownika (zdarzeniem może byćnp. kliknięcie myszką, naciśnięcie klawisza, wybór elementu menu, najechanie kursorem naelement formularza, aktywacja lub zamknięcie formularza, itd.).Funkcja – jest to również samodzielny segment programu. W odróżnieniu od podprogramu lubprocedury, funkcja wykonuje konkretne działania na zdefiniowanych wcześniej zmiennych i zwracawynik. Funkcja wymaga zazwyczaj przekazania listy zmiennych o określonych typach. Ogólnapostać logiczna funkcji jest następująca:FUNKCJA nazwa (lista zmiennych)…instrukcje…KONIEC FUNKCJI nazwagdzie nazwa jest identyfikatorem funkcji, instrukcje - <strong>do</strong>wolnym zestawem poleceń i instrukcji, zaślista zmiennych – uporządkowanym zbiorem nazw zmiennych, niezbędnych <strong>do</strong> obliczenia funkcji.W funkcjach mogą być wykorzystane zmienne liczbowe, tekstowe, walutowe lub typu data i czas.Specyfikacje cech obiektów – służą <strong>do</strong> określenia pewnych właściwości zmiennych, procedur lubfunkcji. Zazwyczaj jest to rodzaj definiowanego obiektu (zmienna czy stała), rozmiar zmiennejindeksowanej, obszar obowiązywania (obiekt „publiczny” czy „lokalny”), zasady organizacji43/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>pamięci, itd. Zależnie od języka programowania, jego możliwości w zakresie definicji cechobiektów mogą być bardzo zróżnicowane.Specyfikacje formatu danych – służą <strong>do</strong> określania wyglądu zmiennych podczas wyprowadzanialub wprowadzania danych. Procesowi formatowania podlegają najczęściej następujące elementy:całkowita liczba zajmowanych znaków. Określa liczbę możliwych <strong>do</strong> wykorzystania przezkonkretną zmienną znaków (na ekranie monitora lub w pliku). W przypadku gdy liczba znaków jestkrótsza od zadeklarowanej, pozostałe znaki uzupełniane są spacjami (z przodu lub na końcu). Wprzypadku zaś, gdy liczba znaków jest dłuższa, znaki ostatnie są obcinane lub też zgłaszany jestbłąd wejścia-wyjścia. Symbole takie jak spacja, znak wartości liczby (plus-minus) czy separatordziesiętny zajmują jeden znak.- 1 2 6 8 8 . 7 7 1 2 52 2P O N I E D Z I A Ł E K1 2 0 0 0 4 7 6 . 1 6 7 7 7 7 7liczba cyfr po przecinku (dla liczb rzeczywistych). Należy pamiętać, że zmiana formatu nie wpływana zapisaną w pamięci komputera, bieżącą wartość danej ani też na jej <strong>do</strong>kładność. Przykładformatu zmiennej o wartości 1234,56789:1 2 3 4 . 5 6 7 8 91 2 3 4 . 5 6 7 8 9 0 0 01 2 3 4 . 5 6 81 2 3 4• znak separatora dziesiętnego (dla liczb rzeczywistych) – przecinek lub kropka. Znakseparatora może być definiowany w języku programowania lub też może być zmienianypoprzez zastosowanie własnoręcznie napisanej funkcji.• postać danej (dla liczb rzeczywistych). Dostępne możliwości to postać prosta lubwykładnicza. W postaci wykładniczej można zazwyczaj określić całkowitą liczbę znakóworaz ilość cyfr wykładnika. Przykład formatu zmiennej o wartości 1234,56789 w postaciwykładniczej:. 1 2 3 4 5 7 E + 0 0 41 2 3 4 . 5 6 7 8 9 0 0 E + 0 4• sposób interpretacji znaku wartości liczby. Domyślnie liczby <strong>do</strong>datnie nie posiadająpodczas wyświetlania na monitor (lub zapisu <strong>do</strong> pliku) znaku „+”, można to jednakzmienić w większości języków programowania.•• sposób interpretacji spacji (<strong>do</strong>tyczy wprowadzania danych). Określa, czy podczaswprowadzania wartości liczbowych, znak spacji ma być ignorowany czy też nie.•• sposób zapisu czasu i daty. W przypadku czasu określa <strong>do</strong>kładność wyświetlania,(godzina, minuta, sekunda), zaś w przypadku daty określa kolejność składników orazsposób wyświetlania roku (dwie lub cztery cyfry).44/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>Instrukcje funkcji i procedur – są tworzone przez programistę i służą <strong>do</strong> realizacji jednostkowychzadań algorytmu programu.Instrukcje inicjowania danych – służą <strong>do</strong> nadawania początkowych wartości zmiennych. Nadająsię szczególnie <strong>do</strong> określania wartości wektorów i tablic - jest to zazwyczaj znacznie wygodniejszei szybsze niż indywidualne przypisywanie wartości każdemu elementowi zmiennej indeksowanej.3.5 Wyjątki.Wyjątki są to różne błędy, mogące pojawić się podczas działania programu. Przykładem może byćdzielenie przez zero lub wprowadzenie nieodpowiedniego typu danej. Program zgłosi wówczas błądi przestanie działać (czasem nawet zawiesi komputer). Aby tego uniknąć konieczne jestzastosowanie odpowiednich środków zaradczych. Można to uzyskać na kilka sposobów:poprzez stosowanie obsługi wyjątków. Niektóre języki posiadają specjalne instrukcje pozwalającena kontrolę i eliminację błędów. Ogólna struktura logiczna obsługi błędów jest następująca:lubWYKONAJinstrukcjeA JEŚLI SIĘ COŚ NIE UDAinstrukcjeKONIECWYKONAJinstrukcjeA JEŚLI SIĘ COŚ NIE UDAGDY błąd1 TO instrukcja1GDY błąd2 TO instrukcja2GDY błąd3 TO instrukcja3...KONIECZależnie od języka programowania i jego implementacji obsługa błędów może <strong>do</strong>tyczyć <strong>do</strong>wolnejinstrukcji w programie lub też wybranego zbioru instrukcji (np. tylko instrukcje wejścia-wyjścia).Pozostałe fragmenty programu muszą być wówczas zabezpieczane inaczej.poprzez tworzenie własnych procedur wprowadzania danych. Proces wprowadzania danych możnatak zorganizować, że program nie przyjmie żadnej innej wartości niż prawidłowa. Poprzezodpowiednie stosowanie instrukcji warunkowych można określić <strong>do</strong>puszczalny typ danej orazzakres jej wartości. W każdym innym przypadku program wyświetli komunikat o błędzie i poprosio ponowne wprowadzenie danej. Taki system nie spowoduje przerwania pracy programu.poprzez stosowanie tzw. masek wprowadzania. Maska wprowadzania jest to pewien wzór, wedługktórego mają być wprowadzane dane. W takim przypadku nie da się wprowadzić danych o innymwzorze niż zadeklarowany. Maski wprowadzania występują jedynie w aplikacjach posiadającychformularze.45/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>4 Styl programowania.Jedną z podstawowych zasad obowiązujących podczas pisania programów jest czytelność iprzejrzystość kodów źródłowych. Dobrze napisany kod umożliwi innym programistom(a często i autorowi) późniejsze ich zrozumienie i usprawnienie. Jest to bardzo ważne gdyż raczejrzadko zdarza się napisać od razu program w wersji ostatecznej, nie wymagającej poprawek iusprawnień. Najczęściej dzieje się wręcz odwrotnie – tworzy się mały program a następnienieustannie go ulepsza.Istnieje pewna ilość zaleceń i schematów, których przestrzeganie wpłynie na poprawność stylupisanego kodu źródłowego. Należy jednak pamiętać, że najważniejszy jest efekt działania programu(a nie sam program) i w uzasadnionych przypadkach możne <strong>do</strong>jść <strong>do</strong> pewnych odstępstw odprzyjętych reguł.Oto kilka cech uważanych za takie, które charakteryzują <strong>do</strong>bry program:• poprawność (zgodność z wymogami użytkownika),• niezawodność (<strong>do</strong>bre dane wejściowe -> <strong>do</strong>bre wyniki),• przenośność (łatwość instalacji na różnych komputerach),• łatwość konserwacji (Prosto napisany program łatwo przystosować <strong>do</strong> różnych warunkówpracy),• czytelność (Prostota jest jedną z najważniejszych cech <strong>do</strong>brych programów),• prawidłowe wykorzystanie zasobów (pamięci, dyski, itp.), szybkość.4.1 Elementy stylu programowaniaStyl programowania jest często indywidualną sprawą programisty, ale powinien też spełniać pewnereguły ogóle. Dotyczą one następujących spraw 7 :• nazwy zmiennych w programie,• wielkości stałe,• liczba zmiennych globalnych, <strong>do</strong>stępnych wszędzie w programie,• deklaracje typów zmiennych,• komentarze,• puste linie, odstępy poziome, akapity, wcięcia, itd.• podział na sekcje, podprogramy,• uniwersalność i standaryzacja modułów,• funkcjonalność i wygoda użytkowników,• formułowanie celów,• złożoność systemu.Nazwy zmiennych. Wybór nazw zmiennych ma pomóc w zrozumieniu ich znaczenia izastosowania. Najlepiej jest używać nazw, które coś oznaczają, powiadamiając tym samymużytkownika (intencjonalnie) o możliwościach funkcji czy procedury, czy też wskazując senszmiennych, itd. Z reguły języki programowania nie narzucają nazewnictwa zmiennych. Nazwymożna tworzyć opierając się na typach zmiennych (np. wszystkie zmienne liczb zespolonych mogąmieć nazwę zaczynającą się od „ZESP_”), obszarach obowiązywania (np. zmienne obowiązujące wcałym programie zaczynają się od „GLOBAL_”, a obowiązujące w podprogramie, procedurze lub7http://tytan.umcs.lublin.pl/~baran/tut/99/ww1.htm46/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>funkcji od „LOCAL_”) lub ich funkcjach (np. zmienne sterujące są inaczej nazywane niż zmienneobliczeniowe, itd.). Dobrze jest stosować rzeczowniki dla oznaczania nazw wszelkich danych,czasowniki dla funkcji i procedur (rozkazy, np. dziel, <strong>do</strong>daj itp), przymiotniki dla zmiennychlogicznych (w Pascalu boolean). Generalnie można tworzyć <strong>do</strong>wolne, byle przejrzyste, zasadynazywania zmiennych – ważne jest jedynie aby te zasady przestrzegać. Zbyt długie nazwy możnazastąpić ich skrótami (np. zamiast temperaturamaksymalna – tempmax lub temp_max, itp.).Jeżeli translator nie rozróżnia małych i dużych liter, powinno się pisać duże litery na początkukażdego słowa (np. nazwa maksymalnatemperaturaroczna jest mniej przejrzysta niżMaksymalnaTemperaturaRoczna). Tworzone skróty powinny być standar<strong>do</strong>we dla danej instytucjilub dziedziny. Do skracania <strong>do</strong>brze nadają się poniższe reguły:• skraca się każde znaczące słowo w nazwie,• pierwsza litera musi wystąpić,• spółgłoski są ważniejsze od samogłosek,• początek słowa jest ważniejszy niż koniec,• tworzy się skróty na 6 <strong>do</strong> 15 liter.Z reguł tych wynika następujący algorytm: usuwa się od końca najpierw samogłoski potemspółgłoski, oprócz pierwszej litery, aż <strong>do</strong> osiągnięci pożądanej długości.Porządkowanie list zmiennych wg alfabetu znacznie ułatwia ich odszukiwanie i określenie typu.Wielkości stałe. Z wyjątkiem zera, jedynki i może jeszcze kilku innych stałych, nie należy wprostużywać stałych w całej treści programu, w jego wnętrzu. Najlepiej zadeklarować (zgłosić) je wczęści opisowej, specjalnie <strong>do</strong> tego przeznaczonej, np. za pomocą słowa Pascala const. Zmianasprzętu często powoduje idące za nią zmiany przybliżonych wartości różnych stałych. Ile czasuzmarnujemy wyszukując w programie miejsca, w których występuje stała zapisana jako liczbazmiennoprzecinkowa z <strong>do</strong>kładnością <strong>do</strong> 9 miejsc znaczących by zamienić ją na liczbę o 12miejscach znaczących. Nie używajmy gołych stałych!Powiedzmy, że w programie używamy tablicy, której rozmiar 100 zgłosiliśmy kilkakrotnie piszącmiędzy innymi ciąg znaków [1..100]. Załóżmy, że zmienimy wymiar 100 wszędzie, automatycznie,za pomocą edytora tekstu, na 200, a przy okazji, całkiem nieświa<strong>do</strong>mie, zamienimy temperaturęjakiegoś procesu też na 200, ale stopni. Co się wtedy stanie?Zmienne globalne. Należy minimalizować liczbę zmiennych globalnych, <strong>do</strong>stępnych z całegoprogramu. Zmiany w procedurach czy funkcjach, których jest wiele w programach, są zmianamilokalnymi. Często zapominamy przy nich o zmiennych globalnych. W ten sposób łatwo o błędy.Deklaracje typów zmiennych. Wszystko, co tylko się da, należy umieszczać w deklaracjach typu,włączając w to podzakresy, definicje tablic oraz rekordów.Komentarze. Są to teksty nie podlegające translacji, służące <strong>do</strong> opisu kodu źródłowego. Mają onemówić jak rozumieć program, ale nie opisywać drugi raz tego co wynika z kodu (np. komentarz„tutaj pod zmienną x podstawiamy 7”, uczyniony w miejscu x: = 7 jest niepoprawny). Powinnyzawierać logiczny sens zastosowania danej sekwencji instrukcji, o ile nie jest on oczywisty podczaslektury samego kodu (nadmiar komentarzy może też zatracić przejrzystość samego kodu!).Najczęściej objaśnia się ważniejsze pętle, skoki, sprawdzanie warunków, itp. Komentarze musząbyć przynajmniej równie czytelne jak kod, powinny poprawiać czytelność kodu, dlatego powinnymieć tę samą szerokość wcięcia co kod, a mogą też być wyróżnione znakami specjalnymi,ramkami, itp.47/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>Na początku programu powinien znaleźć się komentarz wstępny, zawierający:• opis działania programu,• sposób użycia - jak wywołać program,• listę i opis ważniejszych zmiennych,• opis plików WE/WY,• nazwy używanych podprogramów,• nazwy wszelkich specjalnych metod, które zostały użyte, wraz ze wskazaniem, gdzie możnaznaleźć dalsze informacje,• informacje o czasie działania (jeśli ma to znaczenie),• wymagania sprzętowe i systemowe,• opis specjalnych poleceń dla operatora / użytkownika,• informacje o autorach i kontaktach,• datę napisania (ew. datę ostatniej modyfikacji lub numer wersji).W długich programach warto stosować przewodniki, czyli rodzaj spisu treści podającego nazwę,miejsce i funkcje każdego modułu.Puste linie. Oddzielają poszczególne fragmenty programu ułatwiając późniejsze ich poszukiwanie.Puste linie (jedna, dwie) POWINNY! oddzielać różne fragmenty programu i podprogramy.Odstępy poziome (spacje). Zwiększają czytelność kodu, w szczególności zaś wyrażeńarytmetycznych, list parametrów i in.Wcięcia. Odzwierciedlają wzajemne powiązania instrukcji i grup instrukcji, uzewnętrzniająlogiczną strukturę programu (lub danych).Akapity. Akapitów używamy w instrukcjach złożonych. Należy <strong>do</strong> <strong>do</strong>brego tonu podpatrzenie jakradzą sobie z tym inni. Decydując się na jakiś styl trzymajmy się go zawsze. Nie mieszajmyróżnych stylów. Programy tracą wtedy na czytelności. Z czasem praktyka pokaże, że trzymanie sięjednego stylu opłaca się. Tymczasem należy się <strong>do</strong> tego przyzwyczajać.Numeracja linii (w językach których to <strong>do</strong>tyczy). Numeracja powinna być prowadzona co 10, abymożna było zawsze coś wstawić w środek.Przenoszenie słów. Nie jest zalecane. Jeżeli już jest to konieczne, to linia powinna się kończyć tak,by było widać, że logicznie nie jest zakończona i że jej kontynuacja musi następować dalej (np. wwyrażeniach arytmetycznych ostatni w linii powinien być operator,a nie operand).Rozmieszczenie instrukcji. Jest jednym z najważniejszych elementów stylu. Powinny one być odsiebie odseparowane (ale nie za bardzo), najlepiej gdy będzie jedna instrukcja w linii.Nawiasy. Używanie nawiasów jest bardzo zalecane, szczególnie przy długich wyrażeniacharytmetycznych. W takim przypadku błędna formuła obliczeniowa (brak lub złe miejsce wstawienianawiasu) może być przyczyną trudnych <strong>do</strong> wykrycia błędów.Sekcje. W przypadku dużych programów należy je dzielić na elementy według następującychzasad:• algorytm programu należy dzielić na pojedyncze zadania o ściśle określonym celu. Uwagaprogramisty skupia się wówczas na konkretnym problemie, nie związanym bezpośrednio z48/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>resztą programu, zmniejsza to znacznie praw<strong>do</strong>po<strong>do</strong>bieństwo popełnienia błędu.Poszczególne segmenty mogą być oddzielnie testowane, co ułatwia wyszukiwanie iusuwanie błędów w całym programie. W przypadku dużych programów, poszczególnemoduły mogą być ponadto pisane przez różnych programistów.• segmenty powinny być uniwersalne. Oznacza to, że należy je tak bu<strong>do</strong>wać,aby dało się je wykorzystać w innych programach. Jest to szczególnie przydatne, gdyprogramista tworzy aplikacje z określonej dziedziny i często musi rozwiązywać po<strong>do</strong>bneproblemy. Korzystanie z gotowych i przetestowanych segmentów może znacznieprzyspieszyć i ułatwić pracę.• każdy segment powinien realizować swoje zadania niezależnie od innych segmentów.• konkretne zadanie powinno być w programie rozwiązane tylko raz. Jeżeli to tylko możliwenie należy mieszać i powielać zadań z różnych segmentów – może to znacznie utrudnićznaj<strong>do</strong>wanie błędów: nie wia<strong>do</strong>mo bowiem który segment jest odpowiedzialny za powstaniebłędu.• należy dążyć <strong>do</strong> tego, aby jak najwięcej użytych w programie zmiennych miało zasięglokalny (czyli obowiązywały w obrębie podprogramów, procedur i funkcji). Znaczniełatwiej jest wówczas kontrolować zawartość zmiennych, a przypadkowa i nieprzewidzianazmiana ich wartości jest mniej praw<strong>do</strong>po<strong>do</strong>bna.Uniwersalność. Można ją osiągnąć przez stosowanie:• parametryzacji,• używanie standar<strong>do</strong>wych bibliotek,• standaryzację postaci wejścia-wyjścia,• stosowanie standardów stylu.Parametryzacja. Oznacza niezależność od konkretnego zestawu danych, może być osiągnięta przezparametryzację. Pozwala to na łatwe i szybkie zmiany w programie, dlatego najczęściej używaneparametry to:• wymiary tablic i list;• dane specjalne, np. stopa procentowa, podatkowa;• desygnatory urządzeń WE/WY (też ścieżki <strong>do</strong>stępu i nazwy plików).By zmienić program bez parametryzacji trzeba ręcznie pozmieniać wszystkie wystąpienia danejwartości, ale można łatwo coś przeoczyć lub zmienić coś, co ma taką samą wartość, ale odnosi się<strong>do</strong> innej zmiennej.Używanie standar<strong>do</strong>wych bibliotek, funkcji i procedur. Są to elementy już zoptymalizowane iprzetestowane, przez co zapewniają lepszą efektywność i mniejsze praw<strong>do</strong>po<strong>do</strong>bieństwowystąpienia błędu. Oszczędność na czasie ko<strong>do</strong>wania też jest olbrzymia.Standaryzacja postaci WE/WY – musi być szczegółowo zaprojektowana przed ko<strong>do</strong>waniem.Najlepszy jest naturalny i jednorodny układ zmiennych i formatów.Standardy stylu. Standard stylu jest to zbiór określonych zasad pisania programów. Standardy mogąbyć narzucone z góry lub mogą być tworzone indywidualnie. Mają tę zaletę, że zmniejsza sięmożliwość nieporozumienia, jeżeli robi się tę samą rzecz za każdym razem tak samo. Potrzebny jest49/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>tylko niewielki wysiłek, by przestrzegać standardów stylu. Standardy mogą ograniczać przyszłyrozwój i postęp, być zbyt krępujące lub nieporęczne. Dobre standardy nie posiadają tych cech (leczi tak istnieją rzadkie przypadki, w których można nie zastosować się <strong>do</strong> standardu). Instytucjanarzucając standardy stylu sprawia, że powstające tam programy będą jej własnością, a nieposzczególnych programistów.Funkcjonalność i wygowa użytkowników. Jest obecnie popularnym hasłem zawartym w pojęciu"User friendly program". Oznacza to, że użytkownik programu (operator) powinien miećmożliwość korzystania z programu w sposób naturalny, bez specjalnego przygotowania. Programpowinien przewidywać zadania użytkownika i służyć mu podpowiedziami i pomocą, nie<strong>do</strong>puszczając jednocześnie <strong>do</strong> wywołania błędu użytkownika.Formułowanie celów. Musi się <strong>do</strong>konać na początku projektowania (różne cele mogą byćkonfliktowe, np.: duża niezawodność, <strong>do</strong>trzymanie terminów, minimalny koszt lub czas produkcji,efektywność w użyciu pamięci / szybkości, możliwość późniejszej modyfikacji, uniwersalność,prostota / łatwość obsługi i konserwacji. Podstawową zasadą obowiązującą podczas formułowaniacelów jest zasada „skromności”: "Skromny, działający program jest bardziej użyteczny niż programimponujący, ale nie<strong>do</strong>kończony."Złożoność. Złożoność wpływa na trudności w testowaniu, uruchamianiu i konserwacji. Mniejzłożony produkt znacznie łatwiej opanować. Ograniczenie złożoności osiąga się dzięki dzieleniuprogramu na moduły i projektowaniu zstępującemu, co zmniejsza liczbę poziomów rozumienia.Moduły zmniejszają liczbę możliwych dróg w programie (więc łatwiej <strong>do</strong>konywać zmian niewpływających na inne elementy programu) oraz izolują błędy wewnątrz modułu.4.2 Metody testowania programów.Stosowanie „testu kolegi” - nieczytelnych programów można uniknąć przez wprowadzeniewymogu złożenia pod <strong>do</strong>kumentacją podpisu programisty i jakiejś drugiej osoby, która przeczytałaprogram i zrozumiała go.50/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>5 Algorytmy.Algorytm - <strong>do</strong>kładny przepis podający sposób rozwiązania określonego zadania w skończonejliczbie kroków; zbiór poleceń odnoszących się <strong>do</strong> pewnych obiektów, ze wskazaniem porządku, wjakim mają być realizowane. Nabrał znaczenia z rozwojem informatyki, gdzie opisuje logiczny ciągoperacji, które ma wykonać program. Algorytmy charakteryzują się możliwością wyrażania ich wróżnych językach i przez skończoną liczbę symboli, bez odwoływania się <strong>do</strong> analogii, a takżefaktyczną wykonalnością i możliwością wielokrotnej realizacji. Termin algorytm wywodzi się odzlatynizowanej formy (Algorismus, Algorithmus) nazwiska matematyka arabskiego z IX w: Al-Chuwarizmiego 8 .Algorytm zapisany przy pomocy języka programowania jest programem.5.1 Rodzaje algorytmów.Według typu przetwarzanych danych:• algorytmy numeryczne, operujące na liczbach (np. algorytm Euklidesa);• nienumeryczne, operujące na obiektach innych niż liczby (np. sortowanie <strong>do</strong>kumentów).Według sposobu wykonywania 9 :• iteracyjne – rodzaj algorytmu i programu, w których wielokrotnie wykonuje się pewneinstrukcje, <strong>do</strong>póki nie zostanie spełniony określony warunek;• rekurencyjne – takie procedury, które w swojej definicji posiadają wywołanie samej siebie;• sekwencyjne – algorytmy, w których instrukcje wykonywane są w porządku,w jakim zostały wprowadzone;• niesekwencyjne (równoległe, współbieżne) – algorytmy, w których następstwo międzypewnymi operacjami nie jest określone.5.2 Rodzaje zapisu algorytmów.Istnieje kilka różnych sposobów zapisu algorytmów, zależnie od ich charakteru i przeznaczenia 10 :• Algorytm opisany obrazkami - występuje szeroko w instrukcjach opisujących sposóbmontażu zabawek dla dzieci (np. klocki LEGO), modeli <strong>do</strong> sklejania, instrukcjach obsługi(np. telewizora, magnetowidu, lodówki).• Algorytm opisany słownie - występuje we wszystkich instrukcjach obsługi, sprzętu<strong>do</strong>mowego, aparatury naukowej, na lekcjach wielu przedmiotów w postaci opisu<strong>do</strong>świadczenia i w informatyce jako element poprzedzający właściwe programowanie.• Algorytm opisany schematem blokowym - występuje głównie w nauczaniu elementówinformatyki i służy <strong>do</strong> graficznego prezentowania i rozwiązywania problemu, powinien byćpoprzedzony opisem słownym. Schemat blokowy stanowi <strong>do</strong>skonałą bazę <strong>do</strong> stworzenieprogramu, w łatwy <strong>do</strong> zrozumienia sposób może powstać taki schemat. Graficznie ukazujeto co w programie jest najważniejsze, pokazuje zależności między kolejnymi poleceniami.8http://wiem.onet.pl/wiem/00f18c.html9http://eduseek.ids.pl/artykuly/artykul/ida/1833/idc/1/ilk/8/idk/227910http://www.ids.poznan.pl/lo17/strony/informatyka/algorytmy/blokowe.htm51/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>• Algorytm opisany językiem programowania - (program) stanowi realizację projektu wkonkretnym języku programowana, powinien być poprzedzony opisem słownym ischematem blokowym5.3 Schematy blokowe.Jednym ze sposobów przedstawienia algorytmu jest schemat blokowy, tzn. rysunek składający się zszeregu figur geometrycznych o określonych kształtach (skrzynki lub bloki) połączonych ze sobąliniami (ścieżki sterujące). Figury służą <strong>do</strong> przedstawienia rodzaju działań zaprojektowanych walgorytmie, zaś linie wskazują kolejność wykonywania tych działań. Każda figura w schemacieblokowym prezentuje określony rodzaj operacji. Zasadniczą zaletą schematów blokowych jest to,że graficznie prezentują one działanie programu, zarówno od strony występujących w nim działań,jak i ich kolejności.operacja lub grupa operacji, w wyniku których ulega zmianie wartość,postać lub miejsce zapisu danych w pamięci operacyjnej komputeraoperacje wprowadzania i wyprowadzania danych <strong>do</strong>/z pamięcioperacyjnej komputeraoperacja warunkowa (IF), określająca wybór jednej z dwóch możliwychdróg działańproces określony poza programem i z tego powodu nie wymagającyzdefiniowania w rozpatrywanym programie (podprogram), przydefiniowaniu tych elementów należy pamiętać, że ich wykonanie nierozpoczyna się od START i nie kończy na STOP (najczęściej podprogramkończy się wykonaniem instrukcji powrotu (RETURN) <strong>do</strong> głównegoprogramu)określa kierunek przepływu danych lub kolejność wykonywania działańłącznik stronicowy, wskazujący wejście lub wyjście z wyodrębnionychfragmentów schematu rozmieszczonych na tych samych stronach(arkuszach papieru)łącznik międzystronicowy, wskazujący wejście lub wyjście zwyodrębnionych fragmentów schematu rozmieszczonych na różnychstronach (arkuszach papieru)oznaczenie miejsca rozpoczęcia, zakończenie lub przerwania działaniaprogramu.komentarz52/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>Operacje arytmetyczne oraz aplikacje typu WSTAW oznaczone są za pomocą prostokąta, w którymwpisuje się komentarz uściślający daną operację. Przy tym, jeśli kilka operacji tworzy logicznącałość, to wszystkie one mogą być umieszczone w jednej skrzynce. Nie zaleca się jednakumieszczania zbyt dużej ilości operacji nawet wtedy, kiedy są one powiązane ze sobą bezpośrednio– może to zmniejszyć czytelność schematu. Operacje odczytywania danych oraz wprowadzaniawyników oznaczone są za pomocą równoległoboków, w środku których powinien znaj<strong>do</strong>wać sięodpowiedni komentarz. Operacja warunkowa JEŻELI jest oznaczona za pomocą rombu, w którymwpisuje się odpowiedni warunek. Operacje warunkowe prowadzą zawsze <strong>do</strong> koniecznościrozważenie dwóch dróg: jednej (TAK) kiedy rozpatrywany warunek jest spełniony i drugiej, kiedywarunek nie jest spełniony (NIE). Operacje START i STOP są oznaczane figurą po<strong>do</strong>bną <strong>do</strong> elipsyz odpowiednim komentarzem.5.4 Zasady tworzenia schematów blokowych 11 :Schemat powinien być prosty i czytelny. W razie złożonego rozwiązania schemat należy podzielićna mniejsze części i zamieścić na osobnych arkuszach.Do rysowania schematów <strong>do</strong>brze jest używać szablonów, polepsza to czytelność schematu.W blokach niezbędne jest komentowanie zarówno zaprojektowanej operacji, jak i kolejności ichwykonania. Komentarze powinny być krótkie, lecz <strong>do</strong>kładnie wyjaśniające znaczenie opisywanychelementów.Należy unikać rysowania przecinających się ścieżek sterowania. W razie konieczności lepiej jestwprowadzić odpowiedni łącznik, który pozwoli wyeliminować niektóre z linii.Powinno się unikać zapisywania wprowadzanych operacji za pomocą instrukcji językówprogramowania.Należy <strong>do</strong>kładnie numerować arkusze, na których został narysowany schemat blokowy.Trzeba liczyć się z możliwością wystąpienia konieczności poprawek <strong>do</strong> schematu, dlategowskazane jest tak tworzyć arkusze, aby możliwe było naniesienie poprawek bez koniecznościprzerysowania całego schematu.Należy unikać zarówno zbyt dużej szczegółowości jak i zbytniej ogólności schematów.Nie należy umieszczać zbyt dużej liczby operacji w jednym bloku.Operacja warunkowa JEŻELI zawsze prowadzi <strong>do</strong> konieczności rozważenia dwóch dróg, gdywarunek jest spełniony i gdy nie jest.5.5 Etapy rozwiązywania problemów 12 :1. Sformułowanie zadania.2. Określenie danych wejściowych.3. Określenie celu, czyli wyniku.4. Poszukiwanie metody rozwiązania, czyli algorytmu.5. Przedstawienie algorytmu w postaci:- opisu słownego,11http://wiem.onet.pl/wiem/00f18c.html12http://www.ids.poznan.pl/lo17/strony/informatyka/algorytmy/blokowe.htm53/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>- listy kroków.- schematu blokowego,- jednego z języków programowania.6. Analiza poprawności rozwiązania.7. Testowanie rozwiązania dla różnych danych - ocena efektywności przyjętej metody.5.6 Realizacja pętli i instrukcji warunkowych 13 .CASE.FOR13http://wiem.onet.pl/wiem/00f18c.html54/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>WHILEREPEAT-UNTIL5.7 Przykłady schematów blokowych:Rozwiązanie równania kwadratowego 14 .14http://wiem.onet.pl/wiem/00f18c.html55/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>Rozwiązywanie równań stopnia nie wyższego niż drugi 15 .5.8 Poprawność algorytmów.Praktyka programistyczna <strong>do</strong>wodzi, że nie da właściwie napisać programu, który by działałbezbłędnie:“Jeżli uważasz, że jakiś program kompurteowy jest bezbłędny, to się mylisz –po prostu nie zauważyłeś jeszcze skutków błędu, który jest w nim zawarty 16 ”.W programie może wystąpić kilka rodzajów błędów:Błędy językowe – powstają w wyniku naruszenia składni języka programowania, którego używamy<strong>do</strong> zapisania agorytmu, np.:zamiast for i:=1 to N jest for i:=1 <strong>do</strong> NMożliwe skutki i znaczenie:• zatrzymanie kompilacji lub interpretacji z komunikatem lub bez;• przerwanie realizacji programu nawet jeżli kompilator nie wykrył błędu;• są błędy niezbyt poważne i <strong>do</strong>ść <strong>do</strong> naprawienia.15http://cku.wodzislaw.pl/notatki/spis13_6.htm16J. Sikorski: Wstęp <strong>do</strong> informatyki. Wyższa Szkoła Informatyki Stosowanej i Zarządzania.56/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>Błędy semantyczne – wynikają z niezrozumienia semantyki używanego języka programowania, np.sądzimy, że po zakończeniu iteracji: for:=1 to N <strong>do</strong> X[i]:=i, zmienna i ma wartość N, a nie N+1.Możliwe skutki i znaczenie:• program nie realizuje poprawnie algorytmu;• są to błędy trudne <strong>do</strong> przewidzenia i potencjalnie groźne ale są <strong>do</strong> uniknięcia przy większejwiedzy i starannym sprawdzeniu znaczenia używanych instrukcji.Błędy logiczne – wynikają ze złego planu rozwiązania problemu, np. stosujemy podczasprzeszukiwania tekstu znak “.” <strong>do</strong> określenia końca zdania, a nie przewidzieliśmy, że znak tenmoże wystąpić również w środku frazy, np.: Na rys. 4 pokazano ...Możliwe skutki i znaczenie:• algorytm przestaje być poprawnym rozwiązaniem zadania algorytmicznego;• dla pewnych zestawów danych wejściowych algorytm podaje wyniki niezgodne zoczekiwaniami;• procesor może nie być w stanie wykonać pewnych instrukcji (np. żądamy dzielenia przez 0);• są to błędy bardzo groźne – mogą być trudne <strong>do</strong> znalezienia i pozostawać długo w ukryciunawet w trakcie używania programu w postaci kodu.Błędy algorytmiczne – wynikają z wadliwie skonstruowanych struktur sterujących, np.niewłaściwych zakresów iteracji, niewłaściwych warunków arytmetycznych i logicznych, błędnegoprzeniesienia punktu sterowania, itd.Możliwe skutki i znaczenie:• algorytm dla pewnych <strong>do</strong>puszczalnych danych wejściowych daje niepoprawny wynik;• wykonywanie programu realizującego algorytm jest przerywane w trybie awaryjnym;• proces realizujący algorytm nie kończy w normalnym trybie sewgo zadania.57/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>6 Technologia programowania.Technologia programowania - nauka o procesach wytwarzania systemów informatycznych(programów komputerowych). W zakres technologii programowania wchodzą 17 :• sposoby prowadzenia projektów informatycznych,• metody analizy i projektowania systemów,• techniki planowania, szacowania kosztów, harmonogramowania i monitorowania projektówinformatycznych,• techniki zwiększania niezawodności oprogramowania,• sposoby testowania systemów i szacowania niezawodności,• sposoby przygotowania <strong>do</strong>kumentacji technicznej i użytkowej,• procedury kontroli jakości,• metody redukcji kosztów konserwacji,• techniki pracy zespołowej.Program komputerowy - ciąg instrukcji <strong>do</strong> wykonania dla komputera. Można też powiedzieć, żeprogram to algorytm zapisany w języku programowania. Program może występować w dwóchpostaciach: jako program wykonywalny (czyli zapisany w języku maszynowym) albo jako kodźródłowy, czyli postać zrozumiała dla programisty.6.1 Fazy powstawania programu komputerowego:Fazy powstawania programu komputerowego:• określanie wymagań,• wybór języka programowania,• tworzenie algorytmu,• projektowanie systemu,• implementacja,• scalanie systemu,• testy końcowe,• tworzenie <strong>do</strong>kumentacji użytkowej,• konserwacja systemu.Każda faza powinna posiadać własną <strong>do</strong>kumentację. W każdej fazie, szczególnie w końcowejczęści, powinna odbywać się weryfikacja (kodu i <strong>do</strong>kumentacji) oraz testowanie.Określanie wymagań – służy <strong>do</strong> sprecyzowania potrzeb. Na tym etapie formułuje się wyobrażenia oprogramie i jego działaniu oraz precyzuje wymagania. Na podstawie wymagań tworzona jest tzw.specyfikacja projektu, czyli zakres czynności, jaki dany program ma wykonywać. Jeżeli programjest tworzony na zamówienie, należy w pewnym momencie zażądać zamrożenia specyfikacji – wprzeciwnym razie klient może zażądać zmian (nawet po napisaniu programu), a wykonawca będzieto musiał zrobić nieodpłatnie. Czasami nawet mała zmiana wymagań może w decydujący sposóbwpłynąć na sposób realizacji zamówienia, co może nawet <strong>do</strong>prowadzić <strong>do</strong> koniecznościrozpoczęcia praktycznie od nowa.17Ze względu na charakter skryptu, w rozdziale omówione zostaną jedynie podstawowe zagadnienia z zakresutechnologii programowania.58/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>Tworzenie wymagań możliwe jest to na kilka sposobów:• wywiad strukturalny (rozmowa z klientem lub użytkownikiem) – polega na zadawaniuwcześniej opracowanej listy pytań,• wywiad swobodny – polega na zadawaniu <strong>do</strong>wolnych pytań i notowaniu odpowiedzi,• ankieta wysyłana <strong>do</strong> dużej liczby potencjalnych klientów,• analiza formularzy i innych <strong>do</strong>kumentów klienta,• analiza cyklu pracy i wykonywanych czynności,• analiza scenariuszy używania systemu,• konstrukcja prototypu.Dokumentacja fazy określania wymagań powinna zawierać:• wprowadzenie: zakres systemu, cele i konteksty jego używania,• opis ewolucji systemu: przewidywane zmiany w systemie,• specyfikację wymagań funkcjonalnych: jakie czynności i operacje system powinienwykonywać,• specyfikację wymagań niefunkcjonalnych: przy jakich ograniczeniach system powinienpowstać i działać,• opis modelu systemu lub jego prototypu,• opis wymagań sprzętowych,• słownik zawierający wyjaśnienia używanych w <strong>do</strong>kumentacji pojęć fachowych iinformatycznych.Jeżeli program komputerowy powstaje na użytek programisty, faza określania wymagań możezostać skrócona <strong>do</strong> minimum. Nie powinno się jednak pomijać fazy <strong>do</strong>kumentacji – powinna obabyć prowadzona przynajmniej w zakresie podstawowym, umożliwiającym rozwój i modyfikacjęprogramu nawet po wielu latach.Wybór języka programowania – zależy głównie od przeznaczenia aplikacji. Przeważnie istniejeprzynajmniej kilka języków programowania nadających się bu<strong>do</strong>wy systemu spełniającegowymagania.Wybór języka programowania może być:• narzucony przez zamawiającego,• pozostawiony woli wykonawcy – musi on wówczas uwzględnić:• dziedzinę aplikacji,• <strong>do</strong>świadczenie zespołu programistów,• posiadane narzędzia,• <strong>do</strong>stępność gotowych modułów i bibliotek,• potrzeby innych prowadzonych równolegle prac.Wybór języka programowania może być <strong>do</strong>konany przed lub po stworzeniu algorytmu.W pierwszym przypadku <strong>do</strong>bór języka może w znaczny sposób wpłynąć na tok rozumowania izdeterminować bu<strong>do</strong>wę algorytmu.Tworzenie algorytmu - jest to jeden z najważniejszych etapów projektowania, wymaga on odprogramisty (bądź projektanta) starannego przemyślenia i przygotowania. Nie należy przystępować<strong>do</strong> pisania programu nie mając wyobrażenia o jego bu<strong>do</strong>wie. Takie postępowanie wydłuży zapewneczas realizacji projektu, zwiększy praw<strong>do</strong>po<strong>do</strong>bieństwo wystąpienia błędów oraz nie daje gwarancjioptymalności rozwiązań. Dużych i rozbu<strong>do</strong>wanych programów praktycznie nie da się napisać bez59/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>odpowiednich przygotowań. Jeżeli to jest tylko możliwe należy korzystać z istniejących isprawdzonych algorytmów.Projektowanie systemu – służy <strong>do</strong> stworzenia szkieletu kodu źródłowego (systemu).Techniki projektowania:• projektowanie strukturalne:• zorientowane na akcję,• zorientowane na dane,• projektowanie obiektowe.Faza projektowania składa się z następujących etapów:• projektowanie architektury systemu,• organizacja danych i ich nazewnictwa,• szczegółowe projektowanie modułów,• weryfikacja i testowanie.Projekt systemu informatycznego powinien również uwzględniać ergonomiczność aplikacji,obejmującą:• właściwy <strong>do</strong>bór systemów menu, w tym menu kontekstowych,• wprowadzenie ikon, grafiki i sterowania aplikacji wskaźnikiem myszy,• <strong>do</strong>bór kolorów, czcionek i właściwe rozmieszczenie informacji na ekranie,• łatwość wyboru funkcji systemu,• szybkość obsługi (skróty klawiszowe dla najczęściej wykonywanych operacji),• możliwość <strong>do</strong>stosowywania wyglądu aplikacji i jego elementów (menu, ikon, przycisków)<strong>do</strong> indywidualnych potrzeb użytkowników,• jednolitość interface’u w różnych częściach systemu.Implementacja – jest to właściwa faza bu<strong>do</strong>wy programu. Małe systemy informatyczne mogą byćrealizowane przez jednego programistę. Systemy większe wymagają utworzenia zespołu bądź teżgrupy zespołów programistycznych.Scalanie systemu – w przypadku tworzenia aplikacji przez zespół programistów należy połączyćwszystkie moduły w jedną całość. Rozróżnia się trzy podstawowe techniki integracji systemuinformatycznego:• metoda zstępująca – najpierw integrowane są moduły sterujące, a później moduływykonawcze,• metoda wstępująca – najpierw integrowane są moduły wykonawcze a później sterujące,• metoda mieszana – moduły sterujące integrowane są metodą zstępującą, a wykonawcze –wstępującą. Na końcu części wykonawcze są <strong>do</strong>łączane <strong>do</strong> sterujących.Testy końcowe – służą <strong>do</strong> ostatecznego potwierdzenia poprawności systemu. Rozróżnia sięnastępujące etapy testów:• testowanie przez Dział Kontroli Jakości,• alfa-testy przez wybraną (najczęściej małą) grupę użytkowników,• beta-testy przez wybraną (większą) grupę użytkowników.• testy akceptacji (na rzeczywistych danych), wykonywane przez odbiorcę.60/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>integracjacałościZaletyWadybrak izolacji błędów,poważne błędy projektowe są wykrywanebardzo późno.metodazstępującaizolacja błędów,poważne błędy projektowe są wykrywane wcześnie.moduły, które mogą być powtórnie użyte niesą w pełni przetestowane.metoda izolacja błędów,poważne błędy projektowe są wykrywanewstępująca moduły, które mogą być powtórnie użyte są <strong>do</strong>brze bardzo późno.przetestowane.metodamieszanaizolacja błędów,poważne błędy projektowe są wykrywane wcześnie.moduły, które mogą być powtórnie użyte są <strong>do</strong>brzeprzetestowane.Tab.9. Porównanie metod scalania systemuDokumentacja użytkowa – powinna zawierać następujące elementy:• opis funkcjonalny – opis przeznaczenia oraz głównych możliwości programu,• podręcznik użytkownika – opis przeznaczony dla typowych użytkowników, powinienzawierać:• sposoby uruchamiania oraz kończenia pracy z systemem,• sposoby realizacji najczęściej wykorzystywanych funkcji systemu,• metody obsługi błędnych sytuacji,• sposoby korzystania z systemu pomocy,• kompletny przykład korzystania z systemu,• kompletny opis systemu – część przeznaczona dla <strong>do</strong>świadczonych użytkowników,powinien zawierać:• szczegółowy opis wszystkich funkcji systemu,• informacje o wszystkich sposobach wywoływania tych funkcji,• opisy formatu danych,• opisy błędów, które mogą pojawić się w trakcie pracy z systemem,• informacje o wszelkich ograniczeniach <strong>do</strong>tyczących np. zakresu danych.• opis instalacji – przeznaczony dla administratorów systemu. Powinien zawierać opisprocedury instalacyjnej i konfiguracji programu,• podręcznik administratora systemu – zawierający opis możliwości modyfikacji ustawieńsystemu oraz sposoby u<strong>do</strong>stępniania go użytkownikom końcowych.Na jakość <strong>do</strong>kumentacji mają wpływ następujące czynniki:• struktura podręcznika,• zachowanie standardów,• sposób pisania, w tym:• stosowanie formy aktywnej,• poprawność gramatyczna i ortograficzna,• krótkie zdania,• oszczędność sów,• precyzyjna definicja używanych terminów,• powtarzanie trudnych opisów,• stosowanie tytułów i podtytułów sekcji, wyliczeń i wyróżnień,• zrozumiałe odwołania <strong>do</strong> innych rozdziałów.61/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>Konserwacja systemu – zawiera zespół czynności, <strong>do</strong>konywanych po stworzeniuobejmujących:aplikacji,• poprawianie błędów,• u<strong>do</strong>skonalanie produktu,• <strong>do</strong>stosowywanie <strong>do</strong> nowych warunków.Koszty konserwacji są często bardzo duże – <strong>do</strong> 2/3 nakładów finansowych na aplikacje. Wynika toz następujących przyczyn:• poprawki mogą być przyczyną nowych błędów,• u<strong>do</strong>skonalenie wymaga przejścia przez wszystkie fazy produkcji i <strong>do</strong>konania zmian wspecyfikacji, projekcie i <strong>do</strong>kumentacji,• poprawione powinny być wszystkie <strong>do</strong>kumenty, w których znajdują się informacje<strong>do</strong>tyczące zmienionych fragmentów produktu.Zarządzanie fazą konserwacji:• raport o błędzie – formalna metoda <strong>do</strong>kumentacji wykrytych przez użytkowników błędówsystemu – musi zawierać informacje wystarczające <strong>do</strong> odtworzenia błędu,• błędy krytyczne muszą być poprawiane natychmiast, dla pozostałych powinny zostaćopisane przyczyny błędu i ewentualne metody ich obejścia,• opisane raporty o błędach wraz z datą ich poprawienia powinny być u<strong>do</strong>stępnianewszystkim użytkownikom,• błędy niekrytyczne powinny być poprawiane paczkami – obniża to koszty testowania imodyfikacji <strong>do</strong>kumentacji,• zmodyfikowany produkt powinien być sprawdzony przez niezależny zespół kontroli.6.2 Rodzaje programowaniaProgramowanie (ang. programming) - czynności związane z wpisywaniem poleceń językaprogramowania przez programistów celem tworzenia oprogramowania komputerowego.Rodzaje programowania:• programowanie strukturalne - rodzaj programowania, w którym program podzielony jest naniewielkie moduły - procedury bądź funkcje. Programowanie strukturalne ułatwiaprojektowanie, testowanie a także utrzymanie kodu programu. Do najpopularniejszychjęzyków strukturalnych zalicza się Pascal, C, Modula-2.• programowanie obiektowe - rodzaj programowania, w którym dane i wykonywane na nichoperacje są połączone. Ten formalny zabieg umożliwia szybsze pisanie większychprogramów, przez „składanie ich” ze wzajemnie powiązanych obiektów, które odpowiadająza daną funkcję programu (np. przygotowanie danych, wykonanie obliczeń,zaprezentowanie wyników). Do najpopularniejszych języków programowania obiektowegonależą C++, Java, Eiffel.• programowanie modularne (angielskie modular programming) - paradygmatprogramowania zalecający stosowanie modułów, jako nadrzędnych w stosunku <strong>do</strong> procedurbloków tworzących program. Moduł w pojęciu programowania modularnego grupujefunkcjonalnie związane ze sobą dane i procedury i jest reprezentacją obiektu występującegow programie w jednym egzemplarzu.62/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>• programowanie proceduralne (angielskie procedural programming) - paradygmatprogramowania zalecający stosowanie procedur i instrukcji strukturalnych, wystarczający<strong>do</strong> programowania większości metod numerycznych oraz obliczeń inżynierskich lubmatematycznych.• programowanie funkcjonalne (angielskie functional programming) - koncepcjaprogramowania bez używania przypisań; w programowaniu funkcjonalnym obliczenie tejsamej procedury z tymi samymi parametrami powoduje zawsze powstanie tego samegowyniku, procedury w programowaniu funkcjonalnym mogą zatem być rozważane jakofunkcje w rozumieniu matematycznym.• programowanie RAD, Rapid Application Development - termin komercyjny („błyskawiczneopracowywanie aplikacji”) określający możliwości pakietu oprogramowania działającego wgraficznym śro<strong>do</strong>wisku okienkowym, służącego <strong>do</strong> zestawiania aplikacji, w szczególności –ich interfejsów, z modułów wybieranych z bibliotek u<strong>do</strong>stępnianych w postaci drzewtematycznych. W zależności od wybranego elementu pakiet RAD wytwarza fragmenty kodu(np. w języku C++) wraz z odpowiednimi wywołaniami. Szczegóły odbiegające odstandardu uzupełnia ręcznie programista. Aplikacje wytworzone w śro<strong>do</strong>wiskach RAD są zreguły słabo przenośne i zajmują dużo pamięci, jednak możliwość automatycznegooprogramowania ich najżmudniejszych elementów (interfejs graficzny) oraz ułatwionykontakt ze standar<strong>do</strong>wymi bazami danych powoduje, że programowanie RAD staje się corazpopularniejsze.• programowanie liniowe - maksymalizacja lub minimalizacja funkcji wielu zmiennych, gdyzmienne te, lub niektóre z nich, podlegają liniowym warunkom ograniczającym w postacirównań lub nierówności. Nazwa "programowanie" wskazuje w tym kontekście na schematdziałań.• programowanie nieliniowe - metody rozwiązywania problemów opisywanych przezrównania różniczkowe nie dające się sprowadzić <strong>do</strong> równań liniowych (programowanieliniowe).• programowanie dynamiczne - metoda zapewniająca wybór ciągu zgodnych rozwiązańoptymalnych w wielostopniowych problemach decyzyjnych. W istocie jest to processekwencyjnego podejmowania decyzji.• p rogramowanie w logice (angielskie logic programming) - kierunek rozwojowy językówprogramowania, korzystający istotnie z <strong>do</strong>świadczeń i osiągnięć logiki matematycznej.Instrukcje języków programowania w logice przyjmują postaci wzorów logicznych(predykatów). Programowanie w logice znajduje zastosowanie przy bu<strong>do</strong>waniuinteligentnych baz wiedzy, systemów ekspertowych, w eksperymentach ze sztucznąinteligencją.• programowanie współbieżne (angielskie concurrent programming) - programowanieprocesów współbieżnych realizowane za pomocą specjalnie zaprojektowanych językówprogramowania (np. Linda), języków odpowiednio <strong>do</strong>stosowanych (np. Concurrent Pascal)lub przy użyciu bibliotek synchronizacji procesów i wątków.• programowanie z użyciem obiektów (angielskie object-based programming) - paradygmatprogramowania <strong>do</strong>puszczający możliwość tworzenia typów zdefiniowanych przezużytkownika i posługiwania się w programach danymi nowo zdefiniowanych typów.Programowanie z użyciem obiektów jest zalecane tam, gdzie programowanie proceduralne63/64


Materiały uzupełniające <strong>do</strong> wykładów z Języków <strong>Programowania</strong> <strong>II</strong>lub modularne okazują się niewystarczające z uwagi na potrzebę użycia nowych typówdanych i liczne ich reprezentacje (obiekty), natomiast programowanie obiektowe jestniepotrzebne z powodu prostych właściwości <strong>przedmiotu</strong> programowania.• programowanie wstępujące - w programowaniu strukturalnym rozwiązywanie problemu zapomocą wydzielonych prostszych zadań.• programowanie zstępujące - w programowaniu strukturalnym rozwiązywanie problemu wjednym ogólnym, <strong>do</strong>brze przemyślanym planie.Wojciech Sobieski ©200664/64

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!