Forth (programmeringsspråk)

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 29 september 2020; kontroller kräver 18 redigeringar .
Vidare
Semantik nödvändigt
Språkklass programmeringsspråk , tolkat programmeringsspråk och kompilerat programmeringsspråk
Utförandetyp tolk/kompilator
Framträdde i 1971
Författare Charles H. Moore
Typ system oskrivet
Stora implementeringar gForth , pForth, kForth, SP-Forth [1] , win32forth [2]
Dialekter FORTH-79, FORTH-83, ANSI FORTH 1994, ColorForth , RetroForth . Forth 2012 Standard
Blivit påverkad APL , Lisp
påverkas PostScript , Factor och andra sammanlänkade språk
 Mediafiler på Wikimedia Commons

Forth ( eng.  Forth ) är ett av de första konkatenativa programmeringsspråken , där program skrivs som en sekvens av lexem ("ord" i terminologin för det Forth språket). Matematiska uttryck representeras av postfix- notation när du använder stacknotation . Stöder mekanismer för meta-extension av språkets semantik och syntax för att anpassa sig till det önskade ämnesområdet. Basnivåsyntaxen i Forth är enkel och består av en enda regel: "alla definitioner är åtskilda av mellanslag". Forth definitioner kan ha vilken kombination av tecken som helst.

Ett antal egenskaper, nämligen interaktivitet , flexibilitet och enkel utveckling, gör Forth till ett effektivt språk för tillämpad forskning och verktygsbyggande. Inbyggda styrsystem är uppenbara användningsområden för detta språk . På grund av sin enkelhet är kompilatorn , och ofta den Forth- kompilatorn , lätt att implementera för de allra flesta mikrokontroller , och används också som ett korsprogrammeringsverktyg . Den används också vid programmering av datorer som kör olika operativsystem eller som en oberoende operativsystemmiljö.

Historik

Skapande

Språket Forth skapades av Charles X. Moore i slutet av 1960-talet och början av 1970-talet. Moore kallade sitt språk för fjärde , och trodde att det skulle vara den fjärde generationens datorspråk .  Men eftersom han arbetade på en IBM 1130 , som tillät namn sammansatta av högst fem versaler, konverterades namnet till FORTH ( eng. fram  - framåt). Moores första experiment med att skapa en enkel tolk som gör det lättare att skriva program för att styra astronomisk utrustning går tillbaka till slutet av 1950-talet. [3] 

Sedan 1971 arbetade Moore vid National Radio Astronomy Observatory och deltog i utvecklingen av program för att samla in och bearbeta data som tas emot av radioteleskopet . Det var då som den första implementeringen av Forth-språket dök upp. Moores samarbetspartner Elizabeth Rather , som kan anses vara världens andra fortprogrammerare, deltog också i detta arbete . 

Det nyskapade språket accepterades som det huvudsakliga programmeringsspråket av American Astronomical Society . Senare, 1973, grundade Charles Moore och Elizabeth Rather FORTH, Inc [4] , under vilket språket portades till många plattformar under det följande decenniet.

I slutet av 1970-talet bildades FORTH Interest Group (FIG) av programmerare som var intresserade av att utveckla språket. Denna grupp utvecklade konceptet FIG Forth Model, ett allmänt tillgängligt system som enkelt kan porteras till populära datorarkitekturer. Detta Forth-referenssystem, FIG-FORTH, betraktas ofta som den ursprungliga språkstandarden.

Standardisering

Idén om officiell standardisering av Forth har ursprungligen sitt ursprung inom International Association of Astronomers ( English  Astronomical Sciences, AST ). I maj 1977, vid ett möte vid Kitt Peak National Observatory ( USA ), utvecklades en ordlista för Forth-språket, betecknad som AST.01.

I februari 1978 antogs FORTH-77-standarden i Utrecht , som syftar till implementering av mikrodatorer .

I oktober 1979 avslutades ett möte på Santa Catalina Island ( Kalifornien ) med utvecklingen av FORTH-79-standarden, som gäller alla typer av datorer.

Hösten 1983 hölls ett möte för att utveckla nästa standard, godkänd 1984 som FORTH-83. Fort-83-standarden skiljer sig från Fort-79-standarden i vissa detaljer, men inte i sak.

