Posts tonen met het label programma's begrijpen. Alle posts tonen
Posts tonen met het label programma's begrijpen. Alle posts tonen

woensdag 21 december 2011

Programma's begrijpen: Bestanden en hun formaten uitgelegd


“De informatie per signaal is omgekeerd evenredig aan de waarschijnlijkheid van het signaal”
                                                                                                            - Piet Heil
Informatieverwerking is de eerste stap dat dient voor het echte doel: de uitwisseling van de informatie. Zonder uitwisseling zou de verwerking immers onpraktisch zijn. Vele vormen van deze uitwisseling nemen we al voor vanzelfsprekend; of we nu onze touchpads bewegen en toetsenborden gebruiken voor de invoer of staren naar het scherm om de corresponderende acties waarnemen als de uitvoer. Informatie leeft in de computer als een data structuur.
Het werkgeheugen valt na een stroomonderbreking terug in de staat van ‘leegte’; dit ontwerp is doelbewust, omdat een software fout de computer in zijn geheel defect zou maken én persistent geheugen langzamer is in verwerking. Het is echter wel belangrijk om informatie te kunnen archiveren, het zou anders een oneindig lang proces worden om de computer te starten en een tragedie om mee te werken. Daarom hebben computers opslagmedia tot hun beschikking: de harde schijf, DVD-media en USB ingangen; programma’s en documenten kunnen via het besturingssysteem informatie opslaan én teruglezen. Wanneer informatie voor dit doeleinde wordt opgeslagen, spreekt men over een ‘bestand’.
Bestanden zijn de fysieke vertaling van een data structuur naar de mechaniek van de opslagmedia; een harde schijf manipuleert m.b.v. magnetische ‘koppen’ een gedeelte van optische ‘film’, terwijl een DVD-schrijver met een laser dunne sporen ‘brandt’. Het besturingssysteem is verantwoordelijk voor het gehele proces; programma’s geven alleen aan het besturingssysteem door dat ze óf van een bestand willen lezen óf er naar schrijven, besturingssystemen beheren namelijk alle toegankelijke bestanden.
Bestanden moeten daarom een conventie volgen om door een besturingssysteem bewerkt te kunnen worden. Zonder deze ‘afspraken’ zouden bestanden andere bestanden overschrijven of zou er in informatie verloren kunnen gaan. Daarom geldt voor ieder bestand een standaard ontwerp: zo heeft een bestand twee delen, namelijk de ‘envelop’ (header) en het daadwerkelijke ‘bericht’ (body). De envelop bevat informatie voor het besturingssysteem: de grootte, de opmaak en controle berekeningen die de geldigheid kunnen garanderen. Het tweede gedeelte bestaat uit de daadwerkelijke informatie die is opgeslagen.
Omdat informatie wordt verwerkt in data structuren is het handig om deze ook conform de structuur op te slaan; een bestand wordt geplaatst in het geheugen precies zoals deze in het bestand is opgeslagen. Echter willen programmeurs vaak meer informatie plaatsen in een bestand buiten de ‘ruwe’ informatie of willen bestanden kunnen uitwisselen met andere programma’s. Omdat computers eenmaal niet kunnen raden en zeer foutgevoelig zijn is er een oplossing nodig om al deze benodigdheden te verkrijgen. Deze oplossing is het bestandsformaat.
Het bestandsformaat is de opmaak van de informatie. Wanneer een bestand is ingedeeld in een structuur kan deze gemakkelijker verwerkt én uitgewisseld worden. Office bestanden kunnen hierdoor uitgewisseld worden over diverse versies van het software pakket en veel boekhoudprogramma’s kunnen een rapportage opslaan, die geopend kunnen worden Excel. Zo werkt het ook met media bestanden: als een film niet afgespeeld kan worden, ondersteund de speler het ‘formaat’ niet, het bestand is wel geldig en kan mechanisch ‘gelezen’ worden maar de opmaak is voor het programma geheimschrift.
Formaten zijn belangrijk in gegevensuitwisseling; informatie kan gepresenteerd worden op vele manieren. Daarom hebben veel bestanden een ‘extensie’, het bestand krijgt een achtervoegsel (zoals mijn-verhaal.doc, of vakantie.jpg) om het formaat aan te duiden voor de gebruiker. Het bestand zelf heeft immers de ‘envelop’ die het formaat bevat.
Bestandsformaten zijn vrij om te ontwerpen, echter zullen de enige ontwerpers die zich met deze opgave bemoeien bezig zijn met zeer gevorderde technologieën zoals media compressie of eigen faciliteiten.

Meer lezen hierover? Klik hier voor de inhoudsopgave voor alle artikelen!

vrijdag 9 december 2011

Programma's Begrijpen: Lussen gebruiken voor verwerking


“Rond, rond, rond – dat is nu een lus”
                                                - Sam Rain
Sommige programma’s zullen taken moeten herhalen; een klok-programma zal altijd de ‘nieuwe’ tijd moeten verversen en om dezelfde procedure oneindig te kopiëren is niet bepaald bevorderlijk. Daarom is er een mechaniek dat bekend staat als de ‘lus’ – met hulp van een conditie roept de procedure zich constant zelf aan. De functionaliteit is dan ‘recursief’.
Er zijn twee belangrijke ‘lus’-soorten in de wereld van programma’s. Eén daarvan is de ‘oneindige’ lus en blijft zichzelf herhalen aan de hand van een enkele conditie (die altijd ‘waar’ moet zijn). Een typisch voorbeeld is een programma die om de zoveel tijd een taak moet uitvoeren (‘ophalen van e-mail’). De ander herhaalt zich een aantal stappen en stopt vanzelf. De conditie bepaalt het ‘bereik’ van de lus.
De ‘oneindige’ lus is bekend als de ‘while’-lus, vrij vertaald als ‘zolang als’. In pseudo-code kan deze als volgt worden weergegeven:
Boolean Oneindig
Oneindig = true
while (Oneindig)
  .... blok van procedures
