następny punkt »

1. Co robi komputer?

Jak wiemy, typowy zestaw komputerowy składa się z procesora, pamięci operacyjnej (umieszczonych na płycie głównej) oraz urządzeń zewnętrznych, z których niektóre są lub mogą być zintegrowane z płytą (karta graficzne, sterowniki dysków i dyski, karta dźwiękowa, karta sieciowa, modem, monitor itp.). O tych elementach komputera mówimi jako o sprzęcie (hardware).
Czy wystarczają one, by za pomocą komputera wykonywać takie powszechne czynności jak np.:

  • pisanie i redagowanie dokumentów
  • obliczenia w arkuszu kalkulacyjnym
  • wyszukiwanie w bazach danych
  • przeglądanie zasobów Internetu
  • wysyłanie i odbieranie poczty elektronicznej

Odpowiedź jest negatywna. Nie wystarczy (nawet najnowocześniejszy) sprzęt.
Potrzebne jest jeszcze oprogramowanie ( software).

Program jest zakodowaną sekwencją instrukcji, które ma wykonać procesor (lub za jego pośrednictwem inne elementy sprzętowe).

Na przykład pisanie i redagowanie tekstów może się odbywać tylko dzięki temu, że działa odpowiedni program - edytor lub procesor tekstów. Programy takie są skomplikowane, często bardzo duże, ale w sumie sprowadzają się do pewnych sekwencji prostych instrukcji zlecanych do wykonania sprzętowi (przede wszystkim procesorowi).

Mówi się powszechnie, że instrukcje wykonuje program. Np. "program wykonał błędną instrukcję i nie może być kontynuowany". Takie sformułowania są wygodne i w pewnym sensie poprawne, pamiętajmy jednak o tym, że instrukcje są przekazywane do wykonania procesorowi.

Kiedy zatem siedzimy przed "czystą kartką" jakiegoś dokumentu i zastanawiamy się jak zacząć pisanie, to jakaś część działającego akurat programu-edytora śledzi klawiaturę (czeka na wprowadzenie znaku z klawiatury), a kiedy wciśniemy klawisz jakiegoś znaku - wykonuje instrukcje skutkujące w uwidocznieniu w określony sposób (rodzaj, wielkość, kolor pisma) tego znaku na ekranie monitora.

Zatem wykonanie programu polega na przekazywaniu instrukcji procesorowi. Ale przecież nie zawsze program się wykonuje. Co się wtedy z nim dzieje? Co musi się stać, żeby zaczął działanie?


Programy (jako zapisane ciągi instrukcji) rezydują na dysku twardym. Uruchomienie programu polega na załadowaniu go do pamięci operacyjnej i przekazaniu sterowania do pierwszej jego instrukcji. Tym zajmuje się specjalne oprogramowanie systemowe i wspomagające. Bez niego komputer nie mógłby działać, nie mógłby komunikować się z użytkownikiem, nie mógłby wykonywać - na jego zlecenie - określonych programów.

System operacyjny - to zbiór programów zajmujących się zarządzaniem zasobami komputera, obsługą systemu plików, uruchamianiem programów, przydzielaniem im czasu procesora i komunikacją między nimi oraz interakcją z użytkownikiem komputera.

Możemy zatem w tej chwili już z pewnością stwierdzić, że działanie komputera polega po prostu na wykonywaniu programow - czy to systemowych, czy to użytkowych.

Wszystkie programy komunikują się z procesorem w specjalnym języku. "Słowa" tego języka to liczby. Niektóre z tych liczb mają specjalne znaczenie - właśnie kodów instrukcji do wykonania (warto dodać, że bardzo prostych instrukcji; złożone programy składają się z bardzo dużej liczby takich prostych instrukcji). Inne liczby oznaczają dodatkową informację, która jest potrzebna przy wykonaniu instrukcji. Ta dodatkowa informacja stanowi zwykle dane nad którymi przeprowadzane są jakieś operacje (np. dodawanie liczb).
Taka cyfrowa reprezentacja instrukcji, zrozumiała przez procesor, nazywa się kodem maszynowym lub językiem maszynowym.

Przykładowa sekwencja instrukcji maszynowych hipotetycznego komputera może wyglądać tak:
10001010 10001000 00000001 11001010 .....

Cóż to za dziwne liczby składające się z samych zer i jedynek?
Jest to nic innego jak zapis informacji (w tym przypadku kodu programu) w języku maszynowym jako ciągu liczb w w systemie binarnym (zobacz tu o systemach liczbowych). Informacja "rozumiana" przez komputer musi być tak właśnie zapisywana, gdyż powszechnie stosowane urządzenia cyfrowe mają określone zbiory elmentarnych stanów, każdy z których może być charakteryzowany jako włączony (1) lub wyłączony (0).

