Forth (programmeertaal)

Forth is een programmeertaal die nogal afwijkt van de meeste andere programmeertalen. LISP is misschien nog het meest verwant maar mist de in Forth centraal aanwezige parameter- en return-stacks. Forth is door Charles Moore bedacht toen hij rond 1968 computerprogramma's schreef om radiotelescopen te bedienen. De interactieve natuur van de taal maakt deze zeer geschikt voor dit soort besturingen.

De naam Forth is een variant op het woord fourth (vierde), aangevend dat het een zogenaamde vierdegeneratietaal betreft. Het systeem waarop de eerste Forth-interpreter werd geschreven kende slechts bestandsnamen van maximaal vijf tekens, daarom werd de u uit de naam geschrapt.

Forth bestaat uit een basisset van commando's of subroutines (in Forth woorden genoemd) die altijd voorhanden zijn; de programmeur maakt met behulp van deze woorden nieuwe woorden die daarna meteen volwaardig deel uitmaken van de taal. De voor de programmeur vrij toegankelijke parameter-stack, waar de te bewerken waarden worden klaargezet en waar de uitkomsten van berekeningen verschijnen, maakt het gebruik van globale variabelen vrijwel onnodig. Woorden in Forth mogen alle ASCII-tekens bevatten, met uitzondering van de spatie: deze laatste vormt de scheiding tussen de woorden. Dat is dan meteen de complete definitie van de taal, want alle andere zaken (operatoren, condities, enzovoort) worden door normale Forth-woorden afgehandeld. Dit betekent onder meer dat een programmeur de werking van de taal compleet kan veranderen door deze woorden te herdefiniëren (zie het voorbeeld verderop met het woord "1").

Ieder Forth-programma is eigenlijk een applicatie-specifieke uitbreiding van de taal. Forth levert extreem compacte programma's af met een heel goede executiesnelheid omdat het aanroepen van een subroutine in hoge mate geoptimaliseerd is. Een simpele Forth, met de circa 50 minimaal benodigde woorden waarmee alle andere commando's kunnen worden gemaakt, kan al in 2 of 3 kilobyte worden geprogrammeerd. Omdat de implementatie zo eenvoudig gaat, is Forth dan ook meestal een van de eerste hogere talen die voor een nieuwe microprocessor beschikbaar komt.

Het belangrijkste nadeel van Forth is dat via het beschreven uitbreidingsmechanisme het aantal mogelijkheden van de taal zo groot wordt. Een niet uitvoerig documenterende programmeur zal zijn werk moeilijk aan een ander kunnen overdragen — programma's dragen sterk het stempel van hun maker. Een standaard Forth-stijl bestaat niet.

Forth werkt interactief, en het verschil tussen interpreteren en compileren bedraagt slechts twee leestekens (":" en ";"). Omdat Forth bestaat uit zeer veel kleine incrementeel opgebouwde en direct testbare subroutines, en omdat bij een goede programmeerstijl zonder variabelen de data verborgen blijft, beschouwen sommige programmeurs Forth als een object-georiënteerde programmeertaal avant la lettre.

Forth is vrij gemakkelijk op een chip te implementeren en er zijn dan ook speciale RISC-microprocessoren die Forth-instructies als machinetaal hebben.

De in veel printers gebruikte pagina-opmaaktaal PostScript is gebaseerd op Forth.

Een vocabulaire
Forth bestaat uit een set woorden die als ze worden uitgevoerd bepaalde eerder gedefinieerde handelingen verrichten. Om een woord uit te voeren toets je de naam ervan in en drukt op Enter. Het woord words geeft een opsomming van alle op dat moment in die Forth beschikbare woorden. Een woord kan opnieuw worden gedefinieerd; dit heeft geen effect op eerdere definities van het woord maar het betekent wel dat latere aanroepen de nieuwere definitie zullen gebruiken.

Voorbeelden

Interpreteren
Als je in Forth intypt:

1 3 + .

dan wordt op het scherm getoond:

4

Het getal 1 wordt door het te noemen (in te typen) op de stack gezet, daarna het getal 3, de operator '+' (plus) telt de bovenste stackwaarde op bij het getal dat als tweede op de stack staat, waarna '.' (dot) het printcommando is dat de bovenste stackwaarde afdrukt en daarna verwijdert.

Compileren
Als je intypt:

: hello cr ." Hello, world!" ;

dan wordt het woord hello op de volgende wijze gecompileerd:

: betekent begin compilatie
hello is de naam van het nieuwe woord
cr (carriage return) wil zeggen druk een nieuwe regel af
." betekent druk de tekens af tot aan de volgende " behalve de eerste spatie (delimiter)
; einde van de compilatie.

Als nu wordt ingetypt:

hello <cr>

dan wordt er afgedrukt:

Hello, world!

Herdefinities 
Door herdefiniëren van standaardwoorden kan een zeer verwarrende Forth variant worden gemaakt. Zo kan bijvoorbeeld worden gedefinieerd:

: 1 2 ;

Waarna intypen van het getal 1 het getal 2 op de stack zet, met de te verwachten rampzalige gevolgen voor later te definiëren woorden:

1 1 + .

Zal dan 4 afdrukken. Aan de positieve kant maakt deze mogelijkheid, wanneer ze met beleid wordt gebruikt, de taal flexibel.

Daarom is het van groot belang dat alle Forth-routines worden toegelicht in een stackdiagram, tussen de ( ) achter de definitie. (Het teken "(" is ook een Forth-woord, maar het teken ")" is dat niet).

Externe links
 Forth books door Elizabeth Rather en anderen bij FORTH, Inc.
 Programming Forth door Stephen Pelc, MPE
 Gforth tutorial Gforth is onderdeel van de GNU Compiler Collection (gcc).
 A Beginner's Guide to Forth door Julian Noble
 Starting Forth web editie, Forth introductie door Leo Brodie — een klassieker (niet meer verkrijgbaar)
 Thinking Forth, Leo Brodie's boek over de Forth programmeer methode (creative commons license)
 Stack Computers, door Philip Koopman, Jr. Een boek over stack-gebaseerde computers, inclusief de Novix NC4016 en de Harris RTX serie, beiden op Forth baserende CPUs
 https://www.hcc.nl/forth (Nederlandse vereniging van Forth gebruikers)

Programmeertaal