II.

Programmeertalen en software creëren

Een gebruikelijke manier om een programmeertaal te definiëren is: ‘een kunstmatige taal waarmee iemand instructies kan geven aan een computer’. Computers begrijpen geen Engels, Arabisch of Chinees, en ook al kunnen mensen technisch gezien binair leren (de basistaal van computers), dat doet bijna niemand. Daarom hebben we een tussenvorm nodig om te kunnen communiceren, die we programmeertalen noemen.

Zoals we in hoofdstuk I hebben gezien, hebben programmeurs al sinds de begindagen van computersystemen programmeertalen en software-oplossingen gemaakt. In dit gedeelte zul je begrijpen hoe programmeertalen zich hebben ontwikkeld en wat je ermee kunt doen.

Lage programmeertalen

Aanvankelijk, in de begindagen van computers, waren assemblagetaal en binaire taal de belangrijkste talen voor communicatie met computers om hen te vragen opdrachten uit te voeren door gegevens te vertalen in enen en nullen, via het binair stelsel dus.

Machinetaal, ook bekend als binaire taal, is een reeks enen en nullen die een opdracht voor de processor van een computer (CPU) voorstellen. Assembeertaal is veel leesbaarder dan binaire taal. Assembleertaal gebruikt mnemotechnische codes om te verwijzen naar instructies in machinetaal, in plaats van de numerieke waarden van de instructies rechtstreeks te gebruiken.

Men zou kunnen denken dat deze talen niet meer belangrijk zijn omdat zij onzichtbaar zijn voor de meeste computergebruikers, maar de realiteit is dat wij deze talen nog steeds gebruiken in onze moderne computers. Zij vormen de basis van elke computer. Elke CVE kan een specifieke reeks instructies uitvoeren die overeenstemt met het merk of de architectuur van die CVE.

Maar waarom zou je überhaupt lage talen en programmering willen leren? Daar kunnen vele redenen zijn, onder meer:

  • Sommige delen van onze besturingssystemen, en zelfs virussen, zijn geschreven in assembleertaal.

  • Als je wilt werken in GPU-programmering met hoge programmeertalen zoals CUDA of OpenCL, moet je eerst lage programmeertalen begrijpen.

  • Als je beter wilt worden in machine learning, kun je je code optimaliseren door assembleertaal te gebruiken om het geheugen efficiënt te beheren.

  • Als je diepgaand wilt leren hoe besturingssystemen werken, zal kennis van assembleertaal nuttig zijn. Assembleertaal wordt meestal gebruikt in de opstartcode van een systeem, de lage code die de systeemhardware initialiseert en test voordat het besturingssysteem wordt opgestart.

  • Assembleertaal is nuttig bij reverse engineering. Veel programma's worden alleen in machinetaal verdeeld, die eenvoudig te vertalen is naar assembleertaal met een disassembler, maar moeilijker te vertalen is naar een hogere taal met een decompiler.

Nu je hebt gezien hoe en waarom je lage talen verder kunt bestuderen, zijn we klaar om meer te leren over hoge talen.

Stapel met softwaretalen
Stapel met softwaretalen

Hoge programmeertalen

We weten dat een computer binaire code begrijpt, maar we begrijpen die zelf niet, of hooguit een paar mensen wereldwijd.

Eind jaren '50 moesten computergebruikers (meestal wetenschappers en grote bedrijven) hun software vaak zelf schrijven. Het nadeel hiervan was dat elk bedrijf of lab iemand nodig had die de computer kon programmeren en dat de software werd gemaakt voor één specifiek computersysteem, waardoor het onmogelijk was deze te verhandelen met andere omdat zij niet compatibel zouden zijn. Er werden compilers uitgevonden, en dit ondersteunde de ontwikkeling van hoge programmeertalen, dit ondersteunde de ontwikkeling van hoge programmeertalen, meer abstracte talen die gemakkelijker te begrijpen zijn.

Note

Een compiler vertaalt code die in de ene computertaal geschreven is, naar een andere computertaal.

De eerste hoge talen die in de jaren 50 werden ontwikkeld, waren FORTRAN, COBOL en BASIC. Zij maakten het mogelijk programma's op een abstracte manier te specificeren, onafhankelijk van de precieze details van de hardware-architectuur van de computer. (Wolfram 2002).

Deze talen worden gebruikt om programma's te schrijven, die volledige en functionele reeksen instructies zijn die computers gebruiken om taken uit te voeren, zoals het laden van een webpagina, het genereren van statistische analyses en het vinden van de som van twee getallen. De code wordt echter niet rechtstreeks herkend door de CVE. In plaats daarvan moet de code worden gecompileerd naar een lage taal.
Omdat het compileren van grote hoeveelheden code erg lang kan duren, hebben programmeurs interpreters uitgevonden.

