Posts tonen met het label broncode. Alle posts tonen
Posts tonen met het label broncode. Alle posts tonen

donderdag 15 december 2011

Programma's ontwerpen: De speeltuin ontdekken


“Een gereedschap hoort thuis in een gereedschapskist”
                                                                        - Sam Rain
Programma’s zijn ‘vertaalde’ bestanden, welke door de computer gelezen kunnen worden. Uiteraard moet er dus een ‘bron’ zijn, waarvan de vertaling is afgeleid: de ‘broncode’. De broncode is geschreven in een taal dat een ander, speciaal programma begrijpt (en verantwoordelijk is voor de vertaling). De ‘broncode’ is een tekstbestand; het is leesbaar voor mensen en verschilt niet veel van andere documenten.
Om een programma te maken is er niet meer nodig dan twee onderdelen: een programma dat simpele tekstverwerking kan faciliteren en het programma dat verantwoordelijk is voor de vertaling ervan. Techneuten beginnen vaak met het meest minimale om effectief te leren ‘programmeren’.
Broncode is tekst, en het voordeel ervan is dat het gemakkelijk uit te wisselen is. Daarom hoeft het ‘wiel’ niet vaak opnieuw uitgevonden te worden. Programmeertalen bieden de mogelijkheid om reeds bestaande broncode te ‘importeren’ uit bibliotheken. Sommige bibliotheken worden zelfs standaard meegegeven met een programmeertaal, anderen zijn te downloaden of worden zelf gemaakt door de programmeur.
Vaak zijn er nog andere nuttige programma’s meegeleverd met een programmeertaal; sommigen kunnen beeldmateriaal (zoals iconen en foto’s) aan het programma koppelen, of de help-documentatie vereenvoudigen. Wanneer er een scala van dit soort programma’s bij elkaar gevoegd worden ontstaat er een geïntegreerde omgeving met als doel programma’s te fabriceren. Vooral in de industrie wordt er gekozen voor een standaard. Praktische voorbeelden zijn Visual Studio™ (Microsoft) en Eclipse™. Alle gemakken zijn dan voorzien binnen een structurele applicatie; ‘broncode’ wordt gecontroleerd op juistheid, bij veranderingen wordt er een nieuwe versie toegewezen en men kan zoeken binnen diverse bibliotheken naar eventuele functionaliteit.
Voor beginnelingen kan een omgeving voor programma’s behoorlijk intimiderend overkomen; vele opties en menu’s geven veelvoudig hetzelfde weer, maar toch net iets anders. Echter hebben deze geïntegreerde applicaties wel veel meer ‘lesmateriaal’ ter beschikking; video’s, stap-voor-stap documentatie en speciale opgerichte fora. Om programma’s te ontwerpen hoef je niet de hele dag met spijkers te slaan, maar is het zeker belangrijk om te weten waar het ontwerp wordt ‘geïmplementeerd’.
Omdat programma’s in zulke omgevingen vaak in versies beschikbaar worden gesteld, is praktische ervaring handig voor tussentijdse evaluatie. De functionaliteit testen is iets wat de uitvoerders in paniek doet maken, wanneer zij achterlopen op schema. Projecten op schema laten zich immers maar al te graag demonstreren. De bedoeling van evalueren voor consultants heeft niets met het bouwproces te maken, maar ligt op het vlak van projectmanagement. Niet zelden zullen er onvoorziene omstandigheden zijn, zoals ziekteverzuim, uitstroom of ‘ambitieuze’ planning. Weten wat de staat van bouw is, betekent de informatie hebben over potentiële vertraging.
Wees daarom bekend met de gele helm, waarschuwingsborden en de grote richtlijnen. Een architect is geen metselaar, maar zal wel bekend moeten zijn met inhoudelijke kennis over metselen. Daarnaast is het bouwen van prototypes of concepten een echte pré voor consultants die succes willen maken; je leert er advies mee te beargumenteren, constructies te begrijpen die anderen voor onmogelijk houden én een zeer handige vaardigheid die generiek van toepassing is.

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

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

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

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