1988 organiserades gruppen SIGFORTH [5] som en del av ACM ; det fanns också en motsvarande rysk ACM-grupp (ordförande - Prof. S. N. Baranov ( St. Petersburg , SPIIRAS )). SIGFORTH finns nu som en del av den allmänna SIGPLAN

1994 , efter en lång förhandling som involverade många intresserade företag, antogs ANSI- språkstandarden Forth. [6]

Den nuvarande språkstandarden Forth antogs 2012. [7]

Vidareutveckling och användningsfall

Ett välkänt exempel på Forts framgång är dess användning i mjukvaran för ett fordon med djuphavsnedstigning, när de letade efter Titanic 1985 . Fort användes också i programvaran för spektrografen på skytteln , i mikromoduler för att kontrollera konstgjorda jordsatelliter, för kontrollsystemet på Riyadhs flygplats , datorseendesystem , automatisering av blodanalys och kardiologisk kontroll, ficköversättare.

Den fjärde dialekten används i OpenBoot  , den underliggande datorprogramvaran baserad på SPARC- och PowerPC-processorer .

I början av 1980 -talet skapade John Warnock och Chuck Geschke från Adobe Systems PostScript-språket [8] . Trots likheterna mellan språken, noterade John Warnock [9] att Forth inte var ett inflytande på skapandet av PostScript.

Det finns processorer och kontroller som stöder beräkningsmodellen för språket på hårdvarunivå. Många open source -implementationer av Forth har skapats för olika hårdvaruplattformar. Separata företag (bland vilka det bör noteras, först och främst, FORTH, Inc grundat av Charles Moore och det brittiska företaget MicroProcessor Engineering Ltd. [10] ) tillhandahåller kommersiella versioner av språket med olika möjligheter.

Två hemdatorspel från Electronic Arts skapade på 1980-talet skrevs i Forth: Worms? (1983) [11] och Starflight (1986). [12] Canon Cat (1987) använde Forth som systemprogrammeringsspråk .

EuroForth-konferenser hålls årligen, inklusive i Ryssland, England, Österrike, Tyskland, Spanien, Tjeckien (tidigare i Tjeckoslovakien). [13]

Grundläggande begrepp i det klassiska Forth-systemet

Huvuddelen av Forth-systemet är en länkad lista med ord , eller ordbok , från vilken ett ord kallas vid namn för att utföra specifika funktioner. Fjärde programmeringen består av att definiera nya ord baserat på de ord som tidigare definierats i ordboken. När nya ord väl har sammanställts till en ordbok skiljer de sig inte i form från ord som redan finns i ordboken. Beskrivningen av ett ord i en ordbok kallas en post .

Strukturen för en "typisk" fjärde ordbokspost är:

Konventionellt kan Forth-artiklar delas in i två kategorier: lågnivåartiklar och fjärdeartiklar . Artiklar av den första typen innehåller i kodfältet en pekare till en procedur i koderna för målprocessorn som direkt utför ordets semantik. Parameterfältet för sådana artiklar innehåller parametrarna som skickas till proceduren, eller själva koden. Fjärde artiklarna innehåller pekare till andra artiklar i parameterfältet, och kodfältet pekar på en speciell procedur som kallas länktolkare . I praktiken beror artikelns struktur på implementeringen, men liknar som regel den som diskuterats ovan. Principen som används i parameterfältet för en fjärde artikel kallas trådad kod och länktolken kallas en  virtuell framåt maskin .

Grammatiskt är texten som behandlas av Forth- översättaren en sekvens av tokens ( eng.  token ), åtskilda av mellanslag och radsluttecken. Inmatningssträngsöversättaren väljer nästa token och söker efter den i den aktuella ordboken, och sökningen utförs från nyare ord till äldre. Om ordet inte hittas görs ett försök att tolka token som en nummerinmatning, som, om den lyckas, skjuts upp på toppen av stapeln. Om symbolen matchar det Forth ordet, analyseras det aktuella tillståndet för Forth-systemets kompileringsflagga . Om flaggan rensas, exekveras ordet - kontrollen överförs enligt pekaren i kodfältet för den hittade artikeln. Om flaggan är inställd kompileras ordet , det vill säga en pekare till dess kodfält läggs till den för närvarande skapade artikeln. Om ett nummer har översatts, skjuts det ur stapeln och kompileras till en bokstavlig kod , vars exekvering i en ordbokspost trycker upp numret överst i stapeln. Dessutom kan ord innehålla en omedelbar flagga , i vilket fall de alltid exekveras.

