Strona 1 z 18 Języki programowania zasady ich tworzenia Definicja 5 Językami formalnymi nazywamy każdy system, w którym stosując dobrze określone reguły należące do ustalonego zbioru, możemy uzyskać wszystkie zdania uznawane za komunikaty w tym języku. Elementami każdego języka są: - słownik nazywany również notacją. Jest to zbiór słów (symboli) oraz różnych znaków. Pewne ciągi słów rozpoznawane są jako poprawnie zbudowane zdania; - zbiór reguł gramatycznych określających, które ciągi słów są poprawnymi zdaniami; - zbiór reguł semantycznych określających sens poszczególnych zdań; - zbiór reguł pragmatycznych określających formy bliskoznaczne. Mariusz B. Bogacki 1
Strona 2 z 18 Pewien język Rozważmy zdanie: koty śpią. Słowo koty jest podmiotem, a słowo śpią jest orzeczeniem. Zdanie to należy do języka, którego składnia zdefiniowana może być następująca: <zdanie> ::= <podmiot><orzeczenie> <podmiot> ::= koty psy <orzeczenie> ::= śpią jedzą Z powyższej definicji wynika: 1. zdanie składa się z podmiotu i następującego po nim orzeczenia, 2. podmiotem jest pojedyncze słowo koty lub psy, 3. orzeczeniem jest słowo śpią lub jedzą. Mariusz B. Bogacki 2
Strona 3 z 18 Składnia lub syntaktyka Składnią języka nazywamy zbiór reguł lub formuł określających zbiór (formalnie poprawnych) zdań. W potocznym znaczeniu składnię kojarzymy z gramatyką danego języka. - stosować można jedynie specjalne kombinacje słów kluczowych oraz symboli (znaków). - Składnia języka nie tylko określa czy dany ciąg słów jest zdaniem, ale również jego strukturę pomocną w rozpoznawaniu znaczenia zdania. - Każda próba naruszenia przyjętej składni powoduje wygenerowanie przez komputer komunikatu obłędzie składniowym i zaprzestaniu wykonywania programu. - Do zapisu składni języków programowania często stosuje się tzw. notację Backusa Naura (notacja BNF Backus-Naur Form). Mariusz B. Bogacki 3
Strona 4 z 18 Składnia typowego języka programowania 1. zbiór znaków; - alfabet (duże i małe litery), - cyfry, - znaki działań arytmetycznych (np. + - / ^), - znaki działań logicznych (np. ), - znaki relacji (np. = < > ), - inne znaki (interpunkcyjne [,. ; : {spacja}], nawiasy (kwadratowe, półokrągłe, klamrowe), znaki specjalne (np. //), - zbiór słów kluczowych traktowanych jako niepodzielne symbole (np. begin, end, real, integer, if, for, do), 2. systematyczny opis struktur sterujących, 3. systematyczny opis sposobu definiowania struktur danych, 4. wzorce podstawowych instrukcji i struktur danych, 5. reguły budowania nazw: zmiennych, struktur danych, podprogramów i procedur, 6. zasady interpunkcji, stosowania komentarzy, itd., itp. Mariusz B. Bogacki 4
Strona 5 z 18 Algorytm sumowania liczb od 1 do N wczytaj N; X:=0; dla Y od 1 do N z krokiem 1 wykonaj X:=X+Y koniec; wypisz X. Mariusz B. Bogacki 5
Strona 6 z 18 Przykładowy opis instrukcji-dla w notacji BNF <instrukcja> ::= <instrukcja-dla> <instrukcjaprzypisania> <instrukcja-dla> ::= dla <nagłówek-dla> wykonaj <instrukcja> koniec Opis nagłówka: <nagłówek-dla> ::= <zmienna> od <wartość> do <wartość> <zmienna> od <wartość> do <wartość> z krokiem <wartość> <zmienna> ::= <litera> <zmienna><litera> <zmienna><liczba> <wartość> ::= <zmienna> <liczba> <liczba> ::= <cyfra> <liczba><cyfra> Mariusz B. Bogacki 6
Strona 7 z 18 Przykładowy opis sposobu definiowania tablic w notacji BNF <opis-tablic> ::= tablica <nazwa tablicy> [<wykaz-par-granicznych>] <typ> <nazwa-tablicy> ::= <litera> <nazwatablicy><litera> <nazwa-tablicy><liczba> <dolna-granica> ::= <liczba> <górna-granica> ::= <liczba> <para-graniczna> ::= <dolna-granica>:<górnagranica> <wykaz-par-granicznych> ::= <para-graniczna> <wykaz-par-granicznych>,<para-graniczna> <typ> ::= rzeczywista całkowita logiczna tablica TABL [5:123,0:10] całkowita; Mariusz B. Bogacki 7
Strona 8 z 18 Semantyka czyli znaczenie Semantyka zajmuje się badaniem znaczenia zdań i wyrazów. Reguły semantyczne podają: - znaczenie poszczególnych dopuszczonych przez składnię symboli, - sposób interpretacji poprawnych składniowo zdań, - sposób realizacji dopuszczalnych przez składnię struktur sterujących Mariusz B. Bogacki 8
Strona 9 z 18 Przykład reguł semantycznych definiujących poszczególne symbole Symbol Znaczenie + dodawanie - odejmowanie, zmiana znaku / dzielenie ^ czytaj zapisz potęgowanie wczytywanie danych z aktualnego urządzenia zewnętrznego zapisanie danych na aktualne urządzenie zewnętrznego Mariusz B. Bogacki 9
Strona 10 z 18 Przykład reguł semantycznych definiujących działanie potęgowania Potęgowanie a^b (a podstawa potęgi, b jej wykładnik) Typ b całkowity rzeczywisty Inne własności a b b>0 Wartość a^b a a a (a powtórzone b razy) a=0 b 0 nie określone a 0 b=0 1 lub 1.0 b<0 1/(a a a) (a powtórzone -b razy) a>0 exp(b ln(a) a=0 a<0 b>0 0.0 b 0 nie określone Typ a^b identyczny z typem a identyczny z typem a rzeczywisty Mariusz B. Bogacki 10
Strona 11 z 18 Przykład reguł semantycznych definiujących instrukcję dla Instrukcja dla najczęściej występuje w postaci: dla Z := A 1 z krokiem A 2 aż do A 3 wykonaj I gdzie Z jest zmienną, A 1, A 2, A 3 wyrażeniami arytmetycznymi, a I instrukcją. Podaną instrukcję dla rozumiemy następująco: (a) wykonać instrukcję podstawienia Z := A 1, (b) obliczyć wartość w wyrażenia (Z (A 3 )) sign(a 1 ), (c) Jeśli w 0, to wykonać instrukcję I oraz instrukcję podstawienia Z := Z + A 2, a potem powrócić do czynności (b) i tych, które następują po niej. Mariusz B. Bogacki 11
Strona 12 z 18 Problem pętli iteracyjnej Ile razy zostanie wykonana poniższa pętla iteracyjna: dla I:= 1 z krokiem 1 aż do -314.159 wykonaj I (1) I przybiera kolejno 316 różnych wartości 1, 0, - 1, -2,..., -313, -314. (2) I przybiera kolejno 317 różnych wartości 1, 0, - 1, -2,..., -313, -314, -315. (3) Być może pętla nie zostanie wykonana ani razu ponieważ liczba -314.159 jest mniejsza od 1, a pętle dla muszą zwiększać licznik, a nie zmniejszać go. Mariusz B. Bogacki 12
Strona 13 z 18 Problem zmiennych procedurowych Język dopuszcza zmienne, których wartościami są nazwy procedur. Wtedy nazwy procedur mogą wystąpić jako parametry innych procedur. procedura P z-parametrem V; wywołaj V koniec Mariusz B. Bogacki 13
Strona 14 z 18 Problem zmiennych procedurowych cd. Co będzie, gdy parametrem procedury V jest nazwa tej procedury? procedura P z-parametrem V; 1. wywołaj V z-parametrem V, umieszczając wynik w zmiennej X; 2. jeśli X=1, wróć i daj wynik 0; w przeciwnym razie wróć i daj wynik 1. Jaki będzie wynik wywołania? wywołaj P z-parametrem P 1. Wynikiem tego wywołania jest 0 gdy wywołanie V z-parametrem V (w rzeczywistości P z- parametrem P) da 1. 2. Jednakże P z-parametrem P da 1 gdy jako wynik uzyskamy 0. Program będzie oscylować między 0 a 1 Mariusz B. Bogacki 14
Strona 15 z 18 Pragmatyka czyli formy zbliżone Pragmatyka języka obejmuje zalecenia dotyczące używania różnych poprawnych zdań o zbliżonym znaczeniu semantycznym Przykład: Mnożyć czy dzielić? Z := 0.5 W lub Z := W/2 Potęgować czy mnożyć gdy wykładnik potęgowy b jest liczbą całkowitą? a^b lub a a a a (a powtórzone b razy) Mariusz B. Bogacki 15
Strona 16 z 18 Przykład: Ograniczona czy warunkowa pętla iteracyjna dla I od 1 do N wykonaj koniec. instrukcja I:=0 jeśli I<N wykonaj instrukcja; I:=I+1 koniec. Mariusz B. Bogacki 16
Strona 17 z 18 Przekształcenie programu wysokiego poziomu na kod maszynowy ALGORYTM A Program w języku wysokiego poziomu Ap Program w języku adresów symbolicznych As Program w języku maszynowy Am Programista (człowiek) Kompilator (program) Kompilator (program) Mariusz B. Bogacki 17
Strona 18 z 18 Sposoby tłumaczenia (translacji) programów komputerowych na kod maszynowy Kompilacja Kompilacja polega na wiernym przekładzie programu zapisanego w języku źródłowym na program zapisany w języku maszynowym jako całości. Oznacza to, że poszczególne instrukcje programu zapisane w języku wysokiego poziomu nie muszą mieć ścisłego odpowiednika w kodzie maszynowym (nie muszą być ich wiernym tłumaczeniem), a jedynie oddawać ich sens. Interpretacja Interpretacja polega na tłumaczeniu instrukcji programu komputerowego zapisanego w języku wysokiego poziomu w sposób wierny, wiersz po wierszu, na język niskiego poziomu. Mariusz B. Bogacki 18