RTP

advertisement
RTP
Real-Time Programmatuur
hoofdstuk 4:
het beheersen van complexiteit:
programming in the large
Yolande Berbers
Programmatuur voor real-time controle
slide 1
RTP
karakteristieken van een RTS
(copie van slide van H1)
 groot en complex
 niet gewoon proportioneel met het aantal lijnen code, wel aan
de variëteit die in de code voorkomt
 verandert continu omdat de omgeving continu verandert
 kan variëren van enkele honderden lijnen assembler of C tot 20
miljoen lijnen Ada-code (geschat voor het ruimtestation
Freedom)
Yolande Berbers
Programmatuur voor real-time controle
slide 2
RTP

decompositie en abstractie
decompositie
 “verdeel en heers”-principe
 systematisch opsplitsen van een complex probleem in kleinere
en kleinere entiteiten
 totdat componenten geïsoleerd kunnen worden die
 begrepen en opgelost kunnen worden door individuen of
kleine groepen
 top down ontwerp

abstractie
 geeft de mogelijkheid om details van componenten naar een
latere fase te verschuiven en om de essentie van componenten
te specifiëren
 bottom up ontwerp
Yolande Berbers
Programmatuur voor real-time controle
slide 3
RTP evolutie in programmeertechnieken

procedurele programmering

modules voor informatieverberging

data abstractie

object georiënteerde programmering
Yolande Berbers
Programmatuur voor real-time controle
slide 4
RTP

kenmerken van programmeertechnieken
procedurale programmering
 centraal aandachtspunt:
gegevensstructuren en procedures die hierop werken
 programmeringsparadigma:
kies gegevensstructuren, procedures en algoritmen
 taal ondersteuning:
procedures, functies, parameters
 vb: Fortran77, Algol, Pascal, C
 grootste probleem:
bereik en zichtbaarheid van gegevensstructuren
Yolande Berbers
Programmatuur voor real-time controle
slide 5
RTP

kenmerken van programmeertechnieken
gegevensverberging (information hiding)
 centraal aandachtspunt:
module (gegevens + operaties op deze gegevens)
 programmeringsparadigma:
kies goede modules
 taal ondersteuning:
ondersteuning voor modules
 vb: Ada, Modula2 en in zekere opzichte C
 grootste probleem:
een module kan niet meerdere keren geïnstantieerd worden
(een module voor een lijst implementeert één lijst)
Yolande Berbers
Programmatuur voor real-time controle
slide 6
RTP

kenmerken van programmeertechnieken
data abstractie
 centraal aandachtspunt:

modules worden types


synoniemen: abstracte gegevenstypes,
gebruikersgedefinieerde types, klassen
waarvan variabelen (objecten) geïnstantieerd worden
 programmeringsparadigma:

kies de types; voorzie deze van operaties
 vb: Ada, C++, Java
Yolande Berbers
Programmatuur voor real-time controle
slide 7
RTP

kenmerken van programmeertechnieken
data abstractie (vervolg)
 taal ondersteuning:

alle mechanismen die toelaten om types door een gebruiker
gedefinieerd op dezelfde manier te gebruiken als
ingebouwde types
mechanismen voor het creëren (en vernietigen) van objecten
 mechanismen voor het initialiseren van objecten
 objecten gebruikt als parameters, als functieresultaat
 toekenningen, vergelijkingen, overladen van operatoren
 ...
 grootste probleem:
 het is niet mogelijk om een bestaand type aan te passen

Yolande Berbers
Programmatuur voor real-time controle
slide 8
RTP

kenmerken van programmeertechnieken
object-georiënteerde programmering
 centraal aandachtspunt
definieer basisklassen en algemene eigenschappen
 door over-erving (inheritance) andere klassen afleiden
 programmeringsparadigma
 kies goede klassen met goede operaties
 maak gemeenschappelijke dingen expliciet door over-erving
 taal ondersteuning
 klassenmechanismen met over-erving
 polymorfisme: operatie hangt af v dynamisch type parameter
 vb: Simula67, Smalltalk-80, C++, Eifel, Ada95, Java