Mekanism för att överföra parametrar mellan ord:

Språket ger ett sätt att arbeta med systemminnet som en linjär region.

En obligatorisk komponent i systemet är också returstacken. Tillgänglig programmatiskt för att ändra programmets kontrollflöde.

Allt ovanstående gäller bara konceptet Fort i den första approximationen. Forth är inte precis ett programmeringsspråk; snarare överlappar det föreställningen om ett programmeringsspråk. Forth är mer en virtuell maskin och ForthOS operativsystem. [fjorton]

Forths syntax och semantik kan utökas till vilket annat programmeringsspråk som helst vid tidpunkten för tolkningen (kompileringen) av ett Forth-program. Att använda Forth som ett metaspråk är bekvämt på grund av tillgängligheten av Forth-verktyg som stöder de språk som redan finns i Forth-systemet. Alla resurser i Forth-systemet är tillgängliga för användaren och presenteras i form av ordboksposter. Som regel har användardefinierade ordboksposter exakt samma representation i Forth-systemet som alla andra ordboksposter som utgör hela Forth-systemet.

Forth kodtyper

Någon form av gängad kod används som en maskinrepresentation av ett kompilerat program .

Vid användning av subrutinkod erhålls maskinkod, där det, i jämförelse med koden som genereras av kompilatorn av ett konventionellt programmeringsspråk, där både variabler och returadresser från subrutiner placeras på en enda stack, det inte finns några operationer för "dra och släpp" av subrutinparametrar. Processorns huvudstack används som returstack, datastacken organiseras av mjukvara.

När du använder annan trådad kod än subrutinkod kallas Forth definitioner som endast består av maskinkod för primitiver . I en sådan gängad kod försöker de ofta använda huvudprocessorstacken som en datastack, och få tillgång till data som ligger på den i form av maskininstruktioner popoch push.

En av de inte så uppenbara fördelarna med att använda indirekt gängad kod är att all inbyggd kod, det vill säga primitiver, kodtolkningsanrop och variabler, kan placeras i ett kodsegment som inte kommer att vara tillgängligt att ändra. All annan Forth-kod finns i datasegmentet. Det kan finnas många av dessa segment, och det är lättare att arbeta med ett enda segmentnummer än med två.

Fjärde system kan också använda bytekod som en logisk slutsats till utvecklingen av indirekt gängad kod och vikt gängad kod med en adresstabell. I detta fall är programkoden (Forth) en sekvens av bytes, eller koden för någon uppfunnen virtuell processor. För att exekvera den här koden måste det finnas en tabell med 256 adresser (2-byte, 4-byte eller 8-byte) där Forth-primitiver eller komplexa definitioner finns.

Det här alternativet skiljer sig mycket från andra typer av kod och förtjänar särskild uppmärksamhet.

Programexempel

.( Hej världen)

Ett exempel på en .SIGN-ordsdefinition som skriver ut lämplig fras beroende på tecknet på siffran överst i stapeln:

\ Skriv ut tecknet för ett tal : .SIGN ( n -- ) ?DUP 0=OM ."NOLL" ANNAN 0>OM ." POSITIVT NUMMER" ANNAT ." NEGATIVT NUMMER" DÅ SEDAN ;

Ett exempel på verklig kod som skapar en strängkonstant i den form som accepteras i Forth (med en räknare):

\ Skapa en "konstant" från en sträng : S-CONSTANT ( c-addr u "<mellanslag>namn" -- ) SKAPA DUP , 0?DO DUP C@ C, CHAR+ LOOP DROP 0 C, GÖR> DUP CELL+ SWAP @ ;

Det här exemplet skapar en orddefinition namemed ordet CREATE. När ordnamnet exekveras kommer adressen för pekaren till minnesområdet som fanns vid tiden för kompileringen att placeras på stacken. För att den ska kunna användas på något sätt skrivs en sträng där ("kompilerad"). När ett ord exekveras exekveras orden som anges efter ordet DOES>.