Z tego wynika, że

Najmniejsza ilość informacji, którą może operować komputer - to cyfra 1 lub 0 w binarnej reprezentacji liczby.
Wielkość ta nazywana jest bitem.

Ważną rolę w informatyce odgrywa bajt.


Bajt = 8 bitów
(choć nie zawsze tak było ... zobacz ...tu ...)

Słowo maszynowe - to najmniejsza, adresowalna komórka pamięci operacyjnej, jak również - odpowiadający tej wielkości rozmiar rejestrów procesora, czyli specjalnego wewnętrznego układu pamięciowego, o bardzo szybkim dostępie, w którym procesor przechowuje chwilowo dane aktualnie wykonywanych operacji

W szczególności dlatego, że procesory operują na jednostkach, które nazywają się słowami maszynowymi, składających się z całkowitej liczby bajtów.
Bajt jest najmniejszszą częścią słowa maszynowego, dostępną bezpośrednio dla procesora. Kody instrukcji procesorów były i są jedno lub kilkubajtowe. Znaki (litery) były i są kodowane jako liczby jedno (np. kody ASCII, EBCDIC) lub wielo - bajtowe (np. DCSB lub Unicode).

A ponieważ pół bajta można przedstawić jako cyfrę szesnastkową, to heksadecymalny system liczbowy jest wygodniejszą (od binarnego, bo jest bardziej czytelny; ale i od dziesiętnego, bo widzimy w nim wyraźny podział na bajty) formą przedstawiania zapisu maszynowego kodu programu.


Fragment kodu maszynowego przedstawia rysunek obok. Po lewej stronie widzimy kolumnę względnych adresów przestrzeni adresowej programu, po niej następują ciągi instrukcji (kodów i danych).



Oczywiście, można napisać program w języku maszynowym. Ale domyślamy się, że jest to zadanie niezwykle pracochlonne, a pisanie w taki sposób programów - niezwykle niefektywne. A jednak - na samym początku epoki komputerów tak właśnie pisano programy.

Na pomoc biednym programistom pionierskiej epoki komputeryzacji przyszło stworzenie asemblerów - języków symbolicznego zapisu instrukcji maszynowych danego procesora.

Od tego momentu, program, który wcześniej trzeba było zapisywać np. tak:

5830 D252 5A30 D256 5030 D260

można było zapisać dużo prościej i bardziej zrozumiale, np:

Instrukcja assemblera Wyjaśnienie
L 3, X
do rejestru 3 załaduj liczbę znajdującą się w pamięci pod adresem oznaczonym symbolicznie przez X
A 3, Y
dodaj do zawartości rejestru 3 liczbę znajdującą się w pamięci pod adresem oznaczonym symbolicznie przez Y
ST 3, Z
zapisz nową zawartość rejestru 3 do pamięci pod adresem oznaczonym symbolicznie przez Z

Taki zapis - bardziej zrozumiały dla nas - jest jednak niezrozumiały dla procesora. Programy zapisane w symbolicznym języku assemblera, muszą być przetłumaczone na język maszynowy (ciąg cyfr binarnych) i tym zajmują się translatory (czasem zwane potocznie również assemblerami)..

Wszakże programowanie w języku assemblera jest wciąż uciążliwe. Co gorsza obarcza ono programistę obowiązkiem pamiętania różnych technicznych szczegółów (rejestry, ich numery, adresowanie pamięci), wymaga od niego zapisywania bardzo elementarnych operacji i nie pozwala dostatecznie skupić się na dziedzinie i logice rozwiązywanego (przez program) problemu.

W istocie w powyższym "programiku" chodzi o dodanie do siebie dwóch liczb (oznaczonych X i Y) i zapisanie wyniku jako Z.
Dlaczego by nie można napisać po prostu:

Z = X + Y ?

Dlatego pojawiły się języki programowania (ściślej - i dla odróżnienia od języków assemblera - języki programowania wysokiego poziomu), które w swoich instrukcjach, składni, semantyce konsolidują wiele prostych instrukcji assemblerowych, ukrywają ich techniczne szczegóły, i - w porównaniu z assemblerami - są składniowo niezależne od procesora. W tych językach naprawdę możemy napisać: Z = X + Y, nie martwiąc się rejestrami, względnym adresowaniem pamięci i zestawem rozkazów konkretnego procesora.
Użycie języków wysokiego poziomu wymaga jednak bardziej zaawansowanych środków tłumaczenia tekstu programu na instrukcje zrozumiałe dla procesora: kompilatorów i/lub interpreterów (o czym za chwilę).


 następny punkt »