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
  • 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 :)
  • 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.
\mathbb{N}\times\mathbb{N}

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