I det här exemplet har alltså en ny syntaktisk konstruktion skapats. Liknande funktioner tillhandahålls sällan i andra programmeringsspråk.

Förutom att skapa nya syntaktiska konstruktioner är en av Forths mest kraftfulla funktioner möjligheten att störa kompileringsprocessen med omedelbara exekveringsord (omedelbara ord).

Exempel på sådana standardord:

[ - Byter tillfälligt till exekveringsläge (skriver faktiskt ofta bara 0 till STATE-variabeln).

] — Växla tillbaka till kompileringsläge.

LITERAL - Kompilera numret som för närvarande är överst i stacken som en konstant. Det är också ett ord om omedelbar avrättning.

Exempelkod där dessa ord används:

\ Viss datastorlek i kilobyte 16 KONSTANT storlek \ Skriv ut en rapport om konvertering av kilobyte till byte :Rapportera(-) storlek. ." kilobyte motsvarar " [storlek 1024*] LITERAL. ." bytes" ;

Funktioner i det fjärde språket

Ett av de återkommande teman i Forths kontrovers är dess plats bland de "klassiska" imperativspråken. Forth program har ett extremt ovanligt utseende:

  • Programmet består av en ovanlig sekvens av ord, bland vilka det inte finns några så kallade "nyckel" ord som känns igen och bearbetas i andra programmeringsspråk på ett speciellt sätt.
    Med lanseringen av Star Wars -filmserien dök ett skämt upp om detta, som nu har blivit en klassiker, som väl illustrerar detta inslag i fortet:

Mästare Yodas talhemlighet avslöjade:
Old Fort-programmerare var bara han.

Originaltext  (engelska)[ visaDölj]

Mysteriet med Yodas tal som avslöjades är:
Bara en gammal Forth-programmerare Yoda var. [femton]

  • Ovanstående exempel pekar samtidigt på den unika egenskapen hos Forth: frånvaron av en lista med parametrar inom parentes och möjligheten att programmera på sitt modersmål. Användningen av modersmålets ordförrådsstrukturer gör det möjligt att göra programmet begripligt, vilket ökar dess tillförlitlighet. .
  • " Omvänd polsk notation " av aritmetiska uttryck och med flera stackar.
  • Forth-kompilatorns dubbla natur. Det är omöjligt att entydigt säga om Forth är en kompilator eller en tolk. Det kan nästan alltid användas i två lägen, med undantag för sällsynta fall som "target compilation" (översättning till maskinkod av ett program för ett system med en annan arkitektur).
  • Inget typsystem . Precis som assemblerspråk har Forth inget inbyggt typsystem. Det finns inget sätt att veta om toppen av stapeln är ett signerat nummer, ett osignerat nummer, en pekare till en sträng, ett tecken eller två siffror som behandlas som ett långt nummer. Typkontroll är programmerarens ansvar. I det här fallet används speciella uppsättningar av ord (t.ex. skriver och läser minnesceller med ord !och @, och tecken - med ord C!och C@), vissa enheter placeras på speciella stackar (till exempel en stapel med flyttal , enligt ANSI FORTH 94-standarden; det kan vara, kan eller kanske inte implementeras med hjälp av huvudstacken).

