APL
A Programming Language
Vaak verguisd door lui die zeggen dat het onleesbaar is,
en dat het GEK is dat APL formules van rechts naar links evalueert.
Maar neem eens het volgende in overweging:
De meeste mensen vinden dat je
5 + 4 x 3 =
moet uitrekenen als 17 omdat je eerst 4 met 3 moet vermenigvuldigen
en er DAN pas 5 bij moet optellen.
De allereerste rekenmachientjes vonden dat er 27 moest uitkomen omdat
die niet konden wachten met rekenen en meteen bij het intoetsen van
de x alvast 4 bij 5 optelden, en het geheel dan met 3 vermenigvuldigden.
Je moest daarop bedacht zijn en in dit geval de formule intoetsen
met een gewijzigde volgorde om het goede resultaat te krijgen:
3 x 4 + 5 =
Die tijd is voorbij en de moderne rekenmachines kunnen zelfs met
haakjes overweg.
Er is echter nog steeds een groep notoire HP-gebruikers die er vanaf
het begin een heel andere gewoonte op na hielden.
Zij wilden de rekenmachine bedienen alsof het een CPU was, en de manier
waarop bovenstaande formule moest worden ingetoetst is de volgende:
5 (enter) 4 (enter) 3 x +
Dat is niet achterstevoren, maar BINNENSTEBUITEN !!!
En hoewel de tijd van assemblerprogrammeren voor gewone berekeningen
reeds lang vervlogen is blijven HP-gebruikers dit een heel fijne en
logische manier van werken vinden.
Maar nu weer naar de moderne rekenmachines. En dan bedoel ik niet de
supermachines die programmeerbaar zijn en dus beter met computers zijn
te vergelijken, maar de (wetenschappelijke) calculators waar je nog wel
aparte toetsen hebt voor de ingebouwde functies als SIN, COS, LOG,
kwadrateren (K) en worteltrekken (W).
Bij rechte driehoeken wordt vaak de volgende formule gebruikt:
2 2 2
c = a + b
Hoe berekent men c als a en b bijvoorbeeld 3 resp 4 zijn?
Natuurlijk:
als de Wortel van 3 kwadraat plus 4 kwadraat.
In formule:
_____________
c = (W) 3(K) + 4(K)
En hoe toetst men dat in op een geavanceerde WC (Wetenschappelijke
Calculator)?
3 (K) + 4 (K) = (W)
Je ziet dat wat er als eerste in de formule staat (W, het worteltrekken)
wel als LAATSTE wordt ingetoetst.
En dat vindt men nu nog steeds heel normaal.
Wat moppert men dan nog over APL als men in de praktijk reeds lang geleerd
heeft dat een computer/rekenmachine de dingen in een andere volgorde
uitrekent dan men ze zelf in formulevorm opschrijft?
Het probleem ligt niet in de computers/WC's, maar in de rare vorm waarin
mensen formules opschrijven, en de verwarrende afspraken die men heeft
gemaakt om ze te interpreteren.
Zo schrijft men met pen op papier, maar ook op rekenmachientjes nog
steeds een x voor een vermenigvuldiging. Dat vindt men in APL ook terug.
Maar in elke andere programmeertaal wordt hiervoor een * gebruikt.
Waarom nou toch weer een ander symbool introduceren voor iets dat al
eeuwen met een x werd aangegeven?
Over symbolen gesproken: in de algebra van de logica kennen we een paar
extra wikundige bewerkingen met aparte symbolen:
^ voor de logische EN
V voor de logische OF
> voor de (numerieke) groter-dan
< voor de kleiner-dan
~ voor de ontkenning van het beweerde
We gebruiken die bijvoorbeeld voor het formuleren van beslissingen.
Als ik een wagen heb van 2 breed en 3 hoog en een laadcapaciteit van
1000 kilo dan kan ik daarin een kast met breedte B, hoogte H en gewicht G
vervoeren indien:
H < 3 EN B < 2 EN G < 1000
ofwel
H < 3 ^ B < 2 ^ G < 1000
Maar een kast kan ook op zijn kant worden gelegd zodat het OOK kan als
B<3 ^ H<2. Bovendien als precies B=3 EN H=2 dan kun je je vingers er niet
meer tussen krijgen.
In plaats van H=2^B=3 V H=3^B=2 kunnen wel schrijven HxB=6 anders wordt
het onnodig ingewikkeld.
In totaal wordt dan de formule:
H < 3 ^ B < 2 V H < 2 ^ B < 3 ^ ~ H x B = 6 ^ G < 1000
Of toch niet?
Moeten we haakjes gaan gebruiken? Waar dan?
Nu staat u met de mond vol tanden, want zo zeker als dat u op de lagere
school hebt geleerd dat vermenigvuldigen gaat voor optellen, zo zeker
hebt u NIET geleerd of EN voorgaat op OF, en ook niet of x voorgaat op =
dawel op ~ . Om nog maar niet te spreken over < en >.
Dan heb je ook de "modulo" functie nog en de "faculteit" (die in de kansrekening
zo'n belangrijke functie vervult.
Als je daarvoor allemaal onderlinge voorrangsregels moet vaststellen en
onthouden dan word je gewoon bang om ze te gebruiken.
APL is hierin heel erg praktisch. Het bouwt gewoon logisch voort op de meest
eenvoudige programmeerinstructie zoals die in de meeste programmeertalen
wordt gehanteerd. Voor een simpele optelling schrijft men bijv. in Pascal:
A := B + C
Hierbij is := het symbool dat aangeeft dat een waarde aan A moet worden
toegekend. Het is echter het LAATSTE wat er gebeurt! Namelijk EERST wordt
de optelling, die achteraan staat, uitgevoerd. Natuurlijk omdat DAN pas het
resultaat bekend is dat aan A moet worden toegekend.
De logische voortzetting, waarbij er NIET wordt gediscrimineerd tussen alle
rekenkundige symbolen, is dat in een ingewikkelde formule EERST de meest
rechtse bewerking wordt uitgevoerd, het resultaat wordt gebruikt voor de
bewerking die daarna de meest rechtse is, en als laatste wordt de meest
linkse bewerking uitgevoerd (en dat is meestal de toekenning aan een of
andere variabele).
Dat is EENDUIDIG en makkelijk te onthouden.
Als er een reden is om in deze volgorde in te grijpen dan kunnen haakjes
worden toegepast.
WAAROM AL DIE RARE SYMBOLEN?
Wordt er ook nogal eens van APL gezegd. APL is een taal die ontsproten is aan
de wiskunde. En in de wiskunde schrikt men voor symbolen niet terug. Wie op
de middelbare school wiskunde heeft gehad kent de meeste van die symbolen wel.
De meeste gangbare programmeertalen hebben echter ervoor gekozen om daarvoor
(engelse) woorden te gebruiken. Bijvoorbeeld AND voor ^ en OR voor V en
NOT voor ~. In het oeroude originele COBOL waren zelfs de + - en x vervangen
door ADD, SUBTRACT en MULTIPLY. Dus als je echt bang bent voor symbolen moet
je maar COBOL gaan gebruiken!
Het heeft voor de leek het voordeel dat het programma er leesbaarder uitziet,
maar voor de programmeur het nadeel dat een flink aantal woorden niet meer kan
worden gebruikt als naam voor een programma of variabele.
In APL bestaat GEEN ENKEL gereserveerd woord! Alle ingebouwde functionaliteit
is gekoppeld aan een symbool. Maar deze symbolen bouwen op een heel logische
wijze voort op de wiskundige symbolen die iedereen op de middelbare school
heeft geleerd.
Wat er wel een extra dimensie aan geeft is dat APL een "array georienteerde"
taal is. Dat wil zeggen dat een variabele net zo goed een getal kan bevatten
als een vector of matrix. In verband daarmee heeft APL ook ingebouwde functies
voor het spiegelen van een matrix, genereren van reeksen getallen en het
opmaken (bepalen van de layout) van tabellen. En daarvoor is een nieuwe serie
symbolen in het leven geroepen. Wie enige tijd met APL werkt groeit daar
echter net zo makkelijk in als dat een beginnend C-programmeur leert omgaan
met bijvoorbeeld alle varianten van de "print" functie.
|