Note

Een interpreter voert rechtstreeks instructies uit die in een programmeertaal geschreven zijn, zonder dat er een compiler nodig is om ze naar een nieuw machinetaalpogramma te compileren.

Sommige programmeertalen maken gebruik van zowel compilers als interpreters. Als je een Java-programma zou schrijven in een tekstverwerker, zou je, wanneer je het zou compileren met de Java-compiler, in feite iets creëren dat bytecode wordt genoemd. Bytecode kan worden gezien als een tussenstadium tussen broncode en objectcode. Wanneer een computer een Java-programma uitvoert, interpreteren de bibliotheekprogramma's op die machine de bytecode. Hierdoor is Java platform-onafhankelijk: een gebruiker heeft de juiste runtime-bibliotheken voor Java op zijn machine nodig om de programma's uit te voeren.

Wat zijn de verschillen tussen hoge en lage talen?

Het belangrijkste verschil is dat programmeurs de hoge taal gemakkelijker kunnen begrijpen, interpreteren of compileren dan machinetaal. Anderzijds kunnen machines de lage taal gemakkelijker begrijpen dan de mens. Laten we eens kijken naar enkele andere verschillen:

Hoge taal Lage taal
Programmeur-vriendelijke taal Machinevriendelijke taal
Hoge taal is minder geheugenefficiënt Hoge taal is uiterst geheugenefficiënt
Eenvoudiger te debuggen Relatief moeilijk te debuggen
Eenvoudiger te onderhouden Relatief moeilijk te onderhouden
Draagbaar Niet draagbaar
Kan op ieder platform draaien Machine-afhankelijk
Heeft een compiler of interpreter nodig voor vertaling Heeft een assembler nodig voor vertaling
Algemeen gebruikt om te programmeren Tegenwoordig niet algemeen gebruikt om te programmeren

Je eigen programma's/software schrijven

Er is een hele discipline gewijd aan het maken van software (producten): software engineering. Eerst leer je een en ander over software engineering en daarna over programmeertalen.

Wat is software engineering?

Als je aan software denkt, zie je meestal een interface waarmee je iets met de computer kunt doen, zoals tekst schrijven. Software engineering wordt gedefinieerd als een proces van het analyseren van gebruikerseisen (de behoeften die gebruikers hebben om de tekst te schrijven) om het gewenste softwareproduct te bouwen. Vervolgens wordt er een softwaretoepassing ontworpen, gebouwd en getest, die aan die eisen zal voldoen.

Voorbeeld

Laten we eens kijken naar de verschillende definities van software engineering:

  • Het IEEE definieert software engineering in zijn norm 610.12-1990 als de toepassing van een systematische, gedisciplineerde en berekenbare aanpak voor de ontwikkeling, het gebruik en het onderhoud van software.

  • Fritz Bauer definieert het als ‘het vaststellen en gebruiken van standaard engineering principes. Hij helpt je om op een economische manier software te verkrijgen die betrouwbaar is en efficiënt werkt op de echte machines.’

  • Boehm definieert software engineering als ‘De praktische toepassing van wetenschappelijke kennis op het creatieve ontwerp en de bouw van computerprogramma's. Hij omvat ook de bijbehorende documentatie die nodig is om ze te ontwikkelen, te bedienen en te onderhouden.’

Maar houdt software engineering meer in dan coderen?

Ja, er zijn veel stappen nodig om software te maken, zowel voor als na het coderen. We noemen dit de Software Development Life Cycle (SDLC) en hij is gestructureerd in een welomschreven opeenvolging van stappen die het ontwerp- en ontwikkelingsproces efficiënt maken. De stappen zijn als volgt:

  • Communicatie is de eerste stap. Meestal dient een mogelijke klant van een softwarebedrijf een verzoek in voor een gewenst softwareproduct.

  • Bij requirement gathering wordt er geprobeerd om zoveel mogelijk informatie te krijgen over wat de klant precies wenst.

  • De haalbaarheidsstudie is de fase waarin het team met een ruw plan komt voor het softwareproces.

  • Tijdens de systeemanalyse analyseert het projectteam de reikwijdte van het project en plant het dienovereenkomstig het schema en de middelen.

  • Bij softwaredesign neemt het team kennis van de wensen en analysefasen en wordt het softwareproduct daadwerkelijk ontworpen.

  • Tijdens de code- of programmeerfase begint het team met het schrijven van programmacode in een geschikte programmeertaal en ontwikkelt het efficiënt foutloos uitvoerbare programma's.

  • Testen is een essentieel onderdeel van het proces om mogelijke fouten te ontdekken en te herstellen.

  • De integratiefase is nodig als de software moet integreren met externe entiteiten zoals databases of andere programma's.

  • De implementatiefase vindt plaats wanneer de nieuwe software klaar is en daadwerkelijk op gebruikersmachines wordt geïnstalleerd.

  • Bij gebruik en onderhoud wordt de doeltreffendheid van de software in de praktijk bevestigd. Eventuele fouten worden gecontroleerd en hersteld.

