Wykład 1
1 Wprowadzenie do programowania
Większość aplikacji została stworzona do realizacji jednego, konkretnego, choć obszernego zadania. Przykładowo, Notatnik potrafi edytować pliki tekstowe, Winamp – odtwarzać muzykę, a Paint tworzyć rysunki.
Rysunek 1.1. Widok głównego widoku Winmap
Możemy więc powiedzieć, że główną funkcją każdego z tych programów będzie odpowiednio edycja plików tekstowych, odtwarzanie muzyki czy tworzenie rysunków. Funkcję tę można jednak podzielić na mniejsze, bardziej szczegółowe. I tak Notatnik potrafi otwierać i zapisywać pliki, drukować je i wyszukiwać w nich tekst. Winamp zaś pozwala nie tylko odtwarzać utwory, ale też układać z nich playlisty.
Idąc dalej, możemy dotrzeć do następnych, coraz bardziej szczegółowych funkcji danego programu. Przypominają one więc coś w rodzaju drzewka, które pozwala nam niejako „rozłożyć daną aplikację na części”.
Rysunek 1.2 Składowe programu Notatnik
Można się zastanawiać na jak drobne części możemy w ten sposób dzielić programy. Innymi słowy, czy dojdziemy wreszcie do takiego elementu, który nie da się rozdzielić na mniejsze. Oczywiście tak – w przypadku Notatnika byliśmy zresztą bardzo blisko.
Czynność zatytułowana Otwieranie plików wydaje się być już jasno określona. Kiedy wybieramy z menu Plik programu pozycję Otwórz, Notatnik robi kilka rzeczy: najpierw pokazuje nam okno wyboru pliku. Gdy już zdecydujemy się na jakiś, pyta nas, czy chcemy zachować zmiany w już otwartym dokumencie (jeżeli jakiekolwiek zmiany rzeczywiście poczyniliśmy). W przypadku, gdy je zapiszemy w innym pliku lub odrzucimy, program przystąpi do odczytania zawartości żądanego przez nas dokumentu i wyświetli go na ekranie. Proste, prawda? . Przedstawiona powyżej charakterystyka czynności otwierania pliku posiada kilka znaczących cech:
· określa dokładnie kolejne kroki wykonywane przez program;
· wskazuje różne możliwe warianty sytuacji i dla każdego z nich przewiduje odpowiednią reakcję.
Pozwalają one nazwać niniejszy opis algorytmem.
Pisanie programów jest czynnością polegającą na zapisaniu pewnej, ściśle określonej liczby poleceń w określony języku programowania. Cały program jest zbiorem poleceń.
Algorytm jest metodą rozwiązywania problemu w skończonej liczbie kroków (operacji elementarnych). Algorytm to jednoznacznie określony sposób, w jaki program komputerowy realizuje jakąś elementarną czynność.
Przy rozwiązywaniu jakiegoś problemu przy pomocy komputera należy zrealizować następujące etapy:
· sformułowanie problemu (najważniejsza faza procesu rozwiązania);
· dokładna analiza problemu;
· znalezienie właściwej metody rozwiązania problemu (opracowanie algorytmu);
· napisanie programu w określonym języku programowania (np. Borland C++ lub C++Builder);
· uruchomienie i przetestowanie programu;
· wprowadzenie koniecznych zmian.
W przypadku otwierania plików w Notatniku może to wyglądać na przykład tak:
Algorytm Plik -> Otwórz
Pokaż okno wyboru plików
Jeżeli użytkownik kliknął Anuluj, To Przerwij
Jeżeli poczyniono zmiany w aktualnym dokumencie, To
Wyświetl komunikat "Czy zachować zmiany w aktualnym dokumencie?" z przyciskami
Tak, Nie, Anuluj
Sprawdź decyzję użytkownika
Decyzja Tak: wywołaj polecenie Plik -> Zapisz
Decyzja Anuluj: Przerwij
Odczytaj wybrany plik
Wyświetl zawartość pliku
Koniec Algorytmu
Jak widać, sprecyzowaliśmy tu kolejne kroki wykonywane przez program – tak aby „wiedział”, co należy po kolei zrobić. Fragmenty zaczynające się od Jeżeli i Sprawdź pozwalają odpowiednio reagować na różne sytuacje, takie jak zmiana decyzji użytkownika i wciśnięcie przycisku Anuluj.
Czy to wystarczy, by komputer wykonał to, co mu każemy? Otóż nie bardzo… Chociaż wprowadziliśmy już nieco porządku, nadal używamy języka naturalnego – jedynie struktura zapisu jest bardziej ścisła. Notacja taka, zwana pseudokodem, przydaje się jednak bardzo do przedstawiania algorytmów w czytelnej postaci. Jest znacznie bardziej przejrzysta oraz wygodniejsza niż opis w formie zwykłych zdań, które musiałyby być najczęściej wielokrotnie złożone i niezbyt poprawne gramatycznie. Dlatego też, kiedy będziesz wymyślał własne algorytmy, staraj się używać pseudokodu do zapisywania ich ogólnego działania.
3.8 Przegląd najważniejszych języków programowania
Obecnie istnieje bardzo, bardzo wiele języków programowania. Niektóre przeznaczono do konkretnych zastosowań, na przykład sieci neuronowych, inne zaś są narzędziami ogólnego przeznaczenia. Zazwyczaj większe korzyści zajmuje znajomość tych drugich, dlatego nimi właśnie się zajmiemy.
Należy zaznaczyć, nie ma czegoś takiego jak język, który będzie dobry do wszystkiego. Spośród języków „ogólnych” niektóre są nastawione na szybkość, inne na rozmiar kodu, jeszcze inne na przejrzystość itp. Jednym słowem, panuje totalny rozgardiasz ;)
Należy koniecznie odróżniać języki programowania od innych języków używanych w informatyce. Na przykład HTML jest językiem opisu, gdyż za jego pomocą definiujemy jedynie wygląd stron www (wszelkie interaktywne akcje to już domena JavaScriptu). Inny rodzaj to języki zapytań w rodzaju SQL, służące do pobierania danych z różnych źródeł (na przykład baz danych). Niepoprawne jest więc (popularne skądinąd) stwierdzenie „programować w HTML”.
Przyjrzyjmy się więc najważniejszym używanym obecnie językom programowania:
1. Visual Basic Jest to następca popularnego swego czasu języka BASIC. Zgodnie z nazwą (Basic znaczy prosty), był on przede wszystkim łatwy do nauki. Visual Basic pozwala na tworzenie programów dla środowiska Windows w sposób wizualny, tzn. poprzez konstruowanie okien z takich elementów jak przyciski czy pola tekstowe. Język ten posiada dosyć spore możliwości, jednak ma również jedną, za to bardzo poważną wadę. . Programy w nim napisane nie są kompilowane w całości do kodu maszynowego, ale interpretowane podczas działania. Z tego powodu są znacznie wolniejsze od tych kompilowanych całkowicie. Obecnie Visual Basic jest jednym z języków, który umożliwia tworzenie aplikacji pod lansowaną przez Microsoft platformę .NET, więc pewnie jeszcze o nim usłyszymy :)
lObject Pascal (Delphi) Delphi z kolei wywodzi się od popularnego języka Pascal. Podobnie jak Visual Basic jest łatwy do nauczenia, jednakże oferuje znacznie większe możliwości zarówno jako język programowania, jak i narzędzie do tworzenia aplikacji. Jest całkowicie kompilowany, więc działa tak szybko, jak to tylko możliwe. Posiada również możliwość wizualnego konstruowania okien. Dzięki temu jest to obecnie chyba najlepsze środowisko do budowania programów użytkowych.l3. C++ jest teraz chyba najpopularniejszym językiem do zastosowań wszelakich. Powstało do niego bardzo wiele kompilatorów pod różne systemy operacyjne i dlatego jest uważany za najbardziej przenośny. Istnieje jednak druga strona medalu – mnogość tych narzędzi prowadzi do niewielkiego rozgardiaszu i pewnych trudności w wyborze któregoś z nich. Na szczęście sam język został w 1997 roku ostatecznie ustandaryzowany. O C++ nie mówi się zwykle, że jest łatwy – być może ze względu na dosyć skondensowaną składnię (na przykład odpowiednikiem pascalowych słów begin i end są po prostu nawiasy klamrowe { i }). To jednak dosyć powierzchowne przekonanie, a sam język jest spójny i logiczny. Jeżeli chodzi o możliwości, to w przypadku C++ są one bardzo duże – w sumie można powiedzieć, że nieco większe niż Delphi. Jest on też chyba najbardziej elastyczny – niejako dopasowuje się do preferencji programisty.
lJava Ostatnimi czasy Java stała się niemal częścią kultury masowej – wystarczy choćby wspomnieć o telefonach komórkowych i przeznaczonych doń aplikacjach. Ilustruje to dobrze główny cel Javy, a mianowicie przenośność – i to nie kodu, lecz skompilowanych programów! Osiągnięto to poprzez kompilację do tzw. bytecode, który jest wykonywany w ramach specjalnej maszyny wirtualnej. W ten sposób, program w Javie może być uruchamiany na każdej platformie, do której istnieje maszyna wirtualna Javy – a istnieje prawie na wszystkich, od Windowsa przez Linux, OS/2, QNX, BeOS, palmtopy czy wreszcie nawet telefony komórkowe. Z tego właśnie powodu Java jest wykorzystywana do pisania niewielkich programów umieszczanych na stronach www, tak zwanych apletów. Ceną za tą przenośność jest rzecz jasna szybkość – bytecode Javy działa znacznie wolniej niż zwykły kod maszynowy, w dodatku jest strasznie pamięciożerny. Ponieważ zastosowania tego języka nie są wielkie i nie wymagające aplikacje, lecz proste programy, zatem nie jest to aż tak wielki mankament. Składniowo Java bardzo przypomina C++.llPHP (skrót od Hypertext Preprocessor) jest językiem używanym przede wszystkim w zastosowaniach internetowych, dokładniej na stronach www. Pozwala dodać im znacznie większą funkcjonalność niż ta oferowana przez zwykły HTML. Obecnie miliony serwisów wykorzystuje PHP – dużą rolę w tym sukcesie ma zapewne jego licencja, oparta na zasadach Open Source (czyli brak ograniczeń w rozprowadzaniu i modyfikacji). Możliwości PHP są całkiem duże, nie można tego jednak powiedzieć o szybkości – jest to język interpretowany. Jednakże w przypadku głównego zastosowania PHP, czyli obsłudze serwisów internetowych, nie ma ona większego znaczenia – czas wczytywania strony WWW to przecież w większości czas przesyłania gotowego kodu HTML od serwera do odbiorcy. Jeżeli chodzi o składnię, to trochę przypomina ona C++. Kod PHP można jednak swobodnie przeplatać znacznikami HTML. Z punktu widzenia programisty gier język ten jest w zasadzie zupełnie bezużyteczny (chyba że kiedyś sam będziesz wykonywał oficjalną stronę internetową swojej wielkiej produkcji ), wspominam o nim jednak ze względu na bardzo szerokie grono użytkowników, co czyni go jednym z ważniejszych języków programowania.lTo oczywiście nie wszystkie języki – jest ich całe mnóstwo. Jednakże w ogromnej większości przypadków główną różnicą między nimi jest składnia, a więc sprawa mało istotna (szczególnie, jeżeli dysponuje się dobrą dokumentacją). Z tego powodu poznanie jednego z nich bardzo ułatwia naukę następnych – po prostu im więcej języków już znasz, tym łatwiej uczysz się następnych
Musimy zatem zdecydować, którego języka będziemy się uczyć, aby zrealizować nasz nadrzędny cel, np. poznanie tajników programowania gier. Sprecyzujmy więc wymagania wobec owego języka:
· programy w nim napisane muszą być szybkie – w takim wypadku możemy wziąć pod uwagę jedynie języki całkowicie kompilowane do kodu maszynowego;
· musi dobrze współpracować z różnorodnymi bibliotekami graficznymi, na przykład DirectX;
· powinien posiadać duże możliwości i zapewniać gotowe, często używane rozwiązania;
· nie zaszkodzi też, gdy będzie w miarę prosty i przejrzysty :)
Jeżeli uwzględnimy wszystkie te warunki, to spośród całej mnogości języków programowania (w tym kilku przedstawionych wcześniej) zostają nam aż… dwa – Delphi oraz C++.
Przyglądając się bliżej Delphi, możemy zauważyć, iż jest on przeznaczony przede wszystkim do programowania aplikacji użytkowych. Na plus można jednak zaliczyć prostotę i przejrzystość języka oraz jego bardzo dużą wydajność. Również możliwości Delphi są całkiem spore.
Z kolei C++ zdaje się być bardziej uniwersalny. Dobrze rozumie się z ważnymi dla nas bibliotekami graficznymi, jest także bardzo szybki i posiada duże możliwości. Składnia z kolei jest raczej „ekonomiczna” i być może nieco bardziej skomplikowana.
C++Builder6 wykorzystuje w języku C++ zalety języka Delphi. Biblioteka VCL wykorzystywana Delphi została zaadoptowana do języka C++, co ma miejsce w C++Builder6.
Czyżbyśmy mieli zatem remis, a prawda leżała (jak zwykle) pośrodku? Otóż niezupełnie – nie uwzględniliśmy bowiem ważnego czynnika, jakim jest popularność danego języka. Jeżeli jest on szeroko znany i używany (np. do programowania gier), to z pewnością istnieje o nim więcej przydatnych źródeł informacji, z których mógłbyś korzystać.
Z tego właśnie powodu Delphi jest gorszym wyborem, ponieważ ogromna większość dokumentacji, artykułów, kursów itp. dotyczy języka C++. Wystarczy chociażby wspomnieć, iż Microsoft nie dostarcza narzędzi pozwalających na wykorzystanie DirectX w Delphi – są one tworzone przez niezależne zespoły i ich używanie wymaga pewnego doświadczenia.
A więc – C++! Język ten wydaje się najlepszym wyborem. A skoro mamy już tą ważną decyzję za sobą, została nam jeszcze tylko pewna drobnostka – trzeba się tego języka nauczyć.
3.8 Generacje języków programowania
Język programowania to forma zapisu instrukcji dla komputera i programów komputerowych, pośrednia między językiem naturalnym a kodem maszynowym.
Języki programowania można podzielić na 5 wyraźnie różniących się generacji (według innych autorów na 4 generacje)
1. Pierwsza generacja – programowanie komputerów odbywa się w kodzie binarnym, czyli za pomocą zer i jedynek. Programowanie tą metodą stwarza ogromne trudności ze względu na to, że każdy komputer posługuje się własnym kodem (kodem maszynowym inaczej zwanym wewnętrznym) i programista za każdym razem musi dostosować się do języka konkretnej maszyny.
2. Druga generacja –powstają języki symboliczne (asemblery), w których ciągi zer i jedynek zastąpiono łatwiejszymi do zrozumienia znakami mnemotechnicznymi. Chociaż języki te stanowią proste tłumaczenie języka maszynowego na symbole i są ściśle związane z danym modelem komputera, to znacznie ułatwiają pisanie instrukcji, czynią je bardziej czytelnymi.
3. Trzecia generacja – powstają języki programowania wysokiego poziomu, w których symbole asemblera zastąpiono łatwiejszym do zapamiętania językiem naturalny.
4. Czwarta generacja – odpowiednie narzędzia umożliwiają budowanie prostych aplikacji dzięki wykorzystaniu gotowych modułów.
5. Piąta generacja – to języki stosowane do tworzenia programów wykorzystujących tzw. sztuczną inteligencję lub systemów (ekspertowych)
...