Dessa funktioner avgör fördelarna och nackdelarna med Forth-språket:

  • En erfaren programmerare som är bekant med instruktionsuppsättningen och processorarkitekturen kan skriva "kärnan" i ett Forth-system på några dagar.
  • Den frihet som programmeraren ger kräver stark självkontroll. Ingångströskeln för programmering i Forth är lägre än den för klassiska programmeringsspråk, men det kräver att man vänjer sig vid och förstår inte bara funktionerna och funktionerna i Forth-syntaxen, utan också en förståelse för den underliggande filosofin.
  • Forth stöder inte något programmeringsparadigm och stöder dem alla samtidigt. Att skriva en uppsättning ord för att organisera OOP i ett Forth-program (och det kan vara flera av dem samtidigt och de kommer att komma bra överens) är mycket lättare än att bestämma vilka funktioner som krävs av denna uppsättning ord.
  • Genom att dela upp programmet i många små ord kan du snabbt och enkelt kontrollera dem individuellt, skicka de nödvändiga uppsättningarna av inmatningsparametrar till dem och kontrollera vad som finns kvar på stapeln. Detta betyder faktiskt att för att testa någon programkomponent behöver du inte ladda ner alla beroende komponenter som helhet.
  • De flesta implementeringar av Forth låter dig dekompilera programmet. Den resulterande texten skiljer sig lite från originalet.
  • Forth låter dig implementera all programmeringsteknik som är tillgänglig på andra språk och system. Det tillåter också tekniker som är förbjudna på andra språk (till exempel självmodifiering av kod). Att eliminera de negativa konsekvenserna av dessa tekniker genom att skapa rätt ordförråd som stimulerar en kompetent teknik för att använda dem anförtros också programmeraren.
  • Storleken på Forth-koden för 16-bitars system, när programmet är korrekt skrivet, är ibland 10-20 gånger mindre än koden som kompileras från C-programmet. För 32-bitars system är detta gap ännu större. I operativsystem kan den totala vinsten vara hundratals eller till och med tusentals gånger. Anledningen är mycket enkel - en färdig uppgift i Forth har en storlek på flera byte, alla hjälprutiner implementeras som definitioner tillgängliga för alla. Forth-systemet kommer att passa in i processorn, vilket andra system i princip inte kan passa in i.
  • Synkronisering av processer och trådar i multitasking-system, kontextväxling, implementering av tillgång till begränsade resurser är de svåraste problemen när man skriver ett OS. För att stödja dessa funktioner skapas även speciella instruktioner i mikroprocessorer. För tolken är detta inget problem alls, eftersom det emulerar vilken processor som helst och alla nödvändiga instruktioner.

Kanske det som verkligen hämmar utvecklingen av fortet är det "tunga arvet" som kom från de lågkapacitetsmaskiner som det ursprungligen skapades för. ANSI FORTH 94-standarden har till exempel följande egenskaper:

  • Ett bärbart program måste anta att en stapel med flyttal kan implementeras med hjälp av den underliggande stacken. Lyckligtvis är detta inte fallet för de flesta moderna kompilatorer. Men själva det faktum att det finns en sådan klausul i standarden skapar vissa olägenheter. Vid programmering med aktiv användning av flyttalsaritmetik ignoreras traditionellt denna norm av standarden.
  • En liknande regel finns beträffande kontrollflödesstacken. Allt är inte så enkelt här, eftersom det ofta är precis vad det är - under kompileringsprocessen används stacken av kompilatorn själv. I de allra flesta fall har detta ingen effekt på programmet utan själva funktionen måste komma ihåg. Till exempel, om du vill beräkna ett tal under kompileringen, utanför början av definitionen, och sedan infoga det i ett ord som en konstant, måste du använda någon form av lösning.
  • Definitionerna av många ord i standarden är för låga. Till exempel 2*multipliceras ordet inte med två, som namnet antyder, utan "skiftar biten nummer ett till den mest signifikanta binära siffran och fyller den minst signifikanta biten med noll." Naturligtvis, på de flesta moderna maskiner är detta samma sak, men själva faktumet att använda funktionerna i en viss arkitektur är alarmerande. (Det finns också mer uppenbara standardbitförskjutningsord LSHIFToch RSHIFT.)

Många av dessa funktioner beror på det faktum att det vid den tidpunkt då standarden antogs fanns många dåligt kompatibla Forth-system som var baserade på två delvis olika standarder från 1979 och 1983.

Se även

Dialekter Ansökningar