Watervalmethode versus agile-softwareontwikkeling

Alle bovenstaande fasen of activiteiten in de SDLC kunnen in een andere volgorde worden uitgevoerd volgens de verschillende bestaande benaderingen. Ook investeren verschillende benaderingen meer of minder tijd in de verschillende fasen van de SDLC. Die fasen kunnen beurtelings worden uitgevoerd, zoals in de watervalmethode of de fasen kunnen verschillende keren herhaald worden, waarbij de nadruk ligt op incrementele oplevering van het softwareproduct, zoals in de agile-softwareontwikkeling.

Vergelijking tussen waterval- en agile ontwikkeling
Vergelijking tussen waterval- en agile ontwikkeling

Traditionele methoden van softwareontwikkeling maken gebruik van wat bekend staat als watervalontwikkeling. Voordat software-updates gemakkelijk konden worden gedownload van of automatisch geïmplementeerd op het internet, werd het watervalontwikkelingsproces ontworpen om te proberen ervoor te zorgen dat wanneer een softwareprogramma aan de klant werd geleverd, het alle vereiste functies bevatte en dat alle bekende problemen getest en opgelost waren, tot vrijgave van de volgende versie van het softwareprogramma. Dit proces is zeer riskant en tijdrovend omdat het testen van het product pas op het einde gebeurt, nadat de ontwikkelaars en ontwerpers enorm veel tijd hebben besteed aan het ontwerpen en bouwen van het hele programma. Dit soort ontwikkelingsproces geeft ook de voorkeur aan technische efficiëntie boven eindgebruikerservaring, wat kan leiden tot problemen die door de ingenieurs niet zijn voorzien en frustratie veroorzaken bij de eindgebruikers, die na de eerste studie van de behoeften niet bij het ontwikkelingsproces zijn betrokken. Deze frustratie bij de eindgebruiker kan voor gevolg hebben dat er een zaak verloren is gegaan of dat er een kostbare revisie gemist werd.

Agile is een moderne goede praktijk voor collaboratieve softwareontwikkeling tussen teams en klanten, door continu te plannen, te leren en te communiceren om incrementele software op te leveren in plaats van alles op het einde van het project in één keer op te leveren. De eindgebruikers (de mensen die de software daadwerkelijk gaan gebruiken) staan centraal bij het ontwerpen van eisen en functies, en worden ook gevraagd om deze gedurende het project in kleine stappen te testen. Op deze manier kunnen er, als er een procesfout aan het licht komt waarvoor het product ontworpen is, onmiddellijk aanpassingen worden gedaan, alvorens verder te bouwen. Door het proces in kleinere delen op te splitsen en de softwarefuncties voortdurend in batches te testen en te integreren, wordt het risico van de investering in de ontwikkeling gespreid en kan de software sneller bij de gebruikers worden geïmplementeerd.

Nu we het hele proces achter softwarecreatie kennen, gaan we terug naar code- en programmeertalen.

Note

Zoals je intussen wel weet, zijn de meeste computerprogramma's geschreven in een hoge programmeertaal, maar de versie die leesbaar is voor mensen, heet broncode. Jij en een softwareontwikkelaar kunnen broncode creëren en aanpassen in een hoge taal, gebruikmakend van een software-IDE of zelfs van een basistekstververwerker.

Wat is een software-IDE?

Een software IDE staat voor ‘integrated development environment’ en is een applicatie die door ontwikkelaars wordt gebruikt om computerprogramma's te maken. In dit geval verwijst 'geïntegreerd' naar de manier waarop meerdere ontwikkelingshulpmiddelen in één enkel programma zijn gecombineerd. Een typische IDE bevat bijvoorbeeld een broncode-editor, een debugger en een compiler. De meeste IDE's bieden ook een projectinterface waarmee programmeurs alle bestanden met betrekking tot een project kunnen bijhouden. Veel IDE's ondersteunen ook versiebeheer.

