Rozdział 1. Zaczynamy, Informatyka, Technik informatyki, Programowanie, C++
[ Pobierz całość w formacie PDF ]
Część 1.
Rozdział 1.
Zaczynamy
Wprowadzenie
Witamy w „C++ dla każdego.” Ten rozdział pomoże ci efektywnie programować w C++.
Dowiesz się z niego:
• dlaczego C++ jest standardowym językiem tworzenia oprogramowania
• Jakie kroki należy wykonać przy opracowaniu programu w C++
• w jaki sposób wpisać, skompilować i zbudować swój pierwszy, działający
program w C++.
Krótka historia języka C++
Od czasu pierwszych komputerów elektronicznych, zbudowanych do wspomagania artyleryjskich
obliczeń trajektorii podczas drugiej wojny światowej, języki programowania przebyły długą drogę.
Na początku programiści używali najbardziej prymitywnych instrukcjami komputera: języka
1
maszynowego. Te instrukcje były zapisywane jako długie ciągi zer i jedynek. Dlatego wymyślono
tzw. asemblery, zamieniające instrukcje maszynowe na czytelne dla człowieka i łatwiejsze do
zapamiętania mnemoniki, takie jak ADD czy MOV.
Z czasem pojawiły się języki wyższego poziomu, takie jak BASIC czy COBOL. Te języki
umożliwiały stosowanie zapisu przypominającego słowa i zdania, np. LET I = 100. Te instrukcje
były tłumaczone przez interpretery i kompilatory na język maszynowy.
Interpreter tłumaczy odczytywany program, bezpośrednio zamieniając jego instrukcje (czyli kod)
na działania. Kompilator natomiast tłumaczy kod na pewną formę pośrednią. Ten proces jest
nazywany kompilacją; w jej wyniku otrzymujemy plik obiektowy. Następnie kompilator
wywołuje program łączący (tzw. linker), który zamienia plik obiektowy na program
wykonywalny.
Ponieważ interpretery odczytują kod programu bezpośrednio i wykonują go na bieżąco, są
łatwiejsze w użyciu dla programistów. Obecnie większość programów interpretowanych jest
nazywanych skryptami, zaś sam interpreter nosi nazwę Script Engine (w wolnym tłumaczeniu:
motor skryptu).
Niektóre języki, takie jak Visual Basic, nazywają interpreter biblioteką czasu działania. Java
nazywa swój interpreter
maszyną wirtualną
(VM, Virtual Machine), jednak w pewnych
przypadkach taka maszyna wirtualna jest dostarczana przez przeglądarkę WWW (taką jak Internet
Explorer lub Netscape).
Kompilatory wymagają wprowadzenia dodatkowego kroku związanego z kompilowaniem kodu
źródłowego (czytelnego dla człowieka) na kod obiektowy (czytelny dla maszyny). Ten dodatkowy
krok jest dość niewygodny, ale dzięki niemu kompilowane programy działają bardzo szybko, gdyż
czasochłonne zadanie przetłumaczenia kodu źródłowego na język maszynowy jest wykonywane
tylko raz (podczas kompilacji) i nie jest już konieczne podczas działania programu.
Kolejną zaletą wielu języków kompilowanych (takich jak C++) jest posiadanie tylko programu
wykonywalnego (bez konieczności posiadania interpretera). W przypadku języka
interpretowanego, do uruchomienia programu konieczne jest posiadanie interpretera.
Przez wiele lat głównym celem programistów było uzyskanie niewielkich fragmentów szybko
działającego kodu. Programy musiały być niewielkie, gdyż pamięć była droga; musiały być także
szybkie, gdyż droga była również moc obliczeniowa. Gdy komputery stały się mniejsze, tańsze i
szybsze, a także gdy spadła cena pamięci, te priorytety uległy zmianie. Obecnie czas pracy
programisty jest dużo droższy niż koszty eksploatacji większości komputerów wykorzystywanych
w codziennej pracy. Teraz najważniejszy jest dobrze napisany, łatwy w konserwacji kod. Łatwość
konserwacji oznacza, że gdy zmienią się wymagania wobec działania programu, program można
zmienić i rozbudować, bez ponoszenia większych wydatków.
UWAGA Słowo „program” jest używane w dwóch kontekstach: w odniesieniu do zestawu
poszczególnych instrukcji (kodu źródłowego), tworzonego przez programistę oraz w odniesieniu
się do całego programu przyjmujacego postać pliku wykonywalnego. Może to powodować
znaczne nieporozumienia, w związku z czym będziemy starać się dokonać rozróżnienia
pomiędzy kodem źródłowym a plikiem wykonywalnym.
2
Rozwiązywanie problemów
Problemy, które obecnie rozwiązują programiści, są zupełnie inne niż problemy rozwiązywane
dwadzieścia lat temu. W latach osiemdziesiątych programy były tworzone w celu zarządzania
dużymi ilościami nie poddanych obróbce danych danych. Zarówno osoby piszące kod, jak i osoby
korzystające z programów, zajmowały się komputerami profesjonalnie. Obecnie z komputerów
korzysta dużo osób, większość z nich ma niewielkie pojęcie o tym, jak działa program i komputer.
Komputery są narzędziem używanym przez ludzi do konkretnej pracy, a nie w celu dodatkowego
zmagania się z samym komputerem.
Można uważać za ironię, że wraz z pojawieniem się coraz łatwiejszych do opanowania przez ogół
użytkowników programów, tworzymy programy, które same w sobie stają się coraz bardziej
wymyślne i skomplikowane. Minęły już czasy wpisywania przez użytkownika tajemniczych
poleceń po znaku zachęty, które powodowały wyświetlenie strumienia nie przetworzonych
danych. Obecne programy korzystają z wymyślnych „przyjaznych interfejsów użytkownika”,
posiadających wiele okien, menu, okien dialogowych oraz innych elementów, które wszyscy
dobrze znamy.
Wraz z rozwojem sieci WWW, komputery wkroczyły w nową erę penetracji rynku; korzysta z nicj
więcej osób niż kiedykolwiek, a ich oczekiwania są bardzo duże. Przez kilka lat, jakie upłynęły od
czasu pierwszego wydania tej książki, programy stały się bardziej złożone, w związku z czym
powstało zapotrzebowanie na pomocne w ich opanowaniu techniki programistyczne.
Wraz ze zmianą wymagań dotyczących oprogramowania, zmieniły się także same języki i
technika pisania programów. Choć historia tych przemian jest fascynująca, w tej książce skupimy
się na transformacjach jakie nastąpiły w trakcie przejścia od programowania proceduralnego do
programowania obiektowego.
Programowanie proceduralne, strukturalne i
obiektowe
Do niedawna program był traktowany jako seria procedur, działających na danych. Procedura
(funkcja) jest zestawem specyficznych, wykonywanych jedna po drugiej instrukcji. Dane były
całkowicie odseparowane od procedur, zaś zadaniem programisty było zapamiętanie, która funkcja
wywołuje inne funkcje, oraz jakie dane były w wyniku tego zmieniane. W celu uniknięcia wielu
potencjalnych błędów opracowane zostało programowanie strukturalne.
Główną ideą programowania strukturalnego jest: „dziel i rządź.” Program komputerowy może być
uważany za zestaw zadań. Każde zadanie, które jest zbyt skomplikowane aby można było je łatwo
opisać, jest rozbijane na zestaw mniejszych zadań składowych, aż do momentu gdy, wszystkie
zadania są wystarczająco łatwe do zrozumienia.
Na przykład, obliczenie przeciętnej pensji przeciętnego pracownika przedsiębiorstwa jest dość
złożonym zadaniem. Można je jednak podzielić na następujące podzadania:
1. Obliczenie, ile zarabiają poszczególne osoby.
2. Policzenie ilości pracowników.
3
3. Zsumowanie wszystkich pensji.
4. Podzielenie tej sumy przez ilość pracowników.
Sumowanie pensji można podzielić na następujące kroki:
1. Odczytanie danych dotyczących każdego pracownika.
2. Odwołanie się do danych dotyczących pensji.
3. Dodanie pensji do naliczanej sumy.
4. Przejście do danych dotyczących następnego pracownika.
Z kolei, uzyskanie danych na temat pracownika można rozbić na:
1. Otwarcie pliku pracowników.
2. Przejście do właściwych danych.
3. Odczyt danych z dysku.
Programowanie strukturalne stanowi niezwykle efektywny sposób rozwiązywania złożonych
problemów. Jednak pod koniec lat osiemdziesiątych ograniczenia takiej metody programowania
objawiły się aż nazbyt jasno.
Po pierwsze, w trakcie tworzenia oprogramowania naturalnym dążeniem jest traktowanie danych
(na przykład danych pracownika) oraz tego, co można z nimi zrobić (sortować, modyfikować,
itd.), jako pojedynczej całości. Niestety, w programowaniu strukturalnym struktury danych są
oddzielone od manipulujących nimi funkcji, a w programie strukturalnym nie istnieje naturalny
sposób ich połączenia. Programowanie strukturalne jest często nazywane programowaniem
proceduralnym, gdyż skupia się na procedurach (a nie na „obiektach”).
Po drugie, programiści zmuszeni są wciąż wymyślać nowe rozwiązania starych problemów.
Czasem nazywa się to „wymyślaniem koła”; stanowi to przeciwieństwo „ponownego
wykorzystania.” Idea ponownego wykorzystania oznacza tworzenie komponentów, posiadających
znane wcześniej właściwości, które mogą być w miarę potrzeb dołączane do programu. Pomysł
został zapożyczony z rozwiązań sprzętowych — gdy inżynier potrzebuje nowego tranzystora,
zwykle nie musi go wymyślać — przegląda duże pudło z tranzystorami i wybiera ten, który
spełnia dane wymagania, ewentualnie tylko nieco go modyfikując. Inżynier oprogramowania nie
miał podobnej możliwości.
Na to zapotrzebowanie próbuje odpowiedzieć programowanie zorientowane obiektowo, dostarcza
ono technik zarządzania złożonymi elementami, umożliwia ponowne wykorzystanie
komponentów i łączy w logiczną całość dane oraz manipulujące nimi funkcje.
Zadaniem programowania zorientowanego obiektowo jest modelowanie „obiektów” (tzn. rzeczy),
a nie „danych.” Modelowanymi obiektami mogą być zarówno elementy na ekranie, takie jak
4
przyciski czy pola list, jak i obiekty świata rzeczywistego, np. motocykle, samoloty, koty czy
woda.
Obiekty posiadają charakterystyki (szybki, obszerny, czarny, mokry) oraz możliwości
(przyspieszanie, latanie, mruczenie, bulgotanie). Zadaniem programowania zorientowanego
obiektowo jest reprezentacja tych obiektów w języku programowania.
C++ i programowanie zorientowane obiektowo
Język C++ wspiera programowanie zorientowane obiektowo, obejmuje swym działaniem trzy
podstawy takiego stylu programowania: kapsułkowanie, dziedziczenie oraz polimorfizm.
Kapsułkowanie
Gdy inżynier chce dodać do tworzonego urządzenia rezystor, zwykle nie buduje go samodzielnie
od początku — podchodzi do pojemnika z rezystorami, sprawdza kolorowe paski, oznaczające
właściwości, i wybiera potrzebny element. Z punktu widzenia inżyniera rezystor jest „czarną
skrzynką” — nieważny jest sposób w jaki działa (o ile tylko zachowuje się zgodnie ze swoją
specyfikacją). Inżynier nie musi zastanawiać się nad wnętrzem rezystora, aby użyć go w swoim
projekcie.
Właściwość samozawierania się jest nazywana kapsułkowaniem. W kapsułkowaniu możemy
zakładać opcję ukrywania danych. Ukrywanie danych jest możliwością, dzięki której obiekt może
być używany przez osobę nie posiadającą wiedzy o tym, w jaki sposób działa. Skoro możemy
korzystać z lodówki bez znajomości zasad działania kompresora, możemy też użyć dobrze
zaprojektowanego obiektu nie znając jego wewnętrznych danych składowych.
Sytuacja wygląda podobnie, gdy z rezystora korzysta inżynier: nie musi wiedzieć niczego o jego
wewnętrznym stanie. Wszystkie właściwości rezystora są zakapsułkowane w obiekcie rezystora
(nie są rozrzucone po całym układzie elektronicznym). Do efektywnego korzystania z rezystora
nie jest potrzebna wiedza o sposobie jego działania. Można powiedzieć, że jego dane są ukryte
wewnątrz obudowy.
C++ wspiera kapsułkowanie poprzez tworzenie typów zdefiniowanych przez użytkownika,
zwanych klasami. O tym, jak tworzyć klasy, dowiesz się z rozdziału szóstego, „Programowanie
zorientowane obiektowo.” Po stworzeniu, dobrze zdefiniowana klasa działa jako spójna całość —
jest używana jako jednostka. Wewnętrzne działanie klasy powinno być ukryte. Użytkownicy
dobrze zdefiniowanych klas nie muszą wiedzieć, w jaki sposób one działają; muszą jedynie
wiedzieć, jak z nich korzystać.
Dziedziczenie i ponowne wykorzystanie
Gdy inżynierowie z Acme Motors chcą zbudować nowy samochód, mają do wyboru dwie
możliwości: mogą zacząć od początku lub zmodyfikować istniejący już model. Być może ich
model, Gwiazda, jest prawie doskonały, ale chcą do niego dodać turbodoładowanie i
sześciobiegową skrzynię biegów. Główny inżynier nie chciałby zaczynać od początku, zamiast
tego wolałby zbudować nowy, podobny model, z tym dodatkowym wyposażeniem. Nowy model
5
[ Pobierz całość w formacie PDF ]
Tematy
- Indeks
- Rozdział7, STUDIA, studia materiały, MATERIAŁY DODATKOWE, dodatkowe INNE
- Rozdzial-III, Harry Potter Fanfiction !, Harry Potter i Koniec Świata
- Rozdział 3-5 Napraw mnie, Tłumaczenia, Trwające, Jennifer Foor, Napraw mnie
- Rozdział 9, Fanfiction ♥, Igrzyska Śmierci, Igrzyska Śmierci oczami Peety Mellarka
- Rozdzial 14, Richelle Mead - Czarna Łabędzica, Mead Richell - Dark Swan 03 - Ukoronowana Żelazem
- Rozdział 4 - rozwój prenatalny, wychowanie i rozwoj
- Rozdział 2 Zabezpieczenie bezpieczeństwa lotów przez przez ATS, Zarządzanie ruchem lotniczym PL-4444
- Rozdział 8, AGH IMIR Mechanika i budowa maszyn, Semestr VI, MES, PODSTAWY MECHANIKI KOMPOZYTÓW WŁÓKNISTYCH
- Rozdzielnice NN Katalog 2010, Elektryka, Katalogi, Emiter
- Rozdzial3, FILOLOGIA, Filologia polska, Hist. lit. pol
- zanotowane.pl
- doc.pisz.pl
- pdf.pisz.pl
- coolinarny.opx.pl