Wprowadzenie do programowania strukturalnego.
Język programowania – C/C++.
Zagadnienia:
1. Pojęcia elementarne z zakresu architektury i programowania komputerów.
2. Systemy liczbowe.
3. Etapy tworzenia programu.
4. Podział języków programowania.
5. Język C/C++ - krótka charakterystyka.
Pojęcia elementarne
1. Bit
Pozycja rejestru lub komórki pamięci służąca do przedstawiania (pamiętania) cyfry
w systemie (liczbowym) dwójkowym. Może przyjmować dwa stany 0 lub 1.
4. Rejestr
Pamięć o pojemności jednego słowa lub jego części lub wielokrotności o dużej
szybkości dostępu. Rejestry stanowią ważną część architektury procesora.
3. Bajt
Ciąg ośmiu bitów, stanowiący porcję informacji, przechowującą jeden znak
alfanumeryczny lub liczbę z zakresu 0-255.
2. Słowo
Ciąg bitów, stanowiących porcję danych.
Ustalona dla danego komputera (procesora) pojemność komórki pamięci (rejestru).
Najczęściej słowo jest wielokrotnością bajtu.
Pojęcia elementarne
5. Rozkaz
a) Elementarna operacja wykonywana przez procesor, np.:
- dodaj dwie liczby,
- odejmij od akumulatora,
- pomnóż,
- podziel,
- załaduj do rejestru,
- skocz do etykiety,
- złóż na stosie.
Każdy procesor posiada tzw. listę rozkazów. Listy rozkazów mogą być
długie (rozbudowane) – procesory z rozkazami multimedialnymi lub
krótkie (zredukowane) – architektura typu RISC . Rozkazy z listy
rozkazowej w przedstawione w postaci mnemonicznej składają się na język
asemblera danego procesora.
b) Sekwencja bitów stanowiąca kod polecenia dla procesora.
6. Akumulator
Wyróżniony rejestr procesora, biorący udział w operacjach arytmetycznych
i logicznych, często z założenia dane aby operacja była przeprowadzona
muszą znajdować się właśnie w akumulatorze. Akumulatorów może być
więcej niż jeden.
Pojęcia elementarne
7. Pamięć
Jeden z podstawowych modułów komputera mogący przyjmować,
przechowywać (pamiętać) i udostępniać dane w postaci niezmienionej. W
pamięci przechowywane są dane oraz programy. Pamięć jest
charakteryzowana przez dwa podstawowe parametry:
-
pojemność (wyrażaną w: B, KB, MB, GB, TB),
-
czas dostępu (ms, ns)
8. Plik
Najmniejszy adresowalny zbiór (danych lub program) przechowywany w
pamięci zewnętrznej.
Pliki mogą zawierać dane lub programy. Dane mogą być w postaci
tekstowej (znakowej) lub binarnej (określonej standardem lub w postaci
dowolnie określonych, z poziomu programu, rekordów).
Pojęcia elementarne
9. System plików
Sposób organizacji plików w danym systemie operacyjnym. Najczęściej
spotykaną jest struktura hierarchiczna wykorzystująca system katalogów plików
(grup).
10. Komputer cyfrowy
Urządzenie (zespół urządzeń) działających automatycznie, służących do
przetwarzania danych w postaci dyskretnej (cyfrowej).
Pojęcia elementarne
14. Algorytm
Sekwencja (zbiór) dokładnie określonych (jednoznacznych) czynności wraz
kolejnością ich wykonywania (porządkiem).
15. Program komputerowy
Algorytm zapisany w języku programowania (zapisany na nośniku w postaci
pliku źródłowego lub wykonywalnego).
16. Instrukcja
Elementarny składnik programu opracowywanego przez programistę.
Instrukcja przekłada się na jeden lub więcej rozkazów procesora.
Pojęcia elementarne
17. Język programowania
Język formalny zapewniający komunikację człowieka (programisty) z
komputerem przeznaczony do opisu danych oraz algorytmów ich
przetwarzania w komputerze.
18. Język formalny
Odpowiednio zorganizowany system określonych znaków, których
znaczenie jest dokładnie zdefiniowane oraz zbiór reguł postępowania
uwzględniający zasady przyjętej gramatyki formalnej.
20. Składnia i semantyka języka programowania
Inaczej alfabet i gramatyka języka programowania.
Pojęcia charakteryzujące język programowania. Składnia języka jest to zbiór
sekwencji znaków dopuszczalnych w danym języku programowania.
Semantyka języka jest to znaczenie poszczególnych sekwencji znaków.
Systemy liczbowe
System liczbowy (system liczenia) jest to
zbiór znaków (cyfr) i zasady ich uporządkowania, pozwalające dokonać
zapisu dowolnej liczby i przyporządkować jej określoną nazwę.
Powszechnie stosowanym jest system liczbowy pozycyjny, w którym stosuje
się zapis pozycyjny. W systemie pozycyjnym dowolną liczbę przedstawia się
wg zależności:
gdzie:
L – wartość liczby w systemie dziesiętnym,
N- podstawa systemu liczbowego,
n- numer pozycji,
- współczynnik (cyfra) przyjmujący wartości z przedziału [0,N-1].
0
0
1
1
1
1
0
1
1
....
......
N
a
N
a
N
a
N
a
a
a
a
a
L
n
n
n
n
n
n
+
+
+
+
=
=
−
−
−
n
a
Podstawa systemu liczbowego jest jego wyróżnikiem . W zależności od
podstawy mamy do czynienia z:
-
systemem dwójkowym (binarnym) – N=2, cyfry 0 i 1;
10101011=
-
systemem ósemkowym (oktalnym) – N=8, cyfry 0-7,
253=
zapis liczby w C++ > 0253
-
systemem dziesiętnym (decymalnym) – N=10, cyfry 0-9;
171=
-
systemem szesnastkowym (heksadecymalnym) – N=16, cyfry 0-9 i A-F.
AB=
zapis liczby w C++ > 0xAB
Należy zwrócić uwagę na fakt, iż systemy ósemkowy i szesnastkowy są
pochodną systemu dwójkowego, stąd łatwość ich zamiany.
Systemy liczbowe
171
2
*
1
2
*
1
2
*
0
2
*
1
2
*
0
2
*
1
2
*
0
2
*
1
0
1
2
3
4
5
6
7
=
+
+
+
+
+
+
+
171
8
*
3
8
*
5
8
*
2
0
1
2
=
+
+
171
10
*
1
10
*
7
10
*
1
0
1
2
=
+
+
171
16
*
11
16
*
10
0
1
=
+
Etapy tworzenia programu
Błędy logiczne
Kod wynikowy
Konserwacja programu (usuwanie
błędów wykrytych na etapie
użytkowania, zmiany inicjowane
przez użytkownika.
Błędy logiczne
Kod wynikowy
Testowanie programu (usuwanie
błędów logicznych- program działa
lecz nie tak jak powinien).
Błędy wykonania
Kod wynikowy (binarny,
maszynowy)
Uruchamianie – scalanie programu i
wykorzystywanych podprogramów
bibliotecznych (usuwanie błędów
wykonania np. dzielenie przez zero) .
Błędy syntaktyczne
Kod źródłowy, plik tekstowy
Kompilacja, edycja (usuwanie błędów
kompilacji, syntaktycznych).
Kod źródłowy, plik tekstowy
Zapis algorytmu w języku
programowania.
Błędy
Wynik etapu
Nazwa etapu
Podział języków programowania
Wyróżniamy kilka kryteriów podziału języków programowania.
1.
Kryterium poziomu – języki: niskiego, wysokiego poziomu.
2.
Kryterium sposobu wykonania programu – języki: kompilowane,
interpretowane.
3.
Kryterium modularyzacji – języki: strukturalne, niestrukturalne.
Podział języków programowania
Języki niskiego i wysokiego poziomu
Język niskiego poziomu – asembler
•
Instrukcje asemblera są wiernym odwzorowaniem listy rozkazowej
procesora, co za tym idzie, programy w asemblerze są dedykowane
na jeden lub co najwyżej pewną rodzinę procesorów, są
nieprzenoszalne.
•
W asemblerach brak jest kontroli zakresów.
•
Brak instrukcji iteracji.
•
Brak jest ograniczeń w operacjach na danych, rejestrach (operacje na
bitach, flagach).
•
Mała złożoność kompilatora (asemblera).
Podział języków programowania
Języki niskiego i wysokiego poziomu
Język wysokiego poziomu – Modula-2, Ada, Pascal, COBOL, FORTRAN
•
Posiadają rozbudowany alfabet (duża liczba słów kluczowych),
instrukcje warunkowe i iteracji.
•
Duża złożoność kompilatorów.
•
Ś
cisła typizacja danych, kontrola zakresów dla tablic.
•
Ograniczenia w operacjach na danych, rejestrach (operacje na bitach,
flagach).
•
Większa przenoszalność programów napisanych języku wysokiego
poziomu w porównaniu z asemblerami (poziom systemu
operacyjnego).
A język C/C++ ?
Języki kompilowane i interpretowane
Kompilatory i interpretery są programami działającymi na kodzie
ź
ródłowym. Ich zadaniem jest tłumaczenie kodu źródłowego na język
zrozumiały dla procesora, który jest wykonawcą wszystkich programów.
Interpreter - wczytuje wiersze kodu źródłowego programu i wykonuje
zawarte w nich instrukcje (tłumaczy na język maszynowy). Oznacza to,
ż
e programy napisane w języku interpretowanym muszą być wykonywane
za pośrednictwem interpretera.
Kompilator - wczytuje cały program i przekształca go (tłumaczy) na kod
wynikowy (maszynowy lub binarny). Wynikiem działania kompilatora ( i
konsolidatora, który dołącza skompilowane funkcje biblioteczne) jest
binarny plik wykonywalny, uruchamiany z poziomu systemu
operacyjnego.
Strukturalne i niestrukturalne języki programowania
Językiem strukturalnym nazywamy język ze strukturą blokową
pozwalający definiować funkcje i procedury (także je zagnieżdżać).
Cechą charakterystyczną języków strukturalnych jest to, iż umożliwiają
ukrycie przed pozostałymi częściami programu instrukcji
pozwalających na wykonanie określonego zadania. Taką własność
nazywa się modularyzacją. Własność tą osiąga się poprzez stosowanie
właśnie podprogramów (procedur i funkcji) korzystających z
tymczasowych zmiennych lokalnych.
Dodatkową korzyścią stosowania podprogramów jest możliwość
wielokrotnego ich wykorzystania w różnych miejscach programu.
Języki strukturalne nie posiadają (lub nie zaleca się korzystania z)
instrukcji skoku
goto
. Oferowane przez nie instrukcje iteracji
umożliwiają pełną implementację algorytmów.
Jezyk C/C++ - krótka historia
Twórcą języka C jest Denis Ritche (lata siedemdziesiąte XX wieku).
Pierwsza implementacja miała miejsce na komputerze DEC PDP-11 (w
Polsce znane jako MERA) z systemem UNIX.
Przez wiele lat standardem C była wersja rozprowadzana z systemem
UNIX wersja V (opis – rok 1978).
Opracowanie standardu ANSI C - rok 1983, a jego przyjęcie – rok 1989.
Standard ANSI C jest honorowany przez większość kompilatorów C++.
Język C++ stanowi rozszerzenie języka C, powstał już w roku 1983
początkowo pod nazwą „C with Classes”, jego autorem jest Bjorne
Struostrup z Bell Laboratories. C++ powstał zatem aby umożliwić
programowanie zorientowane obiektowo.
Standard ANSI C++ został zatwierdzony w roku 1994.
Jezyk C/C++ - krótka charakterystyka
Język C/C++ jest językiem posiadającym cechy zarówno języka wysokiego jak i
niskiego poziomu, bywa nazywany językiem średniego poziomu.
Umożliwia wykonywanie operacji na bitach, bajtach i adresach (wskaźnikach).
Występują w nim typy danych, choć nie należy do języków ze ścisłą kontrolą typów.
Można na przykład zamiennie używać typu
char
i
int
. W instrukcjach przypisania C
dokonuje automatycznej konwersji typów. Nie sprawdza czy zostały przekroczone
zakresy tablic.
Posiada stosunkowo małą liczbę słów kluczowych (32 w ANSI C + 30 w ANSI C++).
Jest językiem nie w pełni strukturalnym, gdyż nie umożliwia zagnieżdżania definicji
funkcji.
C++ jest językiem zorientowanym obiektowo, przez co umożliwia programową
realizację wielkich projektów (opracowywanych przez wielu programistów).
Nadal posiada cechy języka niezwykle elastycznego wykorzystywanego do
rozwiązywania różnych zadań. Począwszy od realizacji oprogramowania
systemowego poprzez edytory tekstów na bazach danych kończąc.