Deze samenvatting
+380.000 andere samenvattingen
Een unieke studietool
Een oefentool voor deze samenvatting
Studiecoaching met filmpjes
Onthoud sneller, leer beter. Wetenschappelijk bewezen.

PREMIUM samenvattingen zijn gecontroleerd op kwaliteit en speciaal geselecteerd om je leerdoelen nog sneller te kunnen bereiken!

Samenvatting - Concepten van programmeertalen
-
1 Waarden en typen
-
Cardinaliteit (van een verzameling of type S)
Aantal elementen van S.
In het tekstboek genoteerd als #S.
[T2.2]
-
Geef een beschrijving van het begrip waardeEen waarde is elke entiteit die tijdens een berekening kan ontstaan
-
Cartesisch product (van twee verzamelingen)
Verzameling van geordende paren, waarbij het eerste element van elk paar uit de eerste verzameling komt en het tweede element uit de tweede verzameling.
[C1.3.1]
-
Geef een beschrijving van het begrip typeEen type is een verzameling van waarden met bijbehorende operaties
-
Conditionele expressie
Expressie die meer deelexpressies bevat, waarvan er - afhankelijk van de uitkomst van een of meer voorwaarden - slechts één berekend wordt en waarvan het resultaat tevens de waarde van de hele expressie vormt.
[T2.6.4]
-
Geef een beschrijving van het begrip statische typeringBij statische typering heeft elke variabele en daarmee elke expressie een vast type dat zonder het programma uit te voeren gecontroleerd kan worden (gedeclareerde type)
-
Construction
Expressie die uit componentwaarden een samengestelde waarde maakt.
Ook: constructie, aggregate.
[T2.6.2]
-
Geef een beschrijving van het begrip samengesteld typeEen samengesteld type is een type waarvan de waarden samengesteld zijn, zoals bijvoorbeeld tuples, structures, records, arrays, algabraric types, discriminated records, objects, unions, strings, trees, ists, etc.
-
Discreet type
Type waarvan de waarden een 1-op-1-relatie hebben met (een deelverzameling van) de verzameling gehele getallen.
[T.2.2.3]
-
In welke 4 structureringsconcepten kunnen we samengestelde typen onderverdelen?- cartesisch product (tupels en records
- mappings (arrays)
- disjoint unions (algabraic types, discriminated records en objects)
- recursive types(trees, lists) -
Discriminated record
Implementatie van disjuncte vereniging in talen als Pascal en Ada.
Ook: discriminant.
[T2.3.3]
-
Geef een beschrijving van het begrip dynamische typeringBij dynamische typering kan het type van de variabele gedurende de uitvoering van het programma veranderen (actuele type). Typecontrole vindt plaats tijdens de verwerking. Bijvoorbeeld in Javascript a="tekst", a=10.
-
Disjuncte vereniging (van twee verzamelingen)
Verzameling waarden waarin elke waarde óf uit de ene óf uit de andere verzameling is gekozen en waarin elke waarde voorzien is van een tag (discriminant), die aangeeft uit welke verzameling de waarde is gekozen.
Ook: disjoint union
[T2.3.3]
-
Geef een beschrijving van het begrip standaard typeDe types die standaard in een programmeertaal aanwezig zijn
-
Dynamische typering
Mechanisme waarbij alleen de waarden (en dus niet de variabelen) vaste typen bezitten en waarbij de typecontrole plaatsvindt tijdens de verwerking van het programma.
[T2.5.1]
-
Geef en beschrijving van het begrip discreet typeBij een discreet primitief type hebben de waarden een 1 op 1 relatie met een bereik van integers
-
Eerste-klaswaarde
Waarde die in een bepaalde taal centraal staat en waarop (vrijwel) alle soorten operaties die in de taal mogelijk zijn, zijn toegestaan.
Ook: first-class value
[T2.5.3]
-
Geef een beschrijving van het cartesisch productSxT heeft als waardenverzameling tweetallen, met een eerste element van type S en een tweede element van type Y (aanwezig in Haskell in de vorm van tupels , in Java als klassetype)
In de verzamelingenleer is het cartesisch product of de productverzameling van twee verzamelingen de verzameling van alle koppels of geordende paren (a,b) waarvan a uit de eerste en b uit de tweede verzameling komt. Het cartesisch product van twee verzamelingen A en B wordt genoteerd als AxB.Voorbeeld A={1,2} en B={3,4,5}, dan is AxB={(1,3),(1,4),(1,5),(2,3),(2,4),(2,5)} -
Statische typeringMechanisme waarbij elke variabele of parameter een vast, door de programmeur gekozen type heeft en waarbij de typecontrole op grond van de programmatekst mogelijk is en al tijdens de vertaalfase plaatsvindt.
[T2.5.1] -
Enumeration type
Type, waarvan de (namen van) waarden expliciet zijn opgesomd.
Ook: opsommingstype
[T2.2.2]
-
Geef een beschrijving van het begrip recursief typeEen recursief type is een type die gedefinieerd wordt in termen van zichzelf
-
Expressie
Programmafragment dat geëvalueerd kan worden en daarbij een waarde oplevert.
[T2.6]
-
Geef een beschrijving van het begrip disjuncte verenigingS+T heeft als waardenverzameling de waarden van S en T, waarbij te onderscheiden is uit welk van de twee verzamelingen de waarden afkomstig is (aanwezig in Haskell als datatype, in Java aanwezig als interfacetype met voor ieder component van de vereniging een klasse die de interface implementeert.
-
Geef een beschrijving van het begrip cartesisch product<TODO>
-
WaardeElke entiteit die tijdens de uitvoering van een programma of berekening kan worden uitgerekend of opgeslagen, opgenomen kan worden in gegevensstructuur, meegegeven kan worden als parameter, resultaat is van een functieaanroep, enzovoort. Anders gezegd: elke entiteit die tijdens een berekening kan bestaan .
Ook: value
[T2.1] -
Functie f: S -> T
Voorschrift dat bij elke waarde x uit S (het domein van de functie) precies één waarde uit T (het bereik) oplevert.
Ook: mapping
[T2.3.2]
-
Geef een beschrijving van het begrip functieruimteS->T heeft als waardenverzameling de funties van S naar T (in Haskell aanwezig als functies, in Java alleen aanwezig in de vorm van arrays)
-
Functieaanroep
Expressie verkregen door een functieabstractie toe te passen op een of meer actuele parameters.
Ook: function call
[T2.6.3]
-
Geef een beschrijving van het begrip type-equivalentieBij naamequivalentie zijn 2 tpen gelijk als ze dezelfde naam hebben. Bij structuurequivalentie zijn 2 typen gelijk als ze dezelfde structuur(verzameling waarden) hebben. Java maakt gebruik van naamequivalentie.
-
Geef een beschrijving van het begrip type-equivalentie<TODO>
-
Functie(abstractie)
Implementatie van een (wiskundige) functie door middel van een algoritme dat voor elke waarde uit het domein (het argument) de bijbehorende functiewaarde (het resultaat) berekent.
[T2.3.2]
-
Geef een beschrijving van het begrip structurele equivalentieBij structuurequivalentie zijn 2 typen gelijk als ze dezelfde structuur(verzameling waarden) hebben
-
Functieruimte (S -> T)
Verzameling van alle afbeeldingen f: S -> T waarvoor geldt dat als x tot S behoort, f(x) tot T behoort.
[T2.3.2]
-
Geef een beschrijving van het begrip naamequivalentieBij naamequivalentie zijn 2 typen gelijk als ze dezelfde naam hebben.
-
Homogeen (van lijst of tupel)
Een tupel heet homogeen als alle componenten van de tupel uit dezelfde verzameling gekozen worden.
[T2.3.1]
Een lijst heet homogeen als alle elementen uit de lijst van hetzelfde type zijn.
[T2.4.1]
-
Geef een beschrijving van het begrip constructie
Een constructie is een expressie die een composite waarde van zijn component waarden construeert. Bijvoorbeeld het volgende Java object constructie:
new Date(today.m, size(today.m)).
Een Java constructie is een call naar een operatie, die constructor genoemd wordt. het effect van een constructor aanroep is om een nieuw object aan te maken van een bepaalde klasse, de constructor zelf wordt gedefinieerd als deel van de klasse zelf. -
Infix-notatie
Notatiewijze waarbij een (binaire) operator tussen zijn operanden wordt geschreven (in tegenstelling tot prefix en postfix).
[T2.6.3]
-
Geef een beschrijving van het begrip functieaanroepEen functieaanroep berekent een resultaat door een functieprocedure toe te passen op 1 of meer argumenten
-
Letterlijke waarde
Speciale vorm van een expressie die gebruikt wordt om waarden van standaardtypen aan te duiden.
Ook: literal
[T2.6.1]
-
Geef een beschrijving van het begrip conditionele expressieEen conditionele expressie berekent een waarde die afhangt van een conditie. Het heeft 2 of meer subexpressie, waarbij er exact 1 uitgekozen wordt om geevalueert te worden
-
Lexicografische ordening
Ordening van lijsten waarbij het eerste element bepalend is, tenzij het eerste element gelijk is; in dat geval beslist het tweede element, tenzij dat ook gelijk is, enzovoort. Als een van de twee lijsten een beginstuk is van de andere, dan is de lengte bepalend.
[T2.4.2]
-
Geef van de verschillende soorten typen voorbeelden in de talen Jave en HaskellHaskell
- primitieve typen -> Int, Integer, Float, Double, Char
- andere typen -> Bool, Rational
samengestelde waarden: lijsten, tupels, dataconstructies
- Haskell kent geen deelintervaltype
- Een opsommingstype (enumeration type) is in Haskell geen primitief type, maar kan wel gecreerd worden met behulp van constructiefuncties zonder parameter
Java
- primitieve type -> byte, short, int, long, char, float, double en boolean
- samengestelde waarden (arrays, objecten)
- Java kent geen deelintervaltype, maar kan wel worden gecreerd met behulp van een klasse van type enum -
Lijstcomprehensie
Notatie waarmee een lijst wordt opgebouwd door een expressie te evalueren in een omgeving, waarbij een variabele alle waarden van een lijst doorloopt.
[T2.6.5]
-
Noem de 4 structureringsconcepten met behulp waarvan we samengestelde typen kunnen karakteriseren en herken de verschillende samengestelde typen uit Java en Haskell1. cartesische producten: bijvoorbeeld een set van ale paren van (x,y), SxT={(x,y)|xeS,yeT}. Bijvoorbeeld S={u,v} en T={a,b,c} dan is SxT={(u,a),(u,b),(u,c),(v,a),(v,b),(v,c)}. De kardinaliteit is 2x3=6
2. mappings: S->T staat voor alle mappings van S naar T. De kardinaliteit van S->T is #(S->T)=(#T)^(#S)
3. disjoint unions: Hierbij wordt een waarde gekozen van 1 of meerdere (meestal verschillende) sets. S+T. #(S+T)=#S+#T
4. recursieve typen: Is een type die gedefinieerd wordt in termen van zichzelf. 2 Gebruikelijke recurcieve typen zijn lists (een sequence van waarden) en strings (een sequence van karaketers). -
Naamequivalentie
Vorm van type-equivalentie, waarbij twee typen alleen equivalent zijn als ze op dezelfde plaats gedefinieerd zijn.
[T2.5.2]
-
Geef de formules waarmee de verschillende kardinaliteiten van de verschillende samengestelde typen kunnen worden berekend en pas deze toe
Cartesisch product: S x T:
- Cardinaliteit: #(S x T) = #S x #T
Disjuncte vereniging: S + T
Cardinaliteit: #(S + T) = #S + #T
Functieruimte: S -> T
Cardinaliteit: #(S -> T) = #T^#S -
Postfix-notatie
Notatiewijze waarbij een operator achter zijn operanden wordt geschreven (in tegenstelling tot infix en prefix).
[T2.6.3]
-
Geef de manieren waarop in verschillende talen strings zijn gedefinieerd en geef aan welke consequenties een dergelijke keuze heeft voor de manier waarop we operaties op strings aan de taal kunnen toevoegen1. Strings als primitieve waarde classificeren: ML gebruikt deze manier. De basis string operatie moet dan ingebouwd zijn; ze kunnen dan niet gedefinieerd worden in de taal zelf
2. Strings behandelen als een array van karakters: ADA gebruikt deze manier. Hierdoor zijn alle gebruikelijke operaties die gelden voor een array ook toe te passen op strings. Consequentie is dat een sring hierdoor een fixed lenght krijgt
3. Strings als pointers naar arrays van karakters behandelen: C en C++ gebruiken deze manier
4. Strings als lijst van karakters behandelen: Haskell en Prolog gebruiken deze manier. Hierdoor komen alle gebruikeleijke list operaties ook toegankleijk voor strings
5. Strings als objecten te behandelen: Wordt in een objectgeorienteerde taal gebruikt, bijv, Java. Op deze manier kun je strings gebruiken met methoden die alle benodigde operaties heeften niet het nadeel van het behandelen van strings als speciale cases van list of arrays. -
Prefix-notatie
Notatiewijze waarbij een operator voor zijn operanden wordt geschreven (in tegenstelling tot infix en postfix).
[T2.6.3]
-
Leg het verschil uit tussen statisch en dynamisch getypeerde programmeertalen en geef enkele relevante voorbeelden van beide klassen van talen en geef de voor en nadelen van beide benaderingenStatisch getypeerd
- Elke variabele expressie heeft een fixed type. hierdoor kunnen de types gecontroleerd worden gedurende compilatie. De meeste high-level talen zijn statisch getypeerd, bijvoorbeeld C++
Dynamisch getypeerd
- Waarden hebben een fixed type, maar variabelen en expressies hebben dit niet. Elke keer dat er een operand berekend wordt, kan het een waarde van een verschillend type zijn. Dus de operand meot gecontroleerd worden op type nadat ze berekend worden, maar voordat de operatie uitgevoerd wordt, dus tijdens run-time. Talen: Smalltalk, Lisp, Prolog, Perl en Python
Voor en nadelen
- Static typing is efficienter. Dynamische typing heeft veel run-time type checks nodig, die het programma vertraagd tijdens excecutie. Static typing heeft alleen compile-time checks nodig. Dynamic typing heeft het nodig dat alle waarden getagged worden en dit heeft strage space nodig. Static typing heeft dit niet nodig.
- Static typing is veiliger. De compiler kan verifieren dat het programma geen type errors heeft. Dynamic typing heeft dit niet. Type errors zorgen voor veel programma fouten.
- Dynamic typing is flexibeler, dat nodig is voor sommige applicaties, waarbij het type van data niet op voorhand bekend is.
Laatst toegevoegde flashcards
[T2.5.1]
Ook: value
[T2.1]
b Wederzijdse uitsluiting is geïmplementeerd met de synchronizedclausules.
b Nee, er is geen sprake van polymorfisme. Er kunnen, zoals in a al gezegd, verschillende instanties van type Box worden gemaakt, maar elke keer betreft het een instantie van een monomorf type, bijvoorbeeld Box, Box, enzovoort.
8a Het cartesisch product modelleren we in Java met behulp van een klassetype met voor elke eigenschap een attribuut:
class Persoon {
String naam;
int leeftijd;
boolean isMeerderjarig() {
return leeftijd > 17;
}
}
8b Het cartesisch product modelleren we in Haskell met een typedefinitie voor een tweetupel:
type Persoon = (String, Int)
isMeerderjarig :: Persoon -> Bool
isMeerderjarig (_, leeftijd) | leeftijd > 17 = True
| otherwise = False
8c Om in Java het cartesisch product uit te breiden is het voldoende om een attribuut adres van type String toe te voegen. De methode isMeerderjarig hoeft niet aangepast te worden.
Om in Haskell het cartesisch product uit te breiden moeten we het type Persoon veranderen in een drietupel waarin ook een string voor het adres is opgenomen. Daarnaast moet de definitie van de methode isMeerderjarig veranderd worden. Het patroon dat gebruikt wordt voor de parameter moet drie elementen bevatten in plaats van twee.
8d De conclusie is afhankelijk van de gegeven implementatie voor 8a, 8b en 8c. Belangrijk is dat uw conclusie overeenstemt met het voorgaande. In onze implementatie is uitbreiding makkelijker in Java omdat er slechts een attribuut toegevoegd moet worden. In Haskell moet ook de functie aangepast worden aan de wijziging.
Scripttalen worden gebruikt om subsystemen, die in verschillende talen zijn geprogrammeerd, met elkaar te laten werken. Als onderdeel daarvan moet allerlei data van verschillende typen verwerkt worden. Scripts kunnen sneller geschreven worden als het type van de variabelen en parameters niet van tevoren gedeclareerd hoeven te worden.
Een variabele in Prolog is een onveranderbare variabele. De variabele, waarvan de
naam begint met een hoofdletter, staat voor een vaste maar onbekende waarde van
een willekeurig type.
We geven hier een voorbeeld uit het tekstboek waar de variabele P staat voor
venus, earth, mars, enzovoort:
?– planet(P).
Logisch programmeren is gebaseerd op de gedachte dat we programma’s kunnen
ontwerpen door beweringen over een probleem te noteren in logische formules.
Vervolgens zijn die formules zodanig te interpreteren, dat de oplossing voor het
beschreven probleem automatisch kan worden afgeleid.
Alternatief antwoord: Een logisch programma bestaat uit een specificatie van
relaties waarvan bepaald kan worden voor welke waarden van de parameters deze
geldig zijn.
In de for-lus gebeurt het ophogen van de waarde van x in drie stappen: eerst wordt
de waarde van x uit het geheugen gelezen, dan wordt de waarde verhoogd en
tenslotte wordt de verhoogde waarde teruggeplaatst in het geheugen.
Stel, twee threads voeren de for-lus tegelijk uit. Het volgende scenario is mogelijk:
Thread 1: leest x, waarde x in het geheugen is 7
Thread 1: verhoogd x, waarde is nu 8
Thread 2: leest x, waarde x in het geheugen is 7
Thread 1: schrijft de waarde van x, waarde x in het geheugen is nu 8
Thread 2: verhoogd x, waarde is nu 8
Thread 2: schrijft de waarde van x, waarde x in het geheugen is nu 8.
Voeren de twee threads de for-lus achter elkaar uit, dan is de waarde van x na
afloop 9. Er is dus een verschil in uitkomst.
Voor de methode verhoogX kunnen we een synchronized-clausule gebruiken:
private int x = 0;
public synchronized void verhoogX() {
for (int i = 0; i < 10000000; i++) {
x = x + 1;
}
}
NB Het is niet mogelijk om een synchronized-opdracht (blok-opdracht) te
gebruiken waarbij we op attribuut x synchroniseren. Het attribuut x is namelijk
geen object maar een primitief type.
Een race condition treedt op wanneer twee of meer processen of threads in staat
zijn om tegelijk een gemeenschappelijke variabele te veranderen waardoor het
resultaat onverwacht kan zijn.