Yolande Berbers
Programmatuur voor real-time controle
slide 9
RTP

modules
informele definitie van module
 verzameling logisch samenhangende objecten en operaties

encapsulatie
 een wel bepaalde functie isoleren in een module, en een
precieze specificatie maken voor de interface

modules geven ondersteuning voor
 gegevensverberging
 aparte compilatie
 abstracte gegevenstypes



C: zeer zwakke ondersteuning voor modules
Ada en Java: expliciete ondersteuning via packages
C++ : dynamische ondersteuning voor modules
Yolande Berbers
Programmatuur voor real-time controle
slide 10
RTP

gegevensverberging
Pascal (en andere eenvoudige programmeertalen):
 globale declaraties van

een variabele die door meerdere procedures gedeeld wordt

een variabele die gebruikt wordt bij elke oproep van een
bepaalde procedure
 nadelen

gevoelig aan fouten (bv gebruik van globale variabele daar
waar het niet mag)

moeilijk onderhoudbaar: slecht zicht op wat bij elkaar hoort

stroeve ontwikkelingsmogelijkheden: iets wijzigen aan de
globale variabelen vraagt de hercompilatie van heel de code
Yolande Berbers
Programmatuur voor real-time controle
slide 11
RTP

gegevensverberging
een module structuur
 zorgt voor beperkte zichtbaarheid door de mogelijkheid te
bieden om gegevens te verbergen in ‘lichaam’ van de module
 biedt een manier om de toegang tot de variabelen van de
module te controleren
 voorbeeld: implementatie van een dynamische FIFO-queue
 interface: 3 routines

toevoegen van een element

weghalen van een element

testen op het leeg zijn van de queue
 interne gegevens (bv pointer naar de queue) mogen niet
zichtbaar zijn buiten de module
Yolande Berbers
Programmatuur voor real-time controle
slide 12
RTP gegevensverberging: package in Ada

package heeft twee delen
 specificatie interface: dit is zichtbaar er buiten
 lichaam: dit is de implementatie, is onzichtbaar er buiten


het lichaam bevat een initialisatie-deel
beide moeten in hetzelfde declaratieve deel staan
 er mag wel iets tussen staan
 bv spec. pack. A, spec. pack. B, lichaam pack. A, lichaam pack. B
 op deze manier kunnen A en B elkaar oproepen



routines (en ge-exporteerde variabelen) kunnen bereikt
worden via naam_package.naam_routine
implementatie van slechts één instantie van de queue
de queue wordt gecreëerd in het initialisatie-deel
Yolande Berbers
Programmatuur voor real-time controle
slide 13
RTP gegevensverberging: package in Ada

specificatie interface: deze entiteiten zijn zichtbaar er buiten
package Queuemod is
function Empty return Boolean;
procedure Insert (E: Element);
-- Element moet zichtbaar zijn
procedure Remove (E: out Element);
end Queuemod;

voorbeeld van oproep:

lichaam : dit is de implementatie, zie volgende slide
Yolande Berbers
Queuemod.Insert (El);
Programmatuur voor real-time controle
slide 14
RTP gegevensverberging:
gegevensverberging:
package
in Ada
package
in Ada (vervolg)
packagebody Queuemod is
type ...
Q: Queue_Ptr_T;
procedure Create is
begin ... end Create;
function Empty return Boolean is
begin ... end Empty;
procedure Insert (E: Element) is
begin ... end Insert;
procedure Remove (E: out Element) is
begin ... end Remove;
begin
Create;
end Queuemod;
Yolande Berbers
Programmatuur voor real-time controle
slide 15
RTP gegevensverberging: package in Ada

use:
 om de naamgeving niet te zwaar te maken wanneer veel
elementen uit een package gebruikt worden
 naam_package.naam_routine wordt naam_routine
declare
use Queuemod;
begin
if not Empty then
Remove (E);
end if;
end;
Yolande Berbers
Programmatuur voor real-time controle
slide 16
RTP
gegevensverberging in C

