Forth är ett ovanligt språk. Det är i första hand en tolk och har ett kommandoradsgränssnitt så att det kan användas i realtid. Men det har också förmågan att ta uppsättningar av kod och kompilera dem. Så det är något av en hybrid.
På grund av detta används Forth ofta på hårdvara som inte har ett traditionellt operativsystem. Det används också ofta för att styra maskiner och har använts inom rymdforskning – till och med på Philae, sonden som landade på komet 67P/Churyumov-Gerasimenko.
Historia
Forth utvecklades av Charles Moore med början 1968 när han arbetade med grafikprogrammering på Mohasco Industries. Men den första fullständiga implementeringen av Forth kom inte förrän 1971, när Moore skapade ett fristående system för att styra 11-meterteleskopet vid det amerikanska National Radio Astronomy Observatory (NRAO).
Förre versioner av Forth hade fångat programmeringsgemenskapens uppmärksamhet. Men vid den här tidpunkten blev den mycket populär i astronomisamhället. Så 1973 grundade Moore FORTH, Inc tillsammans med sina NRAO-kollegor Elizabeth Rather och Edward Conklin.
Företaget portade programmet till många olika system. Och FORTH, Inc fortsätter att vara ett viktigt företag som tillhandahåller Forth-relaterade produkter till personer inom näringslivet, den akademiska världen och regeringen.
Översikt över Forth
Det finns ett antal unika aspekter på programmeringsspråket Forth. Vi kommer att diskutera de viktigaste här.
Forth-funktioner
Forth erbjuder många unika funktioner:
- Interaktiv programmering
- Skapande av kompilerade utvidgningar av språket som kallas ”ord”
- Staplar och omvänd polsk notering
- Direkt koppling mellan användare och hårdvara.
Reverse Polish Notation
Forth utför matematiska beräkningar med hjälp av Reverse Polish Notation. Detta är beroende av lagring av tal i en stapel.
Konsumerar beräkningen: 2 + 3
. I Forth skulle detta göras genom att placera 2 på stapeln, sedan placera 3 på stapeln och sedan addera dem. Detta skulle se ut ungefär så här: 2 3 +
.
Det verkar lite konstigt, men det är lättare för datorn att tolka, eftersom det är så här datorer faktiskt gör beräkningar. Och när man väl har vant sig vid det som kodare blir det ganska naturligt.
Det finns dessutom inget behov av parenteser. Tänk på följande två exempel. (Observera: Backslash-tecknet startar en kommentar.)
2 3 + 5 * This is the same as (2 + 3) * 52 3 5 * + This is the same as 2 + 3 * 5
I det första exemplet skjuts 2 upp på stapeln följt av 3. 2 är alltså nummer två på stapeln och 3 är nummer ett. Operatorn ”+” tillämpas på de två första elementen i stapeln. Detta tar bort dessa två element från stapeln och lämnar 5 (2 + 3) på toppen av stapeln.
Därefter trycker vi in 5 på stapeln. Det sätter en 5 i stackens första och andra position. Slutligen tillämpar vi operatorn ”*”, vilket resulterar i att 25 (5 * 5) placeras överst på stapeln.
I det andra exemplet placerar vi 2, 3 och 5 på stapeln, så att 5 finns i den första positionen, 3 i den andra och 2 i den tredje. Sedan tillämpar vi operatorn ”*” på de två översta elementen i stapeln (5 * 3) vilket resulterar i att 15 placeras överst på stapeln.
I det här läget befinner sig 15 i första positionen och 2 i andra positionen. När operatören + tillämpas lämnas 17 (15 + 2) på toppen av stapeln.
Exempelprogram
Det följande programmet är mycket enkelt, men det demonstrerar en hel del av vad som händer i språket.
: OUTMATH Output a mathematical calculation ." We will now calculate: (2 + 3) * 5" CR 2 3 + 5 * ." This equals: " . CR ; OUTMATH
Det första programmet gör är att definiera en funktion som heter OUTMATH
. De rader som följer efter är en del av funktionen fram till och med den rad som avslutas med ett semikolon. Den första raden skriver ut texten ”Vi kommer nu att beräkna: (2 + 3) * 5” och följer den med en vagnretur.
Nästa rad utför den beräkning som vi diskuterade ovan, vilket resulterar i att 25 placeras högst upp på stapeln. Den sista raden i funktionen ger ut: ”Detta är lika med: ” följt av värdet på toppen av stapeln (representerat av ”.”) och en vagnretur.
Därefter kör vi helt enkelt funktionen. Så när programmet körs ger det ut:
We will now calculate: (2 + 3) * 5This equals: 25
Learning Forth
För de flesta programmerare är detta ett nytt sätt att tänka. Men det är förvånande hur naturligt det verkar när man väl börjar arbeta med det. Här är några handledningar och böcker som får dig att arbeta med språket.
Forth-handledningar
Det finns massor av handledningar på nätet. Eftersom Forth är främmande för programmerare som inte är Forth-programmerare samtidigt som det är självklart för nuvarande användare, glänser många av handledningarna över saker som kan vara förvirrande för nybörjare. Dessa handledningar har inte detta problem.
- Easy Forth: denna korta Ebook är en utmärkt introduktion. Dess enda nackdel är att den inte innehåller så många exempel. Så kolla in några av exemplen nedan.
- A Beginner’s Guide to Forth: Detta är en annan bra introduktion. Den är lite mer teknisk, men har fler exempel.
- And So Forth…: Detta är en mycket grundlig introduktion till Forth – nästan lika bra som en bok.
Forth Books
Det är ofta lättare att lära sig ett nytt språk genom att skaffa sig en bok som kan ta dig steg för steg genom processen. Det finns många bra böcker om Forth – särskilt från 1980-talet, då Forth verkligen tog fart. Här är en samling av de bästa och viktigaste.
- Upptäck Forth: Learning and Programming the Forth Language (1982) av Thom Hogan: Detta är en bra och kortfattad introduktion till språket Forth.
- Starting Forth: An Introduction to the Forth Language and Operating System for Beginners and Professionals (1982) av Leo Brodie: Detta är en klassiker och ett bra sätt att lära sig Forth. Den är slut, men det är inte svårt att hitta begagnade exemplar för lite pengar. Den finns också gratis på nätet. Avancerade Forth-programmerare kanske vill kolla in Brodies nyare, Thinking Forth.
- Programming a Problem Oriented Language: Forth – How the Internals Work (2014) av Charles Moore: Detta är en Kindle-version av den bok som Forths skapare skrev för länge sedan. Den ger fortfarande skarpa insikter om språket, men är inte det bästa valet att börja med.
- Forth Programmer’s Handbook (2007) av Elizabeth Rather och Edward Conklin: Detta är en mer avancerad bok om Forth av de andra två Forth-pionjärerna. Se även Rather’s book, Forth Application Techniques (2006).
Other Resources
- Forth Interest Group: Denna webbplats har all slags intressant information, inklusive gamla historiska dokument. Tyvärr har den också många trasiga länkar. Men den är ändå värd att kolla in.
- Links to Forth Programs: Detta är en stor samling av riktiga exempelprogram som t.ex. ett kalkylblad och en Sudoku-pussellösare.
- Forth Google Group: Detta är en mycket aktiv grupp av Forth-användare som ställer och svarar på frågor.
- Forth Subreddit: Detta är inte ett särskilt aktivt forum, men det finns ändå kunniga personer på det.
Forth-implementationer
Det har funnits en hel del implementationer av Forth genom åren. Forth Interest Group har en lång Forth Compilers Page. Så om du råkar ha en PDP-11 som står i garaget kan du skaffa en Forth-kompilator till den! Men för modernare system är här de vanligaste alternativen.
bigFORTH
I mitten av 1980-talet utvecklade Dietrich Weineck, Georg Rehfeld och Klaus Schleisiek volksFORTH för 16-bitarsmaskiner som 8086 IBM PC och 6502 Apple-, Commodore- och Atari-maskiner.
Sluttligen skapade de en 32-bitarsversion för den (16-bitars buss) 68000-baserade Atari ST. Även om volksFORTH gjorde framsteg dog projektet i stort sett (även om det senare återupptogs).
Bernd Paysan var dock tillräckligt intresserad av denna version av volksFORTH (som då kallades turboFORTH) för att han gjorde den till grund för bigFORTH.
Dess första version släpptes för Atari ST 1990. År 1995 hade bigFORTH anpassats till 386, och året därpå fanns den tillgänglig för Windows NT, OS/2 och Linux.
Grafiskt gränssnitt
På samma gång påbörjade Paysan arbetet med MINOS. (Tekniskt sett är det ”MINOS”, men det kallas normalt bara ”MINOS”.)
Det är ett grafiskt gränssnitt för bigFORTH. Det kanske är enklast att tänka på det som ”Visual bigFORTH” som Visual Basic, för det är mer eller mindre vad det är. Det skapades först för X-Windows-systemet. Men det fanns snart tillgängligt även för Windows.
Utvecklingen av både bigFORTH och MINOS verkar ha upphört runt 2010. De är dock båda lätt tillgängliga och ganska användbara (bigFORTH är ANSI-kompatibelt). MINOS är faktiskt väldigt roligt att leka med.
bigFORTH Resources
Om du vill använda bigFORTH eller till och med utveckla för det har du alla verktyg du behöver:
- Källkod: Detta är koden från den senaste officiella utgåvan den 22 mars 2010, version 2.4.
- Debianpaket: ett lättinstallerat paket för alla Debianbaserade Linuxdistributioner (t.ex. Ubuntu, Mint). Det installeras i /usr/local/bin och innehåller MINOS, även om det kallas xbigforth.
- Windows Self-Installing Executable: samma som Debianpaketet, men för Windows. MINOS heter till och med xbigforth.exe.
- Dokumentation (PDF): Denna nästan 300-sidiga bok fungerar som en handledning och referens, skriven av JL Bezemer. Mycket av den handlar om generisk Forth och är vad ”And So Forth…” är hämtat från.
- Bernd Paysans hemsida: Denna sida har en hel del intressant Forth-relaterad information och exempel. Särskilt värt att notera är Paysans Forth-baserade markupspråk.
- bigFORTH Repository: den ultimata destinationen för alla dina bigFORTH-behov.
Gforth
Gforth är GNU-implementationen av Forth. Den har en framstående stamtavla.
Gforth-projektet startades 1992 av bigFORTH-skaparen Bernd Paysan och Anton Ertl, med betydande bidrag från Jens Wilke.
Det var en kombination av bigFORTH och den mycket äldre fig-FORTH (se nedan). Men dess historia är snedvriden, eftersom bigFORTH kom från volksFORTH, som baserades på fig-FORTH.
Som ett GNU-projekt har mycket arbete lagts ned på det sedan det startade. Det är nu helt ANSI-kompatibelt och har uppnått alla sina ursprungliga mål. Den senaste versionen är 0.7.3, med det senaste inlägget (av Paysan) den 25 februari 2013.
Inom fria Forth-implementationer är Gforth den mest använda. En del av detta beror bara på att den är en del av GNU-projektet och dess tillgänglighet. Men det beror också på att den är kraftfull och snabb.
Gforth Resources
Gforth har alla de resurser du behöver för att använda den till vad du än behöver:
- Källkod: Den här sidan tillhandahåller Gforths källkod från version 0.2.1 fram till den nuvarande, 0.7.3.
- Debianpaket: Det finns olika paket tillgängliga för Debian Linux-distributionen. Observera att beroende på vilket paket du väljer kan du behöva installera ett eller flera andra paket först.
- Windows Self-Installing Executable: Detta är en tidigare (0.7.0) version av Gforth, men ett snabbt sätt att komma igång.
- Documentation (PDF): Denna 250-sidiga bok gäller för version 0.7.0 av Gforth. Den finns också tillgänglig i HTML-format.
- Gforth Repository: I stort sett allt som har med Gforth att göra finns här.
pbForth
pbForth tycks inte längre stödjas, men det är en så pass intressant implementering av Forth att det är väl värt att kolla in den.
Som vi har diskuterat har Forth alltid förknippats med hårdvarustyrning. Så det var inte alls förvånande att en Forth-implementering skapades för LEGO MINDSTORMS-robotpaketet – närmare bestämt 16-bitars RCX som kom ut 1998.
Det verkar aldrig ha uppdaterats för att fungera med den andra generationen, NXT-serien, som kom ut 2006, och inte heller med den nuvarande MV3, som kom ut 2013.
Trots att det inte finns någon officiell webbplats för pbForth, så går det fortfarande att lära sig mer om det och till och med använda det. Det kan dock vara en brant inlärningskurva, eftersom det inte finns så mycket information. Och det är klart att du skulle behöva en LEGO MINDSTORMS RCX (de är inte så svåra att hitta begagnade).
NXT använder en helt annan (och 32-bitars) processor, så pbForth skulle definitivt inte fungera med den. Ändå kan det vara roligt. Och om du har lust kan du tänka dig att portera det till andra och tredje generationens kit.
pbForth-resurser
Den information som finns tillgänglig på det vanliga internet är i allmänhet knapphändig och länkar alltid till pbForth-hemsidan, som inte har varit i drift sedan åtminstone 2010. Det är bara tack vare Internet Archive som mycket av detta finns tillgängligt.
- History of LEGO Robotics: även om den inte handlar om pbForth ger den en snabb översikt över LEGO MINDSTORMS-produkter.
- Introduction to pbForth (PDF): denna 30-sidiga handledning hjälper dig att komma igång med språket.
- phForth Source Code: Observera att pbForth är skrivet i assembler och Tcl, så du måste ha de verktygen tillgängliga.
- Windows GUI: den här filen kan köras, även om det kan vara mer komplicerat att få den att göra något. Om du vill ha pbForth för Linux eller Mac måste du använda källkoden.
- phForth Home Page Circa 2009: Den här sidan innehåller länkar till en hel del intressant information om pbForth, framför allt ett halvt dussin exempelskript.
Andra implementationer
- fig-FORTH: Det här är en av de tidigaste Forth-implementationerna, skapad av Forth Interest Group. Det är ett 16-bitars genomförande. Den finns tillgänglig för några underbara gamla datorer som Data General Eclipse och Alpha Micro, samt 8086- och 6502-baserade datorer. Problemet är att det inte finns några körbara filer – bara assembleringskod. Och i de flesta fall endast bitmap-PDF-filer av koden. Verklig kod verkar endast finnas tillgänglig för 8088/8086, PDP-11 och 6800. (6800 är en 8-bitars processor, så tydligen fanns det en 8-bitars version av fig-FORTH.)
- SP-Forth: Detta är en gratis Forth-implementering för Windows och Linux.
- 4tH: Detta är en lättanvänd Forth-implementering som finns tillgänglig för ett stort antal hårdvaror (inklusive Raspberry Pi), och som innehåller bra dokumentation.
- SwiftForth™: Detta är Forth-kompilatorn från det ursprungliga företaget som introducerade Forth i världen. Det är en kommersiell produkt, men den har ett rimligt pris.