einde
Zolang de conditie voor deze lus ‘waar’ is, gaat het programma niet verder dan de lus, binnen het ‘while’-blok zal er dus een mechaniek moeten zijn om de lus te doorbreken. Door de conditionele variabel ‘onwaar’ te maken, kan er dus gecontroleerd een einde aan de lus worden gemaakt.
De lus met een bereik is wat complexer van aard, maar maakt het daarnaast weer handig voor bepaalde situaties. Een ‘lijst’ (array) heeft een bepaald aantal elementen met een numerieke index. Door een lus met bereik kan een data structuur snel doorlopen worden, of kan een taak herhaald worden in specifieke aantallen. Dit type lus heet de ‘for’-lus in de meeste talen.
De ‘for’-lus, vrij vertaald als ‘tot dat’, bestaat uit drie argumenten. Het eerste argument is de initiële waarde waar de lus moet beginnen, gevolgd door het tweede argument dat het bereik bepaald met behulp van een conditie. Het laatste argument bepaald de grootte van iedere ‘stap’ tijdens de lus. Als voorbeeld in ‘pseudo-code’:
Integer index
Array MijnLijst
MijnLijst [0..10] = “Sam Rain” (verkorte manier om een lijst te vullen van element 0-10 met dezelfde tekst)
For (index = 0              Beginwaarde
        index < 10            Bereik
        index ++)              Stop
LaatZienOpScherm (MijnLijst [index])             (de huidige index van de ‘lus’)
einde
Dankzij de ‘for’-lus hoeft niet ieder element expliciet te worden geschreven; de informatie per element wordt als argument meegegeven aan de procedure ‘LaatZienOpScherm’ – de index waarde wordt vanzelf ingevuld door de ‘lus’.
Met lussen worden programma’s echte werkpaarden. Ze nemen geen pauzes of kijken uit het raam op vrijdagmiddag. Lussen zijn het meest intensief wat betreft programma mechaniek, maar als ze gaat werken, doen ze het oneindig lang...
Meer lezen over Informatie Technologie? Klik hier voor de inhoudsopgave voor alle artikelen!

©SamRain
Lus gebruiken

donderdag 8 december 2011

Programma's Begrijpen: Condities gebruiken voor verwerking


“Mensen kennen Goed en Kwaad; Computers kennen Goed of Fout”
                                                                                                            - Sam Rain
Informatie in structuren ontwerpen is belangrijk, maar het draait uiteindelijk om verwerking. Dat computers ieder bevel zonder tegenspraak uitvoeren is nu wel bekend, echter zullen er instructies zijn die pas uitgevoerd moeten worden door middel van een ‘beslissing’. Condities zijn speciale instructies om een vergelijking uit te voeren en kennen slechts twee uitkomsten: ‘waar of ‘onwaar’ (‘true’ of ‘false’). Dit kan gedaan worden met de getallen ‘1’ (waar) of ‘ø’ (onwaar), maar omdat deze condities veel voorkomen, hebben veel talen er zelfs een speciaal datatype voor: de Boolean, die alleen ‘true’ of ‘false’ kan bevatten.
Een conditie gebeurd met het ‘if’ sleutelwoord in veel talen, dat gezien kan worden in de vorm van ‘als’. Deze procedure vraagt om twee waarden om te vergelijken met elkaar en geeft de uitkomst ‘terug’. Wanneer de uitkomst als ‘waar’ wordt beschouwd, wordt de bijhorende broncode uitgevoerd, zo niet dan wordt het blok overgeslagen.
Als voorbeeld een conditie in pseudo-code:
Integer getal_a                                                            * == is een operator voor ‘gelijk aan’
Integer getal_b
Boolean uitkomst
getal_a = 1
getal_b = 2                                              * deze code geeft als uitkomst ‘onwaar’                   uitkomst = false                                           want ‘1’ is niet hetzelfde als ‘2’
if (getal_a == getal_b)
  uitkomst = true
  return uitkomst
einde
Condities werken nauw met ‘operatoren’; een vergelijking is immers iets wiskundigs. Om condities toe te passen in een programmeertaal is het dus wijs om de documentatie te bekijken in het gedeelte van operatoren. Zo mogen condities complexe vergelijkingen bevatten en kan het ‘blok’ ook van allerlei mechanieken worden voorzien.
Door deze handige oplossing kunnen condities het verloop van een programma bepalen; als een object een datatype heeft zoals ‘betaald’ en conditioneel ‘onwaar’ is, kan het ‘blok’ een functionaliteit hebben om een e-mail te sturen naar een klant voor een betalingsherziening.
Veel talen hebben de functionaliteit om zowel voor ‘waar’ of ‘onwaar’ een eigen blok toe te kennen, de ‘else’ conditie. Ook zijn er speciale conditie sleutelwoorden voor meerdere waarden (select case).
In industriële software heb je complexe condities voor grote data structuren om gegevens op juistheid te controleren; deze ‘business rules’ vergelijk een object heel snel op conditionele waarden en geven een totaal uitkomst in een Boolean datatype terug.
Condities zijn ‘intensieve’ berekeningen, ga daarom wijs met ze om. Vooral bij grote structuren is het oppassen; onder de motorkap worden ze vaak gekopieerd voor de daadwerkelijke berekening, wat ten koste gaat van de snelheid en het ‘werkgeheugen’.
Een paar ‘typische’ operatoren die vaak in condities gebruikt worden:
Operator            Omschrijving           
= =                     Gelijk aan (rekenkundig)
! =                      Niet gelijk aan
<                        Kleiner dan
>                        Groter dan
< =                     Kleiner of gelijk aan
> =                     Groter of gelijk aan
= = =                  Gelijk aan (letterkundig)
&&                    ‘en’
| |                       ‘of’
Meer lezen over Informatie Technologie? Klik hier voor de inhoudsopgave voor alle artikelen!
©SamRain
Condities