Anteckningar

  1. SP-Forth ProjectSourceForge.net
  2. Win32Forth Project Group . Hämtad 18 augusti 2006. Arkiverad från originalet 13 augusti 2006.
  3. CH Moore, ED Rather, DR Colburn. Evolutionen av Forth . ACM SIGPLAN Notices, Volume 28, No. 3. mars 1993 / History of Programming Languages ​​Conference (april 1993). Hämtad 19 februari 2010. Arkiverad från originalet 22 augusti 2011.
  4. Inbyggda systemutvecklings- och programmeringsverktyg av FORTH, Inc. Hämtad 19 februari 2010. Arkiverad från originalet 4 januari 2010.
  5. 22:a EuroForth-konferensen . Datum för åtkomst: 19 februari 2010. Arkiverad från originalet den 5 december 2008.
  6. DPANS'94 . Tillträdesdatum: 22 juli 2007. Arkiverad från originalet den 30 juni 2007.
  7. Framåt . forth-standard.org . Hämtad 2 maj 2022. Arkiverad från originalet 11 maj 2022.
  8. Adobe PostScript 3 - Resurser . Hämtad 2 december 2006. Arkiverad från originalet 3 januari 2007.
  9. Federico Biancuzzi, Shane Worden. Programmeringspionjärer. Samtal med skaparna av stora programmeringsspråk = Masterminds of Programming: Conversations with the Creators of Major Programming Languages. - Symbol-Plus, 2011. - S. 502. - 608 sid. — ISBN 9785932861707 .
  10. MPE - MicroProcessor Engineering Limited . Hämtad 19 februari 2010. Arkiverad från originalet 5 januari 2010.
  11. Maynard, David S. David Maynard: Programvarukonstnär . Hämtad 27 juni 2021. Arkiverad från originalet 15 juni 2021.
  12. Maher, Jimmy Starflight . Den digitala antikvarien (28 oktober 2014). Hämtad 23 maj 2017. Arkiverad från originalet 25 april 2017.
  13. EuroForth: Europeisk Forth Conference . Datum för åtkomst: 24 januari 2010. Arkiverad från originalet den 16 juni 2010.
  14. ForthWiki - ForthOS . Hämtad 1 februari 2006. Arkiverad från originalet 30 augusti 2005.
  15. Aquatix User Origin . Hämtad 12 augusti 2012. Arkiverad från originalet 9 februari 2014.

Litteratur

  • Baranov S. N., Kolodin M. Yu. Fortfenomen // Systeminformatik. - Novosibirsk: VO "Nauka". Sibiriskt förlag, 1995. - Utgåva. 4 . - S. 193-291 . — ISBN 5-02-030678-9 .
  • Baranov S. N., Nozdrunov N. R. Det fjärde språket och dess implementeringar. - L . : Mashinostroenie, 1988. - 157 sid. - (dator i produktion). — 100 000 exemplar.  — ISBN 5-217-00324-3 .
  • Leo Brody. Tänker vidare . — ISBN 0-9764587-0-5 . Arkiverad 16 december 2005 på Wayback Machine
  • Brody L. Starting Forth Programmeringskurs = Starting Forth. En introduktion till Forth-språket och operativsystemet för nybörjare och proffs / Per. från engelska; förord I. V. Romanovsky. - M. : Finans och statistik, 1990. - 352 sid. - 40 000 exemplar.  - ISBN 5-279-00252-6 .
  • Brody L. Sätt att tänka - Fort .
  • Burago A. Yu., Kirillin V. A., Romanovsky I. V. Fort är ett språk för mikroprocessorer. - Society "Kunskap", Leningrad organisation, 1989. - 36 s. - (För att hjälpa föreläsaren). - 26 000 exemplar.
  • Dyakonov V.P. Forth-system för persondatorprogrammering. - M. : Nauka, 1992. - 352 sid. — ISBN 5-02-014460-6 .
  • Kelly M., Spies N. Programmeringsspråk Fort / Per. från engelska. - M . : Radio och kommunikation, 1993. - 320 sid. — ISBN 5-256-00438-7 .
  • Semyonov Yu. A. Programmering på det fjärde språket. - M . : Radio och kommunikation. — 240 s. — 50 000 exemplar.  — ISBN 5-256-00547-2 .
  • Townsend K., Foght D. Design och mjukvaruimplementering av expertsystem på persondatorer / Per. från engelska. V. A. Kondratenko, S. V. Trubitsyna. - M. : Finans och statistik, 1990. - 320 sid. - ISBN 5-279-00255-0 (USSR) ISBN 0-8306-2692-1 (USA).
Tidskriftspublikationer

Länkar

Standard ryskspråkiga resurser Samlingar av länkar till vidare resurser