Sommige IDE's bieden een ‘runtime-omgeving’ (RTE) om softwareprogramma's te testen. Wanneer een programma in de RTE wordt uitgevoerd, kan de ontwikkelaar elke gebeurtenis volgen die in de geteste applicatie plaatsvindt. Dit kan nuttig zijn om fouten te vinden en te verhelpen en om de bron van geheugenlekken op te sporen. Omdat IDE's een gecentraliseerde gebruikersinterface bieden voor het schrijven van code en het testen van programma's, kan een programmeur snel een wijziging aanbrengen, het programma opnieuw compileren en het programma opnieuw uitvoeren. Programmeren is nog steeds hard werken, maar IDE-software helpt het ontwikkelingsproces te stroomlijnen.

Er wordt een ongelofelijk groot aantal computerprogrammeertalen gebruikt door codeereders, softwareontwikkelaars, webontwikkelaars en andere professionals in computerwetenschap. Maar hoeveel zijn er nu echt?

Volgens Wikipedia bestaan er zo’n 700 programmeertalen, waaronder ook esoterische codetalen. Andere bronnen die alleen de belangrijke talen opsommen, vermelden het indrukwekkende aantal van 245 talen. Nog een andere lijst, HOPL, die beweert elke programmeertaal te benoemen die bestaat, heeft het over een totaal aantal van 8.945. Sommigen schatten zelfs dat het er  in totaal tot 25.000kunnen zijn.

Hoe kies je dan een programmeertaal om te leren? En kan je echt leren coderen? Het antwoord is ja! Dat kun je inderdaad, en je zou het moeten doen, want codes kunnen lezen wordt voor verschillende banen steeds groter.

Carlcheo maakte een nuttige infographic om ons te helpen kiezen welke programmeertaal we moeten leren en formuleert een goed startpunt om enkele van de genoemde talen te leren.

  • Als je een taal wilt die jouw kinderen kunnen leren, is Scratch aanbevolen, en als je daarmee klaar bent, wordt je aanbevolen over te schakelen naar Python.

  • Als je een taal wilt leren om bij Facebook of Google aan de slag te kunnen, dan kies je best voor Python. Het is slim om voor Python te kiezen, want ze wordt beschouwd als een van de relatief eenvoudig aan te leren talen.

  • Als je een ‘gemakkelijke’ taal wilt leren, dan kan je volgens ontwikkelaars kiezen tussen Python, Ruby en JavaScript. Deze talen bieden jou een stevige basis over programmeerlogica en syntaxis. Zodra je die stevige basis hebt, leer je alle andere talen sneller aan.

  • Als je spelletjes wilt ontwikkelen, dan is C++ de beste keuze.

  • Als je op een relatief laag niveau wilt coderen, kies dan voor C en C++, omdat zij meestal direct worden gecompileerd naar de machinetaal van het platform dat je gebruikt. Bovendien kun je met C en C++ schrijven op een manier die vrij dicht bij de meeste machinecode ligt (incrementerende pointers, enz.). Rust is een nieuwere taal op dit vlak.

  • Als je wilt werken aan iPhone-projecten, dus iOS-gerelateerde projecten, kies dan voor Swift.

  • Als je wilt werken aan Android-gerelateerde projecten, kies dan voor Java of Kotlin.

  • Als je je aangetrokken voelt tot de esthetiek van websites, is de kans groot dat je het interessant vindt om user-facing code te leren (front-end web development) en is je voorkeurstaal JavaScript.

  • Als je je aangetrokken voelt tot servers (back-end web development) en databases, kan je taalkeuze Ruby of Python zijn.

  • Als je het deel van de technische stack dat je interesseert al kent, kies je voorfront-end ontwikkeling of back-end ontwikkeling.

Tot slot, ons laatste advies: Aangezien er honderden opties zijn om een taal te kiezen, is het een goed idee om jezelf twee belangrijke vragen te stellen voordat je een keuze maakt.

  • Wat heeft jouw interesse in programmeren gewekt?

  • Wat wil je doen als programmeur?

Er zijn tal van mogelijkheden om je carrière een boost te geven. Gebruik de eerste taal om te leren denken als een programmeur en leer basisprogrammeerlogica. En vergeet niet dat een leven lang leren essentieel is om bij te blijven met taal- en technologietrends. Ook is een leven lang leren essentieel is om bij te blijven met taal- en technologietrends.

Next section
III. De software op onze toestellen begrijpen en gebruiken