dinsdag 6 december 2011

Programma's begrijpen: Speciale data structuren


“Gegevens zijn een verzameling van informatie; een lijst van gegevens een informatiebron”
                                                                                                            - Sam Rain
Buiten ‘primitieve datatypes’ en volledige datamodellen zijn er ook speciale structuren voor programma mechaniek, waarvan de ‘lijst’ en het ‘object’ de meest praktische van allen.
De ‘lijst’ of ‘Array’ is een structuur die nodig is om een collectie te maken van gegevens. Deze structuur lijkt zeer complex wanneer deze wordt uitgelegd door een techneut, maar valt eigenlijk reuze mee. Stel we nemen een boek van 1000 pagina’s. Elke pagina bevat een gedicht en een nummer. Om een gedicht snel te kunnen vinden, is het hele boek afzoeken niet een vruchtbare optie. Een inhoudsopgave kost maar een paar pagina’s en bespaart veel tijd, vooral wanneer we veel gedichten gaan selecteren. Een ‘array’ is precies zo’n inhoudsopgave: het gebruikt een ‘index’ om de plaats in het geheugen aan te duiden en een ‘element’ als referentie voor het type gegevens.
Het voordeel van een ‘lijst’ is dat het eenvoudiger werkt bij grote verzamelingen van gegevens; mechaniek zoals sorteren is zelfs zonder lijst een zeer inefficiënt proces. Lijsten in programma’s kunnen op zichzelf weer lijsten bevatten; ze zijn multi-dimensioneel. Ze kan een verzameling van gegevens als element fungeren in een andere lijst. Een data structuur is in feite een lijst van datatypes, daarom valt de ‘array’ ook onder de ‘primitieven’.
Omdat computers altijd tellen vanaf ‘Æ’ is ook het eerste element de 0e referentie in de index; veel talen gebruiken de [ ] vierkante haakjes om de index aan te duiden. Vaak zijn deze daarom numeriek, echter kennen ‘dynamische’ talen ook associatieve indexen, zodat ze ook ‘labels’ kunnen bevatten.
Ter illustratie (in pseudocode) wordt zo een ‘array’ in broncode geschreven:
                        Dynamische Talen                                    Old School                     
Declaratie        Array MijnLijst [ ]                                   String [10] MijnLijst
Toewijzing      MijnLijst [0] = “hallo”                             MijnLijst [ 0 ] = “hallo”
                        MijnLijst [1] = “Sam”                              MijnLijst [ 1 ] = “Sam”

De flexibiliteit van lijsten verschillen wel vaak in diverse talen: ‘nieuwere’ talen nemen veel werk uit handen, terwijl sommige talen precies willen weten hoeveel elementen er maximaal in de lijst mogen staan. De ‘lijsten’ zijn daarom het eerste waar men naar zou moeten kijken in de documentatie bij het leren van een nieuwe programmeertaal.
Het ‘object’ is een speciale lijst: het is een verzameling ‘broncode’, als het ware een data model voor uitvoerbare code. Hoewel niet alle talen het ‘object’ type gebruiken, zijn ze wel zeer populair; naast de efficiëntie die ze van nature hebben, maken ze een programma zeer ‘modulair’ en zelfstandig. Ieder object is uniek en een verzameling van objecten hebben toch dezelfde procedures tot beschikking. Een taal dat objecten gebruiken als conventie, heet ‘object georiënteerd’.
Objecten worden speciaal gedefinieerd: elk object is een ‘klasse’ (‘class’) en heeft binnen deze klasse toegang tot variabelen die ‘onzichtbaar’ zijn voor alle andere objecten. Ook hebben zij speciale ‘procedures’ die niet verder kunnen ‘kijken’ buiten hun klasse, deze heten ‘methoden’ (‘methods’). Dankzij deze functionaliteit kunnen object klassen vaak opnieuw worden gebruikt, en dus objectgeoriënteerde talen vanwege hun efficiëntie populair zijn in de industriële software.
Ook objectgeoriënteerd ontwerpen begint in ‘pseudo code’. Er is zelfs een standaard voor, namelijk UML (unified modelling language). Echter blijft het een serie ‘eigen’ artikelen waardig, en wordt dat nog even buiten beschouwing gelaten.

Meer lezen over Informatie Technologie? Klik hier voor de inhoudsopgave voor alle artikelen!
©SamRain
Data

maandag 5 december 2011

Programma's Begrijpen: Data structuren verder uitgelegd


“Op ieder potje, past een datamodel en kan net zoveel bevatten.”
                                                                                                - Sam Rain
