Języki programowania II
Elementy języków programowania
Olsztyn 2005
Wojciech Sobieski
Elementy JP
Języki programowania wymyślono po to, by można było dzięki nim
tworzyć różnorodne programy komputerowe. Oczekuje się również, że
tworzone aplikacje będą wykonywać swoje zadania w sposób
jednoznaczny i zgodny z określoną na etapie projektowania specyfikacją
wymagań - języki programowania muszą się więc opierać na ogólnie
obowiązujących zasadach logiki i arytmetyki. Z tego też względu, można
wyodrębnić w strukturach różnych języków szereg elementów
uniwersalnych, spełniających w nich analogiczną rolę.
Elementy JP
1. Ściśle określony zbiór znaków i symboli.
Używanie znaków niedozwolonych spowoduje wystąpienie błędów
podczas translacji kodu źródłowego. Zakres znaków obejmuje duże i małe
litery alfabetu (rozróżniane bądź nie), cyfry oraz znaki specjalne i symbole
wieloznakowe. Mimo, że wiele języków programowania posiada podobny
zestaw znaków dopuszczalnych, niektóre z nich mogą mieć zupełnie inne
znaczenie. Przykładem może być znak “//” - w FORTRANIE służący do
łączenia łańcuchów tekstowych, zaś w PASCALU do oznaczenia wiersza
komentarza.
Elementy JP
Zestaw znaków i symboli dopuszczalnych
w językach Fortran G77 oraz Free Pascal.
Elementy JP
2. Skończona (zazwyczaj) liczba słów kluczowych i deklaratorów.
Słowa kluczowe są to określone zbiory znaków posiadające konkretne
znaczenie dla translatora (najczęściej są to wyrazy z języka angielskiego,
np. WRITE, READ, PROGRAM, FOR, DO, PROCEDURE, FUNCTION,
itd.).
Elementy JP
Zestaw słów kluczowych występujących
w językach Fortran G77 oraz Free Pascal.
Elementy JP
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 prawdopodobieństwo wystąpienia błędu. W przypadku braku
automatycznego wyróżnienia należy stosować duże i mał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, czyli słowa
odpowiadające za określanie obiektów lub ich właściwości.
Elementy JP
Edi
Elementy JP
ConText
Elementy JP
3. Ściśle określona struktura i zasady pisania kodu źródłowego.
Kod źródłowy składa się z przynajmniej jednego modułu (programu),
który musi mieć sztywno określoną budowę. Moduł musi posiadać
wyraźnie określony początek i koniec, obszary deklaracji obiektów i
typów występujących zmiennych oraz obszary zawierające bloki
instrukcji, funkcji lub procedur. Budowa kodu źródłowego zależy w
decydujący sposób od rodzaju języka i sposobu realizacji drogi punktu
sterowania.
Zasady pisania kodów źródłowych w językach
Fortran G77 oraz FreePascal.
Elementy JP
Fortran
Pascal
1.Używanie jedynie znaków dopuszczalnych.
2.Brak rozróżnienia znaków pisanych małą lub
wielką literą.
3.Znaków narodowych nie należy używać
(nawet w komentarzach).
4.Nazwy (identyfikatory) stałych, zmiennych,
podprogramów, funkcji, itp. powinny
zaczynać się od litery i nie powinny być
dłuższe niż 6 znaków (słowa kluczowe mają
budowę identyfikatorów, ale mogą być
dłuższe).
5.Treść instrukcji wpisuje się między 7 a 72
kolumną. Nie ma obowiązku zaczynania od 7
kolumny. Znaki za 72 kolumną są ignorowane.
6.Odstępy umieszczane w instrukcjach są
ignorowane – nie ma różnicy pomiędzy np.
GOTO i GO TO.
1.Używanie jedynie znaków dopuszczalnych.
2.Brak rozróżnienia znaków pisanych małą lub
wielką literą.
3.Znaków narodowych nie należy używać
(nawet w komentarzach).
4.Nazwy (identyfikatory) stałych, zmiennych,
podprogramów, funkcji, itp. powinny
zaczynać się od litery – długość dowolna.
5.Treść instrukcji wpisuje się w dowolnej
kolumnie.
6.Odstępy umieszczane w instrukcjach są
ignorowane – nie ma różnicy pomiędzy np.
x:=4 a x := 4.
Elementy JP
Fortran
Pascal
7.W celu zwiększenia czytelności programu
należy stosować wcięcia – szczególnie podczas
stosowania instrukcji zagnieżdżonych.
8.W jednym wierszu może znajdować się tylko
jedna instrukcja.
9.Instrukcje przypisania realizowane są za
pomocą znaku „=”.
10.Na końcu wiersza nie stawia się żadnego
znaku.
11.Poszczególne bloki programu zaczynają się
i kończą w dowolny sposób.
12.Główny blok programu rozpoczyna się
słowem PROGRAM z nazwą, a kończy
słowem END. Po END nie stawia się kropki
13.Warunki arytmetyczne i logiczne określone
są znakami literowymi.
7.W celu zwiększenia czytelności programu
należy stosować wcięcia – szczególnie podczas
stosowania instrukcji zagnieżdżonych.
8.W jednym wierszu może znajdować się kilka
instrukcji, np. if x=1 then y:=1 else y:=2;.
9.Instrukcje przypisania realizowane są za
pomocą znaku „:=”.
10.Na końcu wiersza zazwyczaj jest średnik.
11.Poszczególne bloki programu zaczynają się
i kończą w dowolny sposób, ale muszą być
umieszczone między słowami BEGIN i END.
12.Główny blok programu rozpoczyna się
słowem PROGRAM z nazwą, a kończy
słowem END z kropką na końcu.
13.Warunki arytmetyczne określane są
znakiem „=”.
Elementy JP
Fortran
Pascal
14.Jedna instrukcja może zajmować
maksymalnie 20 wierszy, przy czym pierwszy
wiersz nazywa się wierszem początkowym, a
pozostałe wierszami kontynuacji. Każdy
wiersz kontynuacji należy zaznaczyć poprzez
umieszczenie w szóstej kolumnie znaku
różnego od zera i spacji.
15.W programie należy umieszczać
komentarze – zaczynają się one znakiem „*”,
„C” lub „!”. Komentarze można dodawać na
początku linii lub w dowolnym jej miejscu.
Wiersze z samymi spacjami traktowane są jak
wiersze komentarzy.
16.W kolumnach 1-5 można wpisywać tzw.
etykiety – niepowtarzalny ciąg cyfr –
identyfikujące określone miejsce w programie.
14.Jedna instrukcja może zajmować dowolną
liczbę wierszy.
15.W programie należy umieszczać
komentarze. Bloki komentarza ujmuje się w
nawiasy klamrowe:
{
komentarz...
}
16.Brak etykiet (istneje możliwość
zaznaczania miejsc w kodzie poleceniem
LABEL).
Elementy JP
Fortran
Pascal
17.Numery etykiet powinny być nadawane w
odstępach (standardowo co 10) – daje to
możliwość dopisania nowych etykiet
pomiędzy już istniejące.
18.W programie najpierw umieszcza się
deklaracje a dopiero po nich instrukcje.
19.Deklaracja zmiennych: typ nazwa
20.Zmienne są lokalne, tzn. obowiązują w
obszarze jednego modułu. Wymiana wartości
odbywa się poprzez odpowiednie instrukcje.
21.Podczas pisania programów należy dążyć
do zminimalizowania liczby zmiennych.
22.Należy dbać o przejrzystość i czytelność
kodu – dlatego też zaleca się stosowanie
podprogramów i funkcji.
17.-
18.W programie najpierw umieszcza się
deklaracje a dopiero po nich instrukcje.
19.Deklaracja zmiennych: nazwa : typ
20.Zmienne mogą być lokalna oraz globalne
(zależy to od miejsca deklaracji).
21.Podczas pisania programów należy dążyć
do zminimalizowania liczby zmiennych.
22.Należy dbać o przejrzystość i czytelność
kodu – dlatego też zaleca się stosowanie
podprogramów i funkcji.
Elementy JP
4. 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 pewnych logicznych zasadach, nie może
dochodzić do sytuacji, w których translator nie wie o jaki moduł, funkcję
czy procedurę chodzi. Większość języków programowania kontroluje,
przynajmniej w podstawowym zakresie, nazwy poszczególnych struktur i
zgłasza błędy o powtarzających się nazwach lub ich błędnej budowie.
Elementy JP
Przykłady poprawnego i błędnego deklarowania nazw
w językach Fortran G77 oraz Free Pascal.
Elementy JP
5. Konieczność komunikacji z użytkownikiem.
Potrzeba taka dotyczy również innych urządzeń komputera, a także zapisu
i odczytu danych z plików. Czynności takie nazywane są operacjami
wejścia-wyjścia. Standardowo do komunikacji z użytkownikiem służy
klawiatura (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 z
oczekiwaniami. Podczas wyprowadzania danych na monitor (lub do pliku)
należy ustalić ich format (wygląd). Podczas zapisu (odczytu) danych do
pliku należy dodatkowo określić rodzaj pliku.
Elementy JP
6. Potrzeba sterowania formatem (wyglądem) zmiennych.
Formatowanie jest dokonywane podczas wyprowadzania wartości danych
na ekran monitora lub podczas zapisu do plików. Formatowanie
zmiennych nie zawsze jest konieczne (każdy język programowania
posiada domyślne sposoby zapisu poszczególnych typów zmiennych) ale
może być bardzo przydatne – można zażądać, aby wszystkie liczby miały
tą samą ilość znaków i były zapisane np. w postaci wykładniczej o
określonej liczbie cyfr po przecinku.
Elementy JP
7. Konieczność jawnego lub niejawnego deklarowania typów zmiennych.
Rozróżnia się typ cał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ów umożliwia tworzenie własnych
typów lub struktur danych o bardziej złożonej budowie. Odpowiednie
dobranie typów zmiennych pozwala zaoszczędzić pamięć operacyjną oraz
skrócić czas wykonywania obliczeń. Często istnieje konieczność
konwersji typów, czyli zamiany zawartości jednego typu na inny.
Elementy JP
Należy pamiętać, że nie każdy rodzaj konwersji jest możliwy
(przykładowo: nie da się zamienić łańcucha liter na liczbę) i że nie zawsze
konwersja jest dokładna (np. podczas konwersji zmiennej rzeczywistej na
całkowitą traci się część ułamkową). Konwersję wykorzystuje się między
innymi podczas używania kodów ASCII (często stosowane w
FORTANIE), wyprowadzania danych na ekran monitora (OBJECT
PASCAL) lub dostosowywania do innych standardów danych (np.
konwersja typów STRING i PCHAR w języku OBJECT PASCAL).
Elementy JP
Typy występujących zmiennych oraz ich zakresy
w języku Fortran G77.
Elementy JP
Typy występujących zmiennych oraz ich zakresy
w języku Free Pascal.
Elementy JP
8. Potrzeba wymiany danych między różnymi modułami (podprogramami,
funkcjami i procedurami).
Sposób wymiany danych (wartości zmiennych) zależy w dużej mierze od
organizacji i struktury konkretnego języka programowania. Podstawowe
metody to:
●
deklarowanie wspólnych bloków pamięci,
●
deklarowanie wspólnych adresów pamięci,
●
deklarowanie bloków zawierających zbiory zmiennych
przenoszenie wartości zmiennych w nagłówkach nazw
procedur i funkcji,
●
podział zmiennych na zmienne lokalne i publiczne,
●
ładowanie pliku wejściowego,
●
wykorzystanie plików (zapis i odczyt).
Elementy JP
9. Potrzeba wykonywania działań na zmiennych.
Rozróżnia się trzy podstawowe rodzaje zmiennych: liczbowe, tekstowe i
logiczne, przy czym każda grupa wymaga innego podejścia. Zdarza się, że
języki programowania (szczególnie starsze) są ukierunkowane na jeden
rodzaj danych. Działania na zmiennych wymagają stosowania operatorów,
relacji, wyrażeń, instrukcji, funkcji lub procedur.
Elementy JP
10. 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, a następnie
zapisują wyniki do 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 jego implementacji możliwości w tym
zakresie są bardzo zróżnicowane.
Elementy JP
11. Potrzeba komunikacji z systemem operacyjnym.
Przydatnym elementem języka programowania jest możliwość korzystania
w funkcji systemu operacyjnego. Jest to zazwyczaj 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.
Elementy JP
12. Potrzeba zarządzania pamięcią operacyjną komputera.
Istnieją dwa podstawowe rodzaje zarządzania pamięcią: statyczne i
dynamiczne. Zarządzanie statyczne polega na ścisłym przydzielaniu
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 posiada takich ograniczeń, a pamięć
operacyjna przydzielana jest automatycznie, w zależności od potrzeb.
Elementy JP
13. Potrzeba obsługi błędów (wyjątków).
Jest to konieczne ze względu na dwa podstawowe czynniki: 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).
Zmienne i stałe
Zmienna - jest to symboliczna nazwa komórki w pamięci operacyjnej
komputera i służy do zapisu wartości liczbowej, tekstowej, logicznej, itd.
Zmienne są podstawowym elementem algorytmu obliczeniowego.
W czasie działania programu wartości przypisane zmiennym mogą się
dowolnie zmieniać, 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).
Zmienne i stałe
Zmienna indeksowana (tablica) – 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 do zapisywania list,
wektorów i tablic. Maksymalna ilość wymiarów zmiennej indeksowanej
jest zależna od języka programowania.
Zmienne i stałe
Stała – jest to symboliczna nazwa komórki w pamięci operacyjnej
komputera i również służy do zapisu określonej wartości. Różnica
pomiędzy zmienną a stałą jest taka, że wartości stałej nie można zmienić
podczas wykonywania obliczeń. Deklaracja stałej i nadanie wartości
realizuje się odpowiednią instrukcją.
Zmienne i stałe
Podział zmiennych i stałych ze względu na typ:
●
zespolone,
●
rzeczywiste,
●
całkowite,
●
logiczne,
●
walutowe,
●
daty lub czasu,
●
tekstowe.
Podział zmiennych i stałych ze względu na sposób deklaracji:
●
deklarowane jawnie,
●
deklarowane niejawnie.
Zmienne i stałe
Podział zmiennych i stałych ze względu na dokładność (dotyczy
zmiennych zespolonych i rzeczywistych):
●
o pojedynczej precyzji,
●
o podwójnej precyzji.
Podział zmiennych i stałych ze względu na strukturę:
●
prosty,
●
indeksowany (wektory i tablice).
Zmienne i stałe
Podział zmiennych i stałych 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 dowolnej ilości bajtów.
Podział zmiennych i stałych ze względu na sposób przydziału pamięci:
●
statyczne,
●
dynamiczne.
Wyrażenia
Wyrażenia arytmetyczne – służą do obliczania wartości zmiennych
liczbowych na podstawie wzorów matematycznych.
W wyrażeniach arytmetycznych mogą wystąpić następujące elementy:
●
stałe arytmetyczne,
●
odwołania do zmiennych,
●
odwołania do elementów tablic,
●
wywołania funkcji wewnętrznych i zewnętrznych.
Wyrażenia
Wyrażenia realizowane są przy pomocy operatorów (znaków dodawania,
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żeniu biorą udział zmienne różnych typów.
Kolejność wykonywania operacji zależy od priorytetu operatora, wg
kolejności: potęgowanie, mnożenie i dzielenie oraz dodawanie i
odejmowanie. Kolejność wykonywania działań można dowolnie zmienić
stosując nawiasy.
Elementy JP
Rodzaje operatorów arytmetycznych
w językach Fortran G77, Free Pascal, BASIC i C++.
Fortran
+ - * / **
Pascal
+ - * / ** div mod shl shr
BASIC
+ - * / ↑ (**)
C++
+ - * / * % ++ -- << >>
Wyrażenia
Wyrażenia tekstowe – służą do przetwarzania zmiennych tekstowych (np.
tworzenie podłańcuchów) oraz do zbierania określonych informacji (np.
określanie długości łańcucha, położenia określonego znaku w łańcuchu,
itp.). Elementami wyrażeń tekstowych są:
●
stałe i zmienne tekstowe,
●
podłańcuchy,
●
wywołania funkcji tekstowych.
Wyrażenia
Wyrażenia relacji – służą do porównania wartości dwóch wyrażeń
arytmetycznych lub logicznych. Dostępne operatory relacji to znaki:
●
mniejsze niż,
●
mniejsze lub równe,
●
równe,
●
nierówne,
●
większe lub równe,
●
większe niż.
Wyrażenia
Operatory relacji mogą być zapisywane symbolami matematycznymi lub
tekstowymi w zależności od języka programowania. Często zdarza się, że
operator relacji nie pokrywa się z operatorem przypisania - poniżej
przedstawiony jest przykład:
Wyrażenia
Wyrażenia logiczne – służą do 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ść.
Wyrażenia
Podane operatory zostały uporządkowane według priorytetów, czyli
kolejności w jakiej wykonywane są operacje podczas wyznaczania
wartości wyrażenia logicznego. Argumenty operatorów logicznych muszą
być typu logicznego. Kiedy dwa następujące po sobie w wyrażeniu
operatory 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ów w porządku (operator w
środku). Jeżeli w jakimś wyrażeniu występują jednocześnie operatory
arytmetyczne, relacji i logiczne, to kolejność wykonywania działań jest
następująca:
●
operacje arytmetyczne,
●
operacje relacji,
●
operacje logiczne.
Wyrażenia
Tabela wyrażeń logicznych.
Olsztyn 2005
Dziękuję za uwagę
Wojciech Sobieski