17b. Programmeer-paradigma's
2021-04-23
slides.com/jod/pt_17b
Docent: Jo Devriendt
Assistent: Ann Philips
Coördinator: Joost Vennekens
voornaam.achternaam@kuleuven.be
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Paradigma
- Paradigma: een verzameling patronen en ideeën die een systeem karakteriseren
- Programmeerparadigma: patronen, ideeën en eigenschappen waarmee programmeertalen zich onderscheiden
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Programmeerparadigma's
Imperatief
Declaratief
- Procedureel
- Object-georiënteerd
- Functioneel
- Logisch
- Constraint programming &
wiskundig programmeren
...
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Imperatief
- Programma is een opeenvolging van commando's
- Computer loopt van commando naar commando en voert die uit
-
Toestand van programma is veranderlijk en programmeur moet hier rekening mee houden
- Bvb., de huidige waarde van een variabele
- Bvb., de call stack in het geheugen
- Nauw verbonden met klassieke computerarchitectuur
- machine-instructies, geheugenvelden, toestandsverandering
- gelijkaardig aan hoe een TM een functie uitrekent
- "Klassieke" programmeertalen
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Procedureel
- Imperatief paradigma met procedures als centraal bouwblok
- Oud: ontstaan in '50
- Relatief makkelijk te vertalen naar machine-instructies
-
Fortran (FORmula TRANslation)
- high-performance computing
- wetenschappelijke simulaties
-
COBOL (COmmon Business-Oriented Language)
- ontworpen voor de bedrijfswereld
- typisch voor mainframesystemen uit de jaren '60-'80
- C
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Object-geOriënteerd (OO)
- Imperatief paradigma met objecten als centraal bouwblok
- Object: groepering van gerelateerde variabelen (attributen) en procedures (methodes) via dezelfde datastructuur (klasse)
- Gelijkaardige objecten delen functionaliteit via overerving
typedef struct {
char naam[100];
} Persoon;
void print(Persoon* p){
printf("%s\n",p->naam);
}
typedef struct {
char naam[100];
int nummer;
} Student;
void print(Student* s){
printf("%s %d\n",s->naam,
s->nummer);
}
// C++
class Persoon {
protected: char naam[100];
public: void print(){
printf("%s\n",this->naam);
}
};
class Student: public Persoon {
int nummer;
public: void print(){
printf("%s %d\n",this->naam,
this->nummer);
}
};
Attribuut
Methode
Klasse
Overerving: elke Student is een Persoon
Verwijst naar de naam van Persoon
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Object-geOriënteerd (OO)
- Waarom OO? Objecten zijn weerspiegeling van concepten uit de echte wereld. Hoe dichter code aanleunt bij het probleemdomein, hoe makkelijker het programmeren.
- Vroegste roots liggen in '60 (Algol, Simula) en begin '70 (Smalltalk)
- Populair geworden eind '90 met de opkomst van C++ en Java
- C++
- doorontwikkeling van C met OO, standaard
datastructuren, templates, lambda expressions, ... - voor complexe systemen waar snelheid een must is,
bvb. een 3D game engine, besturingssysteem of server
- doorontwikkeling van C met OO, standaard
- Java
- draait in een virtual machine: geen compilatie nodig
- virtual machine beheert geheugen (geen malloc etc.)
- populair voor gedistribueerde systemen (webservers
en -clients)
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Declaratief
- Programma beschrijft wat de te berekenen functie is, ipv hoe de functie te berekenen
- Bvb. Fibonacci in Haskell:
- Geen dynamische toestand, alle variabelen hebben één onveranderlijke waarde
- nuttig voor asynchrone of parallelle programma's
- Flexibele volgorde van statements, geen call stack
- Geen geheugenbeheer
- Vaak gebaseerd op wiskundige formalismen
- Voor klassieke applicaties minder efficiënt dan imperatieve talen
fib :: Integer -> Integer
fib 1 = 0
fib 2 = 1
fib n = fib (n-1) + fib (n-2)
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Functioneel
- Declaratief paradigma met functies als centraal bouwblok
- Bvb. Fibonacci in Haskell:
(hoe werkt Fibonacci in C?)
- Bvb. lijst met kwadraat van alle even getallen via set comprehension in Python:
- Zelfde functionaliteit in C vereist
iteratie, selectie, geheugenbeheer,
dynamische variabelen
fib :: Integer -> Integer
fib 1 = 0
fib 2 = 1
fib n = fib (n-1) + fib (n-2)
{x*x for x in range(0,n) if x % 2 == 0}
Map-functie
Filter-functie
int result[100];
int size = 0;
for(int x=0; x<n; ++x){
if(x%2 == 0){
result[size]=x*x;
++size;
}
}
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Functioneel
- Gebaseerd op lambda calculus ('30, Alonzo Church)
- wiskundig formalisme voor berekeningsprocessen
- net zoals Turingmachines :)
- wiskundig formalisme voor berekeningsprocessen
- Eerste functionele programmeertaal: LISP in '50
- Meest populair momenteel is Haskell
- Vooral academisch gebruik, maar veel taalconstructies zijn later geïntroduceerd in populairdere programmeertalen
- Bvb. set comprehension in Python
- Bvb. lambda expressions in C++
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Logisch
- Declaratief paradigma met verzamelingen als centraal bouwblok
- gebaseerd op predikatenlogica
- Statements vormen regels (rules) "A :- B" die aangeven dat als een voorwaarde B waar is, dan ook een gevolg A
- Bvb. Fibonacci in Prolog:
fib(1,0).
fib(2,1).
fib(N,X) :- N>2,
N1 is N-1, fib(N1,X1),
N2 is N-2, fib(N2,X2),
X is X1+X2.
- fib is een deelverzameling van met als betekenis
"(n,x) ∈ fib asa x het n-de fibonaccigetal is" - fib(1,0) is waar - m.a.w., (1,0) ∈ fib,
- fib(2,1) is waar,
- fib(N,X) is waar asa: N>2, X is de som van X1 en X2, N1 is N-1, fib(N1,X1) is waar, N2 is N-2, en fib(N2,X2) is waar.
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Prolog
- Belangrijkste logische programmeertaal: Prolog uit '70
- Sterktes:
- recursie: zie torens van Hanoi in hst 18.6
- querying: een databank is een verzameling tupels
- kennisrepresentatie: bvb. gebruik in IBM's Watson
- Basis waaruit constraint programming gegroeid is
- Recente (academische) talen als ASP en FO(.) vertonen kenmerken van zowel Prolog als constraint programming
- Lange traditie aan de KU Leuven
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Constraint programming en wiskundig programmeren
Volgende lesvideo :)
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Worden programmeertalen steeds krachtiger?
Ja: steeds abstractere concepten kunnen op steeds natuurlijkere, compactere wijze uitgedrukt worden in nieuwere programmeertalen
Echter: er is geen zilveren kogel (die de weerwolf doodt)
There is no single development, in either technology or management technique, which by itself promises even one order of magnitude improvement within a decade in productivity, in reliability, in simplicity. [...] we cannot expect ever to see two-fold gains every two years [in software development, as Moore's law has shown in hardware development.]
- Fred Brooks in "There is no silver bullet", 1987
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Samenvatting
...
Imperatief
- Procedureel
- Object-georiënteerd
Declaratief
- Functioneel
- Logisch
- Constraint programming &
wiskundig programmeren
Maar er is helaas geen zilveren kogel
17b. Programmeerparadigma's
By Jo Devriendt
17b. Programmeerparadigma's
- 755