Data structuren zijn abstracte vormen voor informatie; feitelijk zijn ze niet meer dan een tactisch ontworpen concept voor geheugenruimte, welke opgebouwd zijn uit primitieve datatypes. Het voordeel van deze flexibiliteit is dat ze zowel simpel als complex kunnen zijn en informatie als een verzameling beschikbaar maken. Naast een handig mechanisme om informatie te verwerken, zijn ze ook van cruciaal belang voor uitwisseling; diverse structuren kunnen een standaard worden voor diverse programma’s of systemen – beter bekend als een formaat – denk maar eens aan foto’s of tekstdocumenten.
Wanneer gegevens uitgewisseld worden met andere programma’s, moet de informatie aan iedere zijde gelijk zijn; de structuur wordt universeel en uitwisselbaar (‘compatibiliteit’). Deze structuur is dan een ontwerp op zichzelf en wordt daarom een ‘data model’ genoemd. Technische artikelen die data structuren beschrijven slaan vaak het toepasbare gebied over en leggen het vergrootglas op de mechaniek terwijl juist data structuren vaak de eerste stap zijn, de meest cruciale gegeven zullen bevatten en het falen of slagen van een applicatie bepalen. Een overvloed aan informatie ‘kost’ geheugen, vereist meer tijd om te verwerken en zit verweven in grote delen van de kern. Te weinig informatie betekend een aantal technische ‘bypassen’ chirurgie om informatie toch volledig te maken.
Data modellen voor de industrie moeten dus aan een aantal voorwaarden voldoen om ‘robuust’ te zijn als oplossing:
·      een model moet een ‘uniek’ veld bevatten voor identificatie
·      een model moet ‘meta-data’ ondersteunen
·      een model moet zo compact mogelijk zijn
Data modellen hebben identificatie nodig om ‘relationeel’ behandeld te kunnen worden; ze fungeren als ‘primaire sleutel’ (x ‘buitenlandse’ sleutels zijn optioneel) en de industrie werkt zelden met enkele gegevens. Het is vrij normaal om met meer dan 10.000 unieke gegevens tegelijk te werken voor ‘volwassen’ oplossingen. Meta-data is de informatie over de informatie: vaak zal men een aantal waarden nodig hebben, zoals metingen of de status per unieke verzameling. De redenen voor compacte modellen zijn snelheid en efficiëntie; een bepakte verzameling ‘kost’ niet alleen tijd en geheugen, maar verkwist het ook. Wanneer een data model tot ‘leven’ wordt geroepen, neemt het geheugen in beslag, om gevuld te worden met informatie. De componenten in een applicatie werken met procedures, die ‘argumenten’ vereisen. Argumenten zijn nieuwe variabelen, dus wanneer een argument het type is van het data model zullen de meeste programmeertalen de opdracht geven om alle gegevens te ‘klonen’, terwijl het om een ‘pietluttige’ verwerking kan gaan.
Een data structuur kan uit meerdere modellen bestaan, zodat deze efficiënt verwerkt kan worden. Echter moeten de verwijzingen bij zo’n verwerking dan ook precies kloppen: dit wordt ‘mapping’ genoemd (vrij vertaald: ‘in kaart gebracht’). Wanneer er meer informatie wordt geplaatst in een structuur dan bedoeld is, vind er een ‘overflow’ (overstroming) plaats en valt de applicatie in een foutafhandeling, of erger: stopt ermee. Bij te weinig informatie blijven delen van de verzameling gegevens ongedefinieerd, waardoor er onverwachte resultaten te weeg kunnen komen.
Een data structuur is een blauwdruk; het is op zichzelf alleen een definitie. Wanneer de definitie bepaald is, kan de structuur gebruikt worden zoals ieder ander datatype. Met het label dat eraan gegeven is maakt de computer een nieuw object aan in het geheugen. Dit proces heet instantiëren en het object heet daarom een ‘instantie’.

Meer lezen over Informatie Technologie? Klik hier voor de inhoudsopgave voor alle artikelen!
©SamRain
Data structuren

zondag 4 december 2011

Programma's begrijpen: De programmeertaal


“Een taalcursus is alleen praktisch als je ook de zinsopbouw begrijpt”
                                                                                                            - Sam Rain
