Języki i paradygmaty
programowania
II.
Wprowadzenie (c.d.)
2009-02-26
Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie (c.d.)
II
-2
2009-02-26
Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie (c.d.)
II
-3
III.
Programowanie funkcyjne
●
Program to po prostu złożona
funkcja (w sensie matematycznym)
,
która otrzymawszy dane wejściowe wylicza
pewien wynik
2009-02-26
Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie (c.d.)
II
-4
III.
Programowanie funkcyjne
●
Zasadniczą różnicą w stosunku do poprzednich
paradygmatów jest brak dostępu do stanu
maszyny
●
Nie ma zmiennych
●
A co za tym idzie, nie ma
żadnych efektów ubocznych
(rozumianych w sensie tradycyjnym, jako
zmiana wartości zmiennych)
2009-02-26
Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie (c.d.)
II
-5
III.
Programowanie funkcyjne
●
Nie ma tradycyjnie rozumianych pętli
(imperatywnych z natury)
●
Tradycyjne pętle wymagają bowiem zwykle
(poza przypadkami zdegenerowanymi, jak
pętle nieskończone) zmiennych (lub innego
dostępu do stanu maszyny) do sterowania ich
przebiegiem
2009-02-26
Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie (c.d.)
II
-6
III.
Programowanie funkcyjne
●
Konstruowanie programów to składanie funkcji
●
Zazwyczaj z istotnym wykorzystaniem
rekurencji (rekursji)
(tam, gdzie w programowaniu imperatywnym
wykorzystujemy pętle)
●
Charakterystyczne jest również definiowanie
funkcji wyższego rzędu
, czyli takich, dla
których argumentami i których wynikami mogą
być funkcje (a nie tylko „proste” dane jak
liczby lub napisy)
2009-02-26
Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie (c.d.)
II
-7
III.
Programowanie funkcyjne
2009-02-26
Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie (c.d.)
II
-8
2009-02-26
Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie (c.d.)
II
-9
IV.
Programowanie logiczne
●
Na program składa się
zbiór zależności (przesłanek)
oraz
pewne stwierdzenie/pytanie (cel)
2009-02-26
Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie (c.d.)
II
-10
IV.
Programowanie logiczne
●
Wykonanie programu to
próba udowodnienia celu
w oparciu o podane przesłanki
●
Obliczenia wykonywane są niejako „przy
okazji” dowodzenia celu
●
Podobnie jak w programowaniu funkcyjnym,
nie wydajemy rozkazów
,
a jedynie opisujemy,
co wiemy i co chcemy uzyskać
2009-02-26
Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie (c.d.)
II
-11
IV.
Programowanie logiczne
2009-02-26
Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie (c.d.)
II
-12
IV.
Programowanie logiczne
2009-02-26
Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie (c.d.)
II
-13
IV.
Programowanie logiczne
2009-02-26
Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie (c.d.)
II
-14
2009-02-26
Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie (c.d.)
II
-15
Inne paradygmaty
●
Programowanie na poziomie wartości
●
Programowanie na poziomie funkcji
●
Programowanie skalarne
●
Programowanie wektorowe/macierzowe
●
Programowanie zdarzeniowe
●
Programowanie z własnym wątkiem sterowania
●
Programowanie aspektowe
●
Programowanie uogólnione
●
Programowanie równoległe/współbieżne/rozproszone
2009-02-26
Jarosław Bylina :: Języki i paradygmaty programowania :: Wprowadzenie (c.d.)
II
-16
Języki a paradygmaty
●
asemblery, „stary” BASIC
–
p. imperatywne (proceduralne?)
●
„stary” Pascal, C, Fortran
–
p. imperatywne, proceduralne, strukturalne
●
C++, Object Pascal, Ada
–
p. imperatywne, proceduralne, strukturalne, obiektowe
●
Smalltalk, C#, Java
–
p. obiektowe
●
Lisp, Scheme, Logo, ML, Haskell
–
p. funkcyjne
●
Planner, Prolog
–
p. logiczne
●
Python
–
p. proceduralne, strukturalne, obiektowe, funkcyjne
●
SQL
–
p. deklaratywne (ani ściśle funkcyjne, ani ściśle logiczne)
2008-03-01
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
II
-17
Opisy języków programowania
●
składnia (syntaksa, gramatyka, forma)
●
semantyka (znaczenie, treść)
2008-03-01
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
II
-18
Składnia
●
Przyjmujemy, że mamy ustalony alfabet Σ
–
skończony i niepusty zbiór
●
Jego elementy nazywamy symbolami, znakami
lub literami
●
Zbiór wszystkich napisów, jakie można
utworzyć ze znaków alfabetu Σ, oznaczamy Σ*
●
Każdy podzbiór zbioru Σ* to pewien język
●
Innymi słowy: język to zbiór napisów
złożonych ze znaków danego alfabetu
2008-03-01
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
II
-19
Gramatyki
●
gramatyki regularne
–
do opisu leksemów czyli podstawowych
(atomowych) elementów języka, takich jak słowa,
liczby, identyfikatory...
–
wyrażenia regularne
●
gramatyki bezkontekstowe
–
do opisu składni, czyli wyglądu całych programów,
wyrażeń, instrukcji...
–
notacja BNF, EBNF
2008-03-01
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
II
-20
Semantyka
●
opis formalny
–
gramatyki atrybutowane
–
semantyka operacyjna
–
semantyka aksjomatyczna
–
semantyka denotacyjna
●
opis potoczny (naiwny, po ludzku)
2008-03-01
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
II
-21
Notacja BackusaNaura – (E)BNF
●
sposób zapisu gramatyk bezkontekstowych
●
definicja języka to zbiór reguł
●
ogólna postać reguły:
pojęcie ::= definicja-pojęcia
●
pojęcie to pojedynczy symbol nieterminalny
(pomocniczy)
●
definicja-pojęcia to ciąg symboli
terminalnych ujętych w cudzysłowy (to jest
należących do alfabetu języka) oraz
nieterminalnych
2008-03-01
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
II
-22
Rozszerzenia w EBNF
●
alternatywne warianty:
pojęcie ::= wariant1 | wariant2 | wariant3
●
opcjonalne części:
pojęcie ::= część-konieczna [ część-opcjonalna ]
●
wielokrotne powtórzenie:
pojęcie ::= część-konieczna { część-powtarzalna }
●
grupowanie:
pojęcie ::= ( coś | coś-innego ) coś-jeszcze-innego
2008-03-01
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
II
-23
Przykłady w EBNF
lista-identyfikatorów ::=
identyfikator { "," identyfikator }
pętla-dopóki ::=
"while" wyrażenie "do" instrukcja
podstawienie ::=
l-wartość ":=" wyrażenie
pętla-dopóki ::=
"while" "(" wyrażenie ")" instrukcja
Pascal
język C
2008-03-01
Jarosław Bylina :: Języki i paradygmaty programowania :: Zmienne i typy
II
-24
Architektura von Neumanna
●
Na razie wszystkie komputery działają
w oparciu o imperatywną
architekturę von Neumanna
●
Tak więc każdy program, który chcemy
uruchomić, musi być najpierw przetłumaczony
do ciągu rozkazów w języku wewnętrznym
konkretnej maszyny
●
Różne paradygmaty mogą wymagać
skomplikowanych metod tłumaczenia
;
różna jest też ich efektywność