Algol 68: verschil tussen versies

Verwijderde inhoud Toegevoegde inhoud
k Titel van Algol-68 gewijzigd over de redirect Algol 68: Er hoort echt geen streepje in.
Geen bewerkingssamenvatting
Regel 1:
'''Algol-68''' is een procedurele [[programmeertaal]], dieontworpen in 1968 als beoogd opvolger van [[Algol- 60]] werd ontworpen, door een werkgroep, onder leiding van [[Aad van Wijngaarden]]. [[Niklaus Wirth]],Het diedoel aanvankelijkwas zouom meeschrijvenmet aaneen dealgemeen specificatie,bruikbare stapteprogrammeertaal nate onenigheidkomen uitdie detegelijk groepveelzijdig en gingnetjes zijnopgezet eigenen weg.gespecificeerd Hijmoest ontwierpzijn. de De taal is omvangrijk, met allerlei innovatieve voorzieningen, maar tegelijk erg [[programmeertaal Pascal|Pascalorthogonaal]],. die populairderDe zouzeer wordengedetailleerde specificatie is sinds de herziening in 1971 niet veranderd. De syntaxis van de taal, inclusief het onderwijsniet-contextvrije danaspect, Algolis helemaal beschrevben in de speciaal voor dit doel ontwikkelde [[Van Wijngaarden-68grammatica]].
 
De ingewikkeldheid en ambities van taal en specificatie zorgden al tijdens de ontwikkeling voor weerstand, ook binnen de werkgroep: [[Niklaus Wirth]] stapte er uit en kwam met het eenvoudigere [[programmeertaal Pascal|Pascal]]. Ook de meeste Algol 68-compilers ondersteunen niet alle taalvoorzieningen, maar ze ondersteunen wel een taal die rijker en ingewikkelder is dan Pascal.
Niettemin was Algol-68 een van de meest vernieuwende programmeertalen, en had het een aantal mogelijkheden die nog nooit eerder waren vertoond. Het gebruik van orthogonaliteit, dat volgens sommige een beetje ''te veel van het goede'' was, was revolutionair. Veel van de nieuwe mogelijkheden van Algol-68 werden later door andere talen overgenomen.
 
Het gebruik van Algol 68 is dan vooral tot het onderwijs beperkt gebleven, waar Pascal populairder was; dit terwijl ook Pascal lange tijd een puur academisch product is gebleven in vergelijking met talen als [[Fortran]], [[PL/1]] en [[C]].
 
Het belang van Algol 68 ligt daarom vooral in de innovatieve taalconstructies en beschrijvingstechnieken, waarvan veel bij latere talen is overgenomen.
 
===Orthogonaliteit===
 
Orthogonaliteit verwijst naar de mogelijkheid om de diverse statements in een taal te combineren waarbij elke combinatie betekenisvol is. Is een taal sterk orthogonaal dan is deze ook makkelijk te leren. De negatieve kant hiervan is dat de compiler vaak geen fouten zal ontdekken, omdat deze niet weet wat de bedoeling is van de programmeur terwijl de statements op zich wel goed zijn...
Met orthogonaliteit wordt in dit verband bedoeld dat taalconstructies zo weinig mogelijk beperkt blijft tot specifieke contexten, en zo algemeen toepasbaar zijn als mogelijk. Voordeel hiervan is dat de programmeur alleen een paar algemene taalconstructies hoeft te leren, in plaats van een heleboel specifieke constructies voor specifieke situatie. Nadelen zijn dat alle combinaties van alle constructies wel een ondubbelzinnige interpretatie moeten hebben, wat de specificatie ingewikkeld maakt, en ook dat dus ook allerlei weinig gebruikte combinaties wel geldig zijn, wat het voorkomen van niet-opgespoorde programmeerfouten in de hand werkt.
 
Een voorbeeld is dat in Algol 68 [[statement]]s en [[expressie]]s grotendeels uitwisselbaar zijn: het is zondermeer geldig om dingen op te schrijven als
 
<code>
i := j +:= 5; # tel 5 op bij j, en wijs de waarde (5) van het resultaat (j) toe aan i
(i := j) +:= 5 # wijs de waarde van j toe aan i, en tel bij het resultaat (i) 5 op
</code>
 
Een tweede voorbeeld is dat in Alol 68 de komma-operator een algemene verbinder van statements is: ik kan een typische [[for-lus]] (vgl. bv. <ref>[http://www.eskimo.com/~scs/cclass/int/sx4db.html de for-loop in C]</ref>) opschrijven
<code>
FOR int i = 1, int j = 1, int total = 0
WHILE i <= UPB s AND j < UPB t
DO
s[i+=1] := t[j+=1] + t[j+=1];
total += s[i];
OD
</code>
maar net zo goed
<code>
FOR int i = 1; int j = 1; int total = 0
WHILE i <= UPB s AND j < UPB t
DO
s[i+=1] := t[j+=1] + t[j+=1],
total += s[i];
OD
</code>
alleen is de resulterende waarde van <code>total</code> in het tweede geval onvoorspelbaar, omdat de statements die de komma verbindt in willekeurige volgorde en zelfs tegelijk mogen worden uitgevoerd.
 
In dit opzicht doet de taal wel wat denken aan [[Perl]].
 
==Typering==
 
Algol 68 is sterk, statisch getypeerd: elke variabele, of om precies te zijn elke expressie die een geheugenlocatie aanduidt, heeft een specifiek type, en alle waarden die de locatie aan kan nemen moeten van dat type zijn.
 
Tegelijk is er echter een ingewikkelde coercie (automatische typeconversie) afhankelijk van de context waarin een expressie voorkomt. Zelfs het nemen van de waarde van een variabele (zoals in <code>i := j</code>) is in Algol 68 een coercie.
 
Willekeurig complexe typen kunnen geconstrueerd worden met behulp van onder andere de constructoren <code>PROC</code> (om subroutines te maken met argumenten en resultaat van een gegeven type) en <code>REF</code> (om het type aan te duiden waar waarden van het gegeven typen in gestopt kunnen worden). Dit is veel nagevolgd, bijvoorbeeld in [[C]], terwijl andere talen hogere-ordefuncties en pointers van pointers gewoon met een vast [[pointer]]-type "pointer" aanduiden (wat in de praktijk, door [[cast]]ing, ook veel gebeurt in [[C]]), of zelfs helemaal niet toestaan.
 
Het <code>REF</code>-mechanisme bleek echter door de automatische typecoercie en andere syntactische afkortingen voor verwarring in het gebruik te zorgen. Dit is beter in Pascal en C.
 
==Externe links==
 
*http://www.algol68.org
*[http://www.xs4all.nl/~jmvdveer/algol.html Een Nederlandse Algol-implementatie onder de GPL: Algol 68 Genie]