Het internet staat er vol mee; de artikelen over programmeren zijn uitgebreid en gedetailleerd van de meest excentrieke ‘talen’ tot de industrie standaarden. Het grote nadeel is dat ze vooral gericht zijn op techneuten waardoor sympathisanten snel ongeïnteresseerd raken. Programmeren wordt hierdoor ook ‘mystiek’; het vakjargon is duizelingwekkend en vaak ook misbruikt; dezelfde begrippen worden vaak herbruikt voor tegenstrijdige doelen en zijn zelden echt hyperoniem of zelfs associatief. De realiteit valt echter reuze mee; als iemand het maar goed uitlegt.
Programmeertalen zijn ‘middelen’. Ze zijn bedoelt voor mensen en niet voor computers. Iedere ‘broncode’ wordt door een ‘vernuftig’ programma vertaald naar uitvoerbare code, ongeacht welke taal. Dit programma (of verzameling van programma’s) doet deze transformatie conform een aantal regels; deze ‘wet’ is de programmeertaal. Concreet betekent dit dat je leert spreken via een tolk, die een beperkt aantal zinnen begrijpt en deze vertaald naar hiëroglyfen. Deze ‘tolk’ stelt al deze zinnen beschikbaar voor de ‘programmeur’ als een ‘taal’. Er zijn verschillende soorten ‘tolken’, afhankelijk van hoe gek men het wilt maken. Sommigen hebben genoeg aan een gids voor een korte vakantie, anderen willen de alfa status bereiken om ieder detail te beheersen.
De programmeertaal is daarom opgebouwd in ‘sleutelwoorden’ (‘keywords’) om de mogelijkheden van de computer te benutten: wiskundige berekeningen, herhalende opdrachten en condities. Deze sleutelwoorden zijn handelingen die de computer moet verrichten als ware het een bevel. De ‘tolk’ vertaald deze als ‘instructies’. Om instructies beter te begrijpen is er al een serie van artikelen beschikbaar (zie hier )schetst een redelijk beeld. Alle andere informatie in de ‘broncode’ zijn bedoeld als daadwerkelijke gegevens. Om deze informatie gescheiden te houden maken programmeertalen gebruik van ‘variabelen’. Dit zijn zelfbedachte sleutelwoorden die uniek zijn voor ieder programma en niet vast liggen in de taal en dus ‘vergeten’ worden. Dit proces heet ‘declareren’.
Een programma heeft ook een ‘werk’ volgorde nodig; meestal begint de ‘tolk’ boven ieder bestand en gaat regel-voor-regel de ‘broncode’ af. Echter beginnen de interessante delen pas wanneer er echt verwerkt kan worden, dat pas kan als alle informatie beschikbaar is. Om hier controle over te krijgen, kan de ‘broncode’ gerangschikt worden in ‘blokken’; een soort paragraaf van meerdere regels, gekoppeld aan een ‘eigen’ sleutelwoord. Zo’n paragraaf wordt een ‘procedure’ genoemd en wordt pas uitgevoerd als het zelfbedachte sleutelwoord wordt gebruikt. Zo kan met meerdere paragrafen een specifieke volgorde worden gevolgd, bekend als de ‘flow’ (vrij vertaald: ‘stroom’). Dit proces heet ‘aanroepen’; het vaststellen van een paragraaf of een ‘blok’ gegevens heet definiëren.
Computers zijn ‘domme’ apparaten; ze kunnen zelf geen verschil zien tussen getallen en tekens. Veel programmeertalen doen dit tegenwoordig voor je, toch blijft het belangrijk om te begrijpen hoe dit technisch wordt ‘opgelost’. Om het verschil te ‘zien’, gebruiken programmeertalen en computers speciale structuren: primitieve datatypes. Omdat computers eerst geheugen moet vrijmaken om er waarden aan toe te voegen is het belangrijk voor ze om te weten hoeveel ze daarvoor nodig hebben. Het cijfer ‘1’ en het cijfer ‘300.000’ zijn even ‘groot’ voor een computer, echter een zin van 3 regels kost meer geheugen. De oplossing is het gebruik van speciale ruimten in het geheugen. Elk ‘type’ ruimte heeft zijn eigen vooraf bepaalde grootte. Wanneer er een ‘decleratie’ moet plaatsvinden zal er dus geheugen ‘gereserveerd’ moeten worden. Deze primitieve datatypes hebben een eigen ‘sleutelwoord’ maar werken als bijvoeglijke naamwoorden: ze vertellen ‘hoeveel’ geheugen er nodig is voor de informatie. Dit proces heet ‘reserveren’ of beter gezegd: ‘toewijzen’.
Veel talen kennen dezelfde ‘primitieven’ voor gegevens; sommige talen kennen er velen, sommige bepalen dit zelf door de waarde te analyseren. De meest gangbare zijn de volgende ‘primitieven’:
Primitief
Bevat
Integer
Float
Char
String
Array
Hele nummers (dus geen ‘komma’ getallen)
Decimale getallen (getallen achter de komma)
Enkel ‘leesteken’
Verzameling ‘leestekens’
Verzameling van gegevens

Deze ‘engelse’ structuren zijn het meest gebruikt voor informatie verwerking. Ze kunnen de nodige gegevens bewaren en met deze ‘primitieven’ kunnen we zelf eigen, complexere structuren maken. Er zijn natuurlijk veel meer primitieven echter zijn die voor mechanische oplossingen binnen de programmeertaal, deze zijn gangbaar voor ‘informatie liefhebbers’. Programmeertalen hebben eigen documentatie over welke primitieven zij ondersteunen, maar zullen 99% van allen een vorm van getallen, leestekens en lijsten bevatten.
Een ‘programma’ bevat dus de volgende onderdelen:
-       het ‘declareren’ van informatie die gebruikt zal worden door middel van geheugen te reserveren en de informatie aan dit geheugen toe te wijzen
-       het ‘definieren’ van blokken welke aangeroepen kunnen worden voor daadwerkelijke verwerking
-       de ‘flow’, de volgorde waarin de blokken aangeroepen moeten worden.
Zoals ‘echte’ talen zijn er ook regels voor de ‘grammatica’ nodig. Deze heet in vakjargon de ‘conventie’ en zijn afspraken waar een programmeur zich aan moet houden zodat het programma ook klopt. Hoewel elke taal ‘eigen’ regels hanteert, zijn er vaak overeenkomsten tussen talen. Broncode wordt van ‘links-naar-rechts’ verwerkt en daar moet handig gebruik van gemaakt worden, de ‘syntax’ is hierdoor begrijpelijk voor het vertalende programma.
Naast de conventie voor het plaatsen van broncode zijn er ook conventies tussen programmeurs; deze liggen niet ‘vast zoals bij de grammatica maar bevorderen de ‘leesbaarheid’. Computers zijn niet geïnteresseerd in witruimte, echter worden programma’s uitgebreider en complexer waardoor het terugvinden van fouten moeilijker wordt zonder deze regels. Deze conventies zijn alleen cosmetisch van aard.
De conventie voor veel talen is bijvoorbeeld het ‘toewijzen’ van informatie aan een ‘variabele’. De variabele is een ‘label’ voor een gereserveerde ruimte. Bij een taal die expliciet vereist om een ‘primitief’ aan te geven gelden dan de volgende regels:
-       de naam van een variabele mag niet beginnen met een getal;
-       de naam moet aan elkaar geschreven zijn (er mag geen spatie in zitten);
-       het ‘primitieve’ type hoort voor de variabele geschreven te worden.
GOED                                                            FOUT
Als voorbeeld:           integer MijnNummer                                    1mijnNummer Integer
                                  string MijnOmschrijving                              String Mijn Omschrijving