C: geen taalconstructies voor gegevensverberging

modules kunnen nagebootst worden door code in
verschillende bestanden te plaatsen
 per module een ‘header-file’, deze eindigt op ‘.h’
 per module een ‘body-file’, deze eindigt op ‘.c’
 het header-bestand wordt ingelast in het .c-bestand
 geen formele relatie tussen deze bestanden, alleen naamconventie

nadelen:
 geen initialisatie-deel (initialisatie zal ergens expliciet moeten staan)
 minder testen door de compiler zijn mogelijk
 bv geen test op volledigheid specificatie tov lichaam en omgekeerd:
het ontbreken van een routine wordt slechts opgemerkt bij het linken
Yolande Berbers
Programmatuur voor real-time controle
slide 17
RTP

gegevensverberging in C
header-bestand (.h bestand): dit bestand definieert de
functionele interface van de module
int Empty();
void insertE (element E);
void removeE (element *E);


dit header-bestand moet ingelast worden in elk bestand dat van
de module wenst gebruik te maken (via #include-instructie)
implementatie staat in een .c bestand, zie volgende slide
Yolande Berbers
Programmatuur voor real-time controle
slide 18
RTP
gegevensverberging
in C
gegevensverberging
in C (vervolg)
#include “queuemod.h”
struct ...
void create()
{ ... }
int empty()
{ ... }
void insertE (element E)
{ ... }
void removeE (element *E)
{ ... }
Yolande Berbers
Programmatuur voor real-time controle
slide 19
RTP
gegevensverberging in C
queuemod.h
int Empty();
void insertE (element E);
void removeE (element *E);
queuemod.c
#include “queuemod.h”
put_in.c
#include “queuemod.h”
take_out.c
#include “queuemod.h”
….
….
….
int empty()
{ ... }
void insertE (element E)
{ ... }
element E1, E2;
insertE(E1);
insertE(E2);
element E3;
if !empty()
removeE(&E3)
….
….
….
Yolande Berbers
Programmatuur voor real-time controle
slide 20
RTP

tekortkomingen van modules
modules zijn geen eerste-klas-taalelementen
 moduletypes kunnen niet gemaakt worden

je kunt geen verschillende instanties van module creëren
 je kunt geen pointer naar een module laten wijzen
Yolande Berbers
Programmatuur voor real-time controle
slide 21
RTP

aparte compilatie
voordelen van het apart compileren van modules
 een module kan geschreven en getest worden,
onafhankelijk van rest van programma
 eens getest kan de module in een bibliotheek geplaatst worden,
eventueel reeds gecompileerd
 aparte compilatie ondersteunt projectbeheer
 voordeel dat niet alles telkens gehercompileerd moet worden
(dat geldt natuurlijk vooral voor ‘programming in the large’)

aparte compilatie ondersteunt bottom-up ontwerp
 vooral bottom-up ontwerp van specificaties is interessant
Yolande Berbers
Programmatuur voor real-time controle
slide 22
RTP
aparte compilatie in C
queuemod.h
int Empty();
void insertE (element E);
void removeE (element *E);
queuemod.c
#include “queuemod.h”
put_in.c
#include “queuemod.h”
take_out.c
#include “queuemod.h”
….
….
….
int empty()
{ ... }
void insertE (element E)
{ ... }
element E1, E2;
insertE(E1);
insertE(E2);
element E3;
if !empty()
removeE(&E3)
….
….
….
Yolande Berbers
Programmatuur voor real-time controle
slide 23
RTP


aparte compilatie in Ada
with-constructie: gebruik van een package uit bibliotheek
(een beetje te vergelijken met #include van C)
een with-constructie kan in een andere package staan:
zo ontstaat een hiërarchie van modules
 vb: module Dispatcher maakt gebruik van module Queuemod
package Dispatcher is
... -- nieuwe zichtbare entiteiten
end Dispatcher;
with Queuemod;
package body Dispatcher is
... -- verborgen entiteiten
end Dispatcher;
Yolande Berbers
Programmatuur voor real-time controle
slide 24
RTP

aparte compilatie in Ada
voordelen
 specificatie en lichaam zijn expliciet in de bibliotheek
 bibliotheek is deel van Ada-omgeving met tools
 specificatie kan geschreven worden vóór het lichaam

logische consistentie kan reeds door compiler getest worden

specificatie kan geschreven worden door project-leiders
Yolande Berbers

specificatie is een deel van ontwerpen

uitwerken van specificatie is vaak programming in the small

fout in specificatie heeft grotere gevolgen dan fout in lichaam:
alle modules die de specificatie gebruiken moeten eventueel
gewijzigd worden

(bij fout in een lichaam: enkel dit lichaam hercompileren)
Programmatuur voor real-time controle
slide 25
RTP

aparte compilatie
Ada
 aparte compilatie is deel van de taal


bibliotheekomgeving is deel van taal

consistentie van specificaties en types gebeurt over
bibliotheekeenheden
C
 aparte compilatie is geen deel van taal

C-bestand worden apart gecompileerd: object modules

object modules worden gelinked

bij het linken wordt niet gechecked op specificatieconsistentie en types
Yolande Berbers
Programmatuur voor real-time controle
slide 26
RTP
abstracte gegevenstypes

uitbreiding van idee dat gebruikers van een type niets
hoeven te weten van de precieze voorstellingskeuze van
dit type (bv lijst, enkel of dubbel gelinkt, circulair of niet, ..)

lost één van de tekortkomingen van modules op

ADT (abstract data type) = module dat een type definieert
 type bepaalt: objecten en operaties
 definitie van een type impliceert dat er variabelen van dit type
kunnen gedeclareerd worden
 een creatie-routine is hier absoluut noodzakelijk

alle OO-talen bieden dit (dus ook Java)
Yolande Berbers
Programmatuur voor real-time controle
slide 27
RTP

abstracte gegevenstypes
extra moeilijkheid wanneer gecombineerd met aparte compilatie
 normaal wensen we dat de interne voorstelling van het type
verborgen wordt, zich dus in het lichaam bevindt
 module dat gebruik maakt van een ADT moet het volgende kennen:
de operaties (= specificatie, de interface)
 de grootte van het ADT (dit is nodig voor de compilatie van
de gebruikmakende module)
 mogelijke oplossing: gebruik van een indirectie
 altijd een pointer gebruiken naar het ADT: een pointer heeft
een vaste grootte (vaak gebruikt in C)
 in Ada: interne voorstelling wordt bij specificatie gevoegd
 als limited private
 als private (dan zijn ook toekenning en vgl mogelijk)

Yolande Berbers
Programmatuur voor real-time controle
slide 28
RTP

abstracte gegevenstypes in C
voorbeeld van gebruik van indirectie in C: als extra parameter
wordt hier nu altijd een pointer naar het object gebruikt
int empty(queue_ptr_t Q);
void insertE
(queue_ptr_t Q, element E);
void removeE (queue_ptr_t Q, element *E);
Yolande Berbers
Programmatuur voor real-time controle
slide 29
RTP abstracte
abstractegegevenstypes
gegevenstypesin
inAda
Ada
package Complex_Arithmetic is
type Complex is private;
function ”+” (X, Y: Complex) return Complex;
function ”-” (X, Y: Complex) return Complex;
function Comp (A, B: Float) return Complex;
function Real_Part (X: Complex) return Float;
private
type Complex is
record
Real_Part: Float;
Imag_Part: Float;
end record;
end Complex_Arithmetic;
Yolande Berbers
Programmatuur voor real-time controle
slide 30
RTP abstracte gegevenstypes in Ada
with Complex_Arithmetic;
use Complex_Arithmetic;
….
C1, C2, C3: Complex;
A, B: float;
….
C2 := Comp(A, B);
C3 := C1 + C2;
if C1 = C2 then …. end if;
….
Yolande Berbers
Programmatuur voor real-time controle
slide 31
RTP object-georiënteerd programmeren

verder uitbreiding van ADT
(variabelen van de ADT worden objecten genoemd)

4 extra kenmerken
 uitbreidbaarheid van type (over-erving)
 automatische initialisatie van objecten (constructors)
 automatische destructie van objecten (destructors)
 soort operatie wordt pas bij uitvoering bepaald (polymorfisme)


probleem bij real-time programma's: polymorfisme maakt het niet
mogelijk om via de code te weten welke operatie opgeroepen zal
worden: moeilijk om nodige tijd te schatten
ondersteund in Ada en Java
 Ada: object-oriëntatie van Ada zullen we niet gebruiken in deze cursus
 Java: zie MI, IPS of POO
Yolande Berbers
Programmatuur voor real-time controle
slide 32
RTP

OOP en Java
sleutelwoord extends
 geeft aan dat een klasse van een andere is afgeleid
 public class Coordinate { .. }
// voor 2-dimensionaal werken
 public class ThreeDimension extends Coordinate { … } // voor 3-dimensies
 nieuwe velden kunnen toegevoegd worden
 extra operaties kunnen gedefinieerd worden
 bestaande operaties kunnen ge-herdefinieerd worden, en mogen in hun
definitie gebruik maken van oorspronkelijke operatie

abstracte klasse
 hier kunnen geen objecten van gedeclareerd worden
 moet via over-erving concreet gemaakt worden

finale klasse
 hiervan kan men niet over-erven
Yolande Berbers
Programmatuur voor real-time controle
slide 33
RTP



herbruikbaarheid
herbruikbaarheid is veelbelovend voor softwareproductie,
maar niet zo eenvoudig
overerving is een goed middel
ander middel: een sjabloon
 type is generisch en wordt pas bepaald bij instantiatie
 uitwerking in Ada, C++ en Java
generic modules in Ada
 template in C++
 interfaces in Java: werkt iets anders (zie volgende slides)
 componenten kunnen geïnstantieerd worden van een sjabloon
 voorbeeld: een ADT dat een queue van elementen beheert, het
type van de elementen wordt in het sjabloon nog niet bepaald

Yolande Berbers
Programmatuur voor real-time controle
slide 34
RTP

Java: interfaces
interfaces
 om relaties te leggen buiten klasse-hierarchie
 zijn altijd abstract: geen declaratie van instanties van interface
 speciale vorm van klasse met methods en constanten
 meerdere andere klassen kunnen een interface implementeren
public interface Ordered {
boolean lessThan (Ordered O);
};
 lessThan neemt als par. elk object dat Ordered interface impl.
Yolande Berbers
Programmatuur voor real-time controle
slide 35
RTP
Java: klasse die interface impl.
class ComplexNumber implements Ordered {
protected float realPart;
protected float imagPart;
public boolean lessThan(Ordered O) // interface implementation
{
ComplexNumber CN = (ComplexNumber) O; // cast the parameter
if((realPart*realPart + imagPart*imagPart) <
(CN.getReal()*CN.getReal() + CN.getImag()*CN.getImag()))
{ return true; }
return false;
};
public ComplexNumber (float I, float J) // constructor
{ realPart = I; imagPart = J; };
public float getReal() { return realPart;};
public float getImag() { return imagPart; };
}
Yolande Berbers
Programmatuur voor real-time controle
slide 36
RTP
Java: interfaces
public class ArraySort
{
public static void sort (Ordered oa[], int size) //sort method
{
Ordered tmp;
int pos;
for (int i = 0; i < size - 1; i++) {
pos = i;
for (int j = i + 1; j < size; j++) {
if (oa[j].lessThan(oa[pos])) {
pos = j;
}
 sort is een routine die een
}
tmp = oa[pos];
array van objecten kan
oa[pos] = oa[i];
sorteren van elke klasse die
oa[i] = tmp;
de interface Ordered
};
implementeert
};
Yolande Berbers
Programmatuur voor real-time controle
slide 37
Download