Vanzelfsprekend mogen de woorden van een taal niet gebruikt worden als ‘label’ voor een variabele. Sommige talen zijn niet hoofdlettergevoelig, echter zijn dit tegenwoordig uitzonderingen. Speciale tekens zijn vaak ook niet toegestaan.
Een ‘operator’ is verantwoordelijk voor bewerkingen op wiskundig gebied. Deze zijn feitelijk ‘ingebouwde’ procedures voor veelvoorkomende berekeningen. Meestal worden deze ‘aan’ een variabele geschreven zonder spatie: een variabele ‘integer’ verhogen met ‘1’ is bijvoorbeeld verkort te schrijven met ++; als MijnNummer de waarde ‘2’ bevat en deze zo wordt geschreven: MijnNummer++, dan zal de nieuwe waarde ‘3’ zijn. Overigens hoeft een variabele maar eenmalig ‘gedeclareerd’ te worden. Wanneer een programma weet wat het ‘primitieve type’ is, blijft het bekend en is het ‘label’ voldoende om te werken met de inhoud ervan.
Procedures zijn ‘speciale’ variabelen; ze bevatten uitvoerbare ‘code’ in plaats van informatie en doen dit via ‘blokken’. Echter zijn procedures pas handig als ze met informatie kunnen werken; daarom accepteren ze ‘argumenten’ (parameters); informatie die binnen het ‘blok’ gebruikt kan worden, welke van ‘buiten’ het blok kan komen. Daarvoor gebruiken talen de haakjes ( ) om de argumenten aan te geven, met de komma als eventueel scheidingsteken. Omdat ‘niets’ ook een waarde is (niet te verwarren met het cijfer 0!!) worden de haakjes zonder waarde toch vaak gebruikt. Ter illustratie:
(pseudo-code)
Definitie MijnProcedure (Integer getal, Integer ander_getal)
getal+ander_getal
einde
Hoewel dit voorbeeld geen rekening houdt met visuele uitvoer is het wel ‘geldig’. Wanneer de procedure als volgt wordt aangeroepen:
MijnProcedure(1,5)
Zal het getal 6 berekend worden. Deze mechaniek tezamen met de toewijzing van informatie naar geheugen stellen de grondbeginselen van ieder programma. Alles wat eigenlijk geen ‘data’ is, is min of meer een procedure met het doel om te vereenvoudigen.
Het toewijzen van informatie aan een variabele kan ingewikkeld overkomen; vaak wordt de ‘=’ als operator gebruikt voor toewijzing:
MijnNummer = 1            MijnOmschrijving = “dit omschreven.”
De ‘=’ is dus niet zoals we bij rekenen gewend zijn; daarvoor wordt meestal de ‘==” ,zonder spaties, gebruikt. Getallen worden zonder aanhalingstekens geschreven, in tegenstelling tot leestekens en tekst.
Dankzij toewijzingen kan de uitkomst van procedures ‘veiliggesteld’ worden; door de procedure te ontwerpen, opdat deze een waarde teruggeeft, kan het opgevangen worden. Vaak is dit impliciet door de gewenste waarde als laatste op te geven of expliciet met een ‘sleutelwoord’ dat er voor bestemd is: ‘return’.
Integer EersteGetal
Integer TweedeGetal                                                                        (Decleratie)
Integer Uitkomst
EersteGetal = 1
TweedeGetal = 5                                                                           (Toewijzing)
Definitie MijnProcedure (integer getal_a, integer getal_b)
            Integer getal _x
            Getal_x = getal_a + getal_b                                                (Definitie)
            Return getal_x
Einde
Uitkomst = MijnProcedure (EersteGetal,TweedeGetal)            (Aanroepen)

Wanneer een ‘broncode’ geschreven is, wordt deze vertaald door de ‘tolk’ naar uitvoerbare code. Dit proces heet de ‘compilatie’. Elke keer als het programma veranderd moet worden, wordt alleen de ‘broncode’ opnieuw aangepast en zal het hele compilatieproces van voor af aan moeten beginnen, ongeacht de grootte van de wijziging. Daarom is ieder programma altijd ‘nieuw’ en zal het herstart moeten worden; de nieuwe versie moet de oude versie vervangen.
Een programmeertaal is een middel, geen doel. Het doel heiligt de middelen en niet andersom. Er bestaat dus geen ‘beste’ taal, alleen een toepasselijke taal voor specifieke doeleinden.
Meer lezen? Klik hier voor de inhoudsopgave voor alle artikelen in deze serie!
©SamRain
Programmeertaal

zaterdag 3 december 2011

Programm's Begrijpen: Denken in Pseudocode


“De meeste tekenaars beginnen met een ruwe schets”
                                                                        - Sam Rain
Programma’s bestaan uit componenten die invloed uitoefenen op informatie met behulp van operatoren, condities en lussen. Hoe deze invloeden worden uitgewerkt in detail wordt bepaald door de ‘omgeving’; de beschikbare programmeertaal, de informatievoorziening en de distributie en uitwisseling naar andere systemen. Voordat de uitwerking kan beginnen is er een oplossing nodig die de verwerking in grote lijnen kan beargumenteren; een ‘ruwe’ schets van de mechaniek zonder vastgekoppeld te zijn aan de omgevingslimieten: de pseudo-code.
Pseudo-code is niet uitvoerbaar; het is een abstracte methode om de oplossing in theorie te maken. Gelukkig hoeft dit niet zoals de grote nauwkeurige meesters als lange, complexe en onleesbare formules. Het doel van pseudo-code is dat het begrijpelijk is voor iedereen die de basis begrijpt van informatieverwerking.
Een praktisch voorbeeld: Karel wilt zijn telefoontjes registreren en koppelen aan zijn debiteurenbestand. Als hij een debiteur aan de telefoon krijgt, wilt hij de geschiedenis op kunnen vragen aan de hand van de naam, postcode of klantnummer van de debiteur.
Eerst moeten de informatiebronnen in kaart gebracht worden. Debiteuren hebben contactgegevens, ieder telefoontje is een nieuwe registratie en alle registraties horen bij een debiteur.
Vervolgens kijken we naar de structuur voor de informatie. Elke registratie heeft een datum- en tijdsnotering nodig, tezamen met een omschrijving. De debiteurgegevens hebben altijd een uniek klantnummer nodig.
Pas dan kijken we naar de mechaniek van de oplossing. De informatie moet opgevraagd, aangepast, opgeslagen of verwijderd kunnen worden. Daarnaast moet er een zoekmechanisme zijn die juiste gegevens afbeeld. In programma’s zijn er twee delen waar de mechaniek zich afspeelt; de gebruikerskant en de kern. Soms hebben programma’s geen gebruikers nodig, ze voeren zonder vertraging of tussenkomst van een gebruiker de taken uit en heten een ‘service’ (achtergrondproces). Een programma dat de gebruiker centraal stelt is wel interactief en wordt een applicatie genoemd. In dit voorbeeld gaat het om een applicatie, er zul dus rekening gehouden worden met de gebruikerskant.
Voor de gebruiker zijn er 3 ‘schermen’ nodig. Schermen zijn in dit geval zelfstandige formulieren welke informatie weergeven. Het eerste scherm gaat om de registratie, het tweede is een zoekscherm en het derde scherm beheerd de debiteurgegevens. Het ontwerp van ieder scherm valt al onder pseudo code: 
 De ‘kern’ van een applicatie handelt de functionaliteit af van alle schermen. Ongeacht de invulling qua taal of omgeving kan het volgende al worden ‘geschetst’ voor de kern:
Procedure Nieuw-knop (vereist debiteurnummer, omschrijving):
·      nieuwe registratie maken met huidige tijd en datum
·      vereiste debiteurnummer, omschrijving aan registratie toevoegen
·      gegevens opslaan van registratie
·      velden leegmaken
·      eventuele bevestiging dat de gegevens zijn opgeslagen.
Voor iedere functionaliteit zal er dus een ‘eigen’ procedure moeten komen. Soms kunnen bepaalde procedures opnieuw gebruikt worden binnen een applicatie, bijvoorbeeld om een structuur beschikbaar te maken. Computers denken overigens nooit verder dan hun processor lang is, gegevens in een structuur moeten heel expliciet bewaard worden of zelf ‘teruggegeven’ worden. Echter heeft pseudo code het voordeel dat een aantal puntjes op de i gemist mogen worden.
Aan de hand van ‘de wensen’ om de applicatie te maken, laat de pseudocode duidelijk zien dat het hier niet gaat om een hele complexe applicatie. Het gaat met name om het beheer van gegevens en het maken van relaties. Een voor de hand liggende keuze om de applicatie te bouwen is met behulp van een database technologie. Deze ondersteunen simpele formulieren en hebben een ingebouwde programmeertaal om de procedures tot leven te wekken.
De reden waarom een database technologie vooral gekozen wordt ligt aan de noodzaak om informatie te koppelen, de gegevens van de debiteur horen bij iedere registratie, ze hebben een ‘relatie’. Deze relatie werkt technisch gezien als een ‘sleutel’. Met behulp van een unieke waarde in beide gegevensbronnen kan een database de relatie vinden. Er is wel een valkuil: soms kan een debiteurnummer omstreden zijn als sleutel, en computers zijn zeer strenge wezens. Gelukkig mag je als ontwerper de vrije keuze maken; de relatie is alleen interessant voor de computer. Veel ontwerpers voegen daarom een relatie toe door een handig truukje: ze voegen ‘informatie’ toe dat iets verteld over de informatie, beter bekend als ‘meta-data’. Omdat het gaat om unieke nummering wordt in de industrie voor sleutels de afkorting ‘ID’ gebruikt, welke staat voor Identifier, vrij vertaald als identificatie. Een ‘gegevensbron’, dus een tabel in de database, gebruikt de ‘ID’ om iedere verzameling van gegevens te identificeren. Deze ‘primaire sleutel’ legt dus niet automagisch een relatie vast. Vaak zijn er gegevens die als ‘ouder’-informatie dienst doen, zoals in het geval van het voorbeeld zijn dit de debiteuren. De informatie die een relatie moeten hebben met deze gegevens hebben dus de informatie nodig van de ‘ouder’-bron. Echter zijn deze ook uniek, ze hebben ook een ‘primaire sleutel’ nodig voor het geval ze dienst moeten doen als ‘ouder’-bron. Dezelfde truuk wordt daarom toegepast; de structuur krijgt extra informatie: de ‘foreign key’ (vrij vertaald: de buitenlandse sleutel). Deze sleutel is de ‘primaire sleutel’ van de relatie; dankzij deze sleutel kan een computer de relatie vinden. Even ter illustratie:
Tabel: debiteuren                                        
ID
KLANT
DEBITEURNR
11
Jaap
200117
12
Mien
200118
13
Hans
201302





Tabel: registraties
ID
DATUM
OMSCHRIJVING
DEBITEUR-ID
1
22-11
Klacht levering
12   (Relatie met Mien)
2
23-11
Bevestiging
11    (Relatie met Jaap)
3
23-11
Order Ontvangen
11



De ‘relaties’ in kaart brengen vallen ook onder pseudo-code; vaak werkt een database specialist verbeteringen uit om de snelheid te bevorderen of zal de structuur ‘optimaliseren’.  Echter biedt de pseudocode de mogelijkheid om gegevensstructuren vorm te geven: niet alle gegevens zijn nodig voor de formulieren. De gegevens horen dus in een structuur thuis; het ‘data-model’ bevat de gietvorm van hoe deze beschikbaar moeten zijn:
Data-Model ‘Registratie’
-       DATUM
-       KLANT
-       DEBITEURNR
-       OMSCHRIJVING

De pseudocode brengt de primaire mechaniek, structuren en formulieren als ontwerp. Voordat er een projectplan gemaakt wordt kan de complexiteit voorzien worden en een goede schatting wat betreft de tijd die het gaat kosten om daadwerkelijk de applicatie te bouwen. Daarnaast helpt de ‘pseudo-code’ om een oplossing preventief te testen op ‘veiligheidsfouten’, toekomstige wensen en schetst het een duidelijk beeld voor de ‘uitvoerders’ van de applicatie bouw.

Meer lezen over Informatie Technologie? Klik hier voor de inhoudsopgave voor alle artikelen!
©SamRain
Pseudo-code

vrijdag 2 december 2011

Programma's Begrijpen: De basis uitgelegd


“Alle programma’s bestaan uit componenten en informatie”
                                                                                    - Sam Rain
Programmeurs worden gezien als whizz-kids die magische werelden uitvoeren met cryptische codes; het specialisme heeft niet voor niets één van de meest uitgebreide en verwarrende vakjargon ter beschikking. Het beestje heeft een naam nodig en het detail waarop kan worden ingezoomd is zowel breed als diep. Programma’s zijn complexer geworden, maar blijven altijd dezelfde beginselen behouden.
Een programma dient om informatie te manipuleren; hoe deze moet worden vormgegeven of als factor dient in een complexe berekening, het is en blijft de kern van iedere uitvoerbare ‘code’. Naast informatie moet er een mechanisme zijn wat het bewerkt; deze ‘blokken’ bepalen de volgorde en bewerking, dit zijn als het ware losse componenten. Om informatie te verwerken heeft het een structuur nodig die de componenten begrijpen. De ruwe informatie heet ‘data’, de componenten heten ‘broncode’ en de structuur is een ‘formaat’.
Een verwarrende uitleg wordt vaak gegeven over de broncode; de manier hoe componenten worden ‘gebouwd’ gebeurd in programmeertaal, maar dit is geen taal zoals mensen die gebruiken. Computers begrijpen alleen rationele instructies in signalen. De programmeertaal is bestemd voor menselijke lezers, zodat ze begrijpen wat ze vragen aan de computer. De taal heet voor programmeurs de ‘syntax’.
Ondanks de grote hoeveelheid programmeertalen met alle toeters en bellen, blijven er altijd een aantal fundamenten aanwezig. Het leren van een programmeertaal gaat veel eenvoudiger wanneer deze bekend zijn. Ze zijn namelijk de kern van elke taal die met computers werken.
Informatie moet in een structuur geplaatst worden voordat ze gebruikt wordt. Computers kennen geen verschil tussen nummers en leestekens en daarom moet de structuur bekend zijn voor de verwerking kan plaatsvinden. Daarnaast moet deze informatie ook opgeslagen worden in het werkgeheugen, zodat het later weer opgevraagd kan worden. Broncode noemt dit proces ‘declareren’; de informatie wordt opgeslagen met behulp van een label, beter bekend als een ‘variabele’.
Als de informatie toegankelijk is, kan er mee gewerkt worden. Feitelijk zijn er drie mechanismen voor informatie: wiskundige berekeningen, herhalende opdrachten en keuzes. De wiskundige berekeningen heten ‘operatoren’, de herhalende opdrachten heten ‘lussen’ en keuzes staan bekend als ‘condities’. Een programma is daarom eigenlijk een grote rekensom, echter is de complexiteit ervan vaak afhankelijk van de programmeertaal. Een taal die op het diepste niveau werkt (low level) kan op de bit precies werken op de computer. Op het hoogste niveau (high level) maakt de taal gebruik van ‘ingebouwde’ functionaliteit, zodat men zich kan bezighouden met het vraagstuk zonder eerst de weg naar Rome te bouwen.
Om volgorde en hergebruik te bepalen hebben (vooral high level talen) veel talen de mogelijkheid om delen broncode van een ‘label’ te voorzien. Deze mechaniek heet een ‘procedure’, ‘methode’ of een functie. Wanneer een taal deze mechaniek ondersteund, kan met door middel van een speciale declaratie de broncode aansturen via een zelfgekozen ‘label’.
Als het programma is geschreven, kan het nog niet worden uitgevoerd; tekst begrijpt een computer immers niet. Een speciaal programma zet het bronbestand om in een uitvoerbare structuur; het bestand wordt vertaald naar een ‘echt’ programma. Het programma wat deze vertaling doet heet de ‘compiler’ en wordt meegeleverd met de programmeertaal. Een variatie hierop is een ‘interpreter’ (tolk) welke niet een zelfstandig programma maakt, maar het uitvoeren van instructies doet aan de hand van de broncode per geschreven regel.

Meer lezen hierover? Klik hier voor de inhoudsopgave voor alle artikelen!
©SamRain
sam-rain-articles.blogspot.com