close

Frem

Gå til navigation Gå til søg

Forth eller FORTH er et programmeringssprog og programmeringsmiljø for computere , udviklet af Charles H. Moore mellem 1965 og 1970 ved National Radio Astronomy Observatory i Kitt Peak , Arizona .

Dets navn er en sammentrækning af det engelske ord fjerde, da dets skabere anså det for bestemt til fjerde generation af computere, men den første udgave af sproget var forberedt til en IBM 1130 , som kun tillod navne med en maksimal længde på fem bogstaver; hans navn blev for evigt i FORTH. Forth staves nogle gange med alle store bogstaver efter sædvanlig brug i de første år, selvom navnet ikke er et akronym.

Oprindeligt designet til en meget specifik anvendelse, astronomi (beregning af baner for kroppe i kredsløb, kromatografi, analyse af emissionsspektre), har udviklet sig til at være anvendelig på næsten alle andre områder, der er relateret eller ej til den videnskabsgren (beregninger af sandsynlighed, databaser , statistisk og endda finansiel analyse).

Efterfølgende har et program til automatisk og kontinuerlig indsamling af data udført på dette sprog opdaget mindst halvdelen af ​​de interstellare hobe, der kendes i dag.

Forth er et struktureret, imperativt, reflekterende, stakbaseret , ikke-typekontrollerende, proceduremæssigt computerprogrammeringssprog. Forth tilbyder både interaktiv kommandoudførelse (gør det praktisk som en shell for systemer, der mangler et mere formelt operativsystem) og muligheden for at kompilere scripts til senere udførelse. Nogle Forth-implementeringer (normalt tidlige versioner eller dem, der er skrevet til at være ekstremt bærbare) kompilerer trådet kode, men mange implementeringer genererer i dag optimeret maskinkode som andre sprogkompilere.

En af dens vigtige funktioner er brugen af ​​en datastak til at sende argumenter mellem ord , som er bestanddelene i et Forth-program.

Selvom det ikke er så populært som andre programmeringssystemer, har Forth nok support til at holde forskellige sprogleverandører og entreprenører i gang. Forth bruges i øjeblikket i opstartsindlæsere såsom Open Firmware , rumapplikationer, [ 1 ] og andre indlejrede systemer. En implementering af Forth af GNU Project vedligeholdes aktivt og blev sidst udgivet i november 2008. 1994-standarden er i øjeblikket under revision, foreløbigt kaldet Forth 200x. [ 2 ]

Oversigt

Et Forth-miljø kombinerer compileren med en interaktiv shell. Brugeren definerer og kører interaktivt underrutiner , eller "ord", i et virtuel maskinlignende runtime - miljø . Ord kan testes, omdefineres og fejlsøges, når kildekoden indtastes uden at genkompilere eller genstarte hele programmet. Alle syntaktiske elementer, inklusive variabler og grundlæggende operatorer, vises som sådanne procedurer (i form af ord). Selvom et bestemt ord er optimeret til ikke at kræve et subrutineopkald, er det stadig også tilgængeligt som en subrutine. På den anden side kan skallen kompilere interaktivt indtastede kommandoer i maskinkode, før de køres. (Denne adfærd er almindelig, men ikke påkrævet.) Forth miljøer varierer i, hvordan det resulterende program er gemt, men ideelt set har kørsel af programmet samme effekt som manuelt at indtaste kildekoden igen. Dette er i modsætning til kombinationen af ​​C med UNIX-skaller , hvor kompilerede funktioner er en speciel klasse af programobjekter, og interaktive kommandoer er strengt fortolket [ citat nødvendig ] . De fleste af Forths unikke egenskaber stammer fra dette princip. Ved at inkludere interaktion, scripting og kompilering var Forth populær på ressourcebegrænsede computere, såsom BBC Micro og Apple II -serien , og forbliver det i applikationer såsom firmware og små mikrocontrollere . Hvor C-kompilere nu kan generere mere kompakt og bedre ydende kode, bevarer Forth fordelen ved interaktivitet. [ henvisning nødvendig ]

Batterierne

Hvert subrutineprogrammeringsmiljø implementerer en stak til kontrolflow . Denne struktur gemmer typisk også de lokale variabler , inklusive parametrene for subrutinen (i et call-by-value system såsom C ). Forth har dog ofte ikke lokale variabler, og den kaldes heller ikke efter værdi. I stedet holdes mellemværdier på en anden stak. Ordene fungerer direkte på de øverste værdier af denne stak. Derfor kan det kaldes "parameter"-stakken eller "data"-stakken, men det er mere almindeligt kendt som "stakken". Funktionskaldsstakken kaldes så "linkage " -stakken , rstack for kort . Særlige kerne-forsynede rstack-manipulationsfunktioner gør det muligt at bruge det til midlertidig lagring i et ord, men det kan ikke bruges på anden måde til at videregive parametre eller til at manipulere data.

De fleste ord er specificeret i forhold til deres effekt på stakken. Parametre skubbes typisk til toppen af ​​stakken, før ordet udføres. Efter udførelse slettes parametrene og erstattes af returværdier. For aritmetiske operatorer følger dette reglen for omvendt polsk notation . Se nedenfor for eksempler, der illustrerer stakbrug.

Vedligeholdelse

Frem er et simpelt og udvideligt sprog; dens modularitet og udvidelsesmuligheder tillader skrivning af programmer på højt niveau, såsom CAD -systemer . Udvidelsesmuligheder hjælper dog også dårlige programmører med at skrive uforståelig kode, hvilket har givet Forth et ry som et " skrivesprog ". Forth er blevet brugt med succes på store og komplekse projekter, mens applikationer udviklet af kompetente og disciplinerede fagfolk har vist sig lette at vedligeholde på skiftende hardwareplatforme gennem årtiers brug. [ 3 ] Forth har en niche inden for både astronomiske og rumfartsapplikationer. [ 4 ] Stadig i dag bruges Forth i mange indlejrede systemer (små computeriserede enheder) på grund af dets portabilitet , effektive hukommelsesbrug, korte udviklingstid og hurtige eksekveringshastighed. Det er blevet effektivt implementeret på moderne RISC -processorer, og processorer, der bruger Forth som maskinsprog, er blevet produceret . [ 5 ] Andre anvendelser af Forth omfatter Open Firmware , boot ROMs brugt af Apple , IBM , Sun og OLPC XO-1 ; og det første trins FICL - baserede opstartsdriver til FreeBSD -operativsystemet .

Historie

Forth udviklede sig fra Charles H. Moores personlige programmeringssystem , som havde været i kontinuerlig udvikling siden 1958. [ 6 ] Forth blev første gang eksponeret for andre programmører i begyndelsen af ​​1970'erne, begyndende med Elizabeth Rather i National Radio Astronomy Observatory i USA stater. [ 6 ] Efter deres arbejde ved NRAO dannede Charles Moore og Elizabeth Forth, Inc. i 1973, raffinerede og porterede Forth-systemer til snesevis af andre platforme i løbet af det næste årti.

Forth blev navngivet sådan, fordi "filen, der indeholdt tolken, blev mærket FJERDE, af 4. (næste) generation af software - men IBM 1130 -operativsystemet begrænsede filnavne til 5 tegn". [ 7 ] Moore så Forth som compile-chain-execute-efterfølgeren til tredje generations sprog eller software til "fjerde generations" hardware, ikke i betydningen af ​​et fjerde generations programmeringssprog, som det er blevet til. .

Fordi Charles Moore ofte havde flyttet fra job til job i sin karriere, var et tidligt pres på udviklingssproget let at overføre til forskellige computerarkitekturer. Et Forth-system er ofte blevet brugt til at "løfte" ny hardware. Forth var for eksempel den første residente software på den nye Intel 8086 -chip i 1978, og MacFORTH var det første residente udviklingssystem til den første Apple Macintosh i 1984. [ 6 ]

Fra 1976, microFORTH of Forth inc. det blev udviklet til Intel 8080 , Motorola 6800 og Zilog Z80 mikroprocessorer . MicroFORTH blev senere brugt af hobbyfolk til at generere Forth-systemer til andre arkitekturer, såsom MOS 6502 fra 1978. Bred formidling førte til sidst til standardisering af sproget. Almindelig praksis blev kodificeret i de facto-standarderne for FORTH-79 [ 8 ] og FORTH-83 [ 9 ] fra henholdsvis 1979 og 1983. Disse standarder blev forenet af ANSI i 1994, almindeligvis omtalt som ANS Forth . [ 10 ]

Forth blev meget populær i 1980'erne [ 11 ] , fordi den var velegnet til datidens små mikrocomputere , idet den var kompakt og bærbar. Mindst én personlig computer , den britiske Jupiter Ace , havde Forth i sit ROM -resident operativsystem . Canon Cat brugte også Forth til sin systemprogrammering. Rockwell producerede også single-chip mikrocomputere, R65F11 og R65F12, med residente Forth-kerner.

Programmørens perspektiv

Forth er stærkt afhængig af den eksplicitte brug af en datastak og omvendt polsk notation (RPN eller postfix-notation , almindeligvis brugt i Hewlett-Packard- beregnere . I RPN placeres operatøren efter dens operander, i modsætning til den mere almindelige infiksnotation , hvor den er placeret . mellem operander Postfix-notation gør sproget lettere at parse og udvide. Forth bruger ikke en BNF- grammatik og har ikke en monolitisk compiler Udvidelse af compileren kræver blot at skrive et nyt ord, i stedet for at ændre en grammatik og ændre den underliggende implementering.

Ved at bruge RPN kan du få resultatet af det matematiske udtryk (25 * 10 + 50)som dette:

25 10 * 50 + .
300 ok
Stack1.svg

Denne kommandolinje placerer først tallene 25y 10på den underforståede stak.

Forthstack1 5.png

Ordet *multiplicerer de to tal på toppen af ​​stakken og erstatter deres produkt.

Forthstack2.PNG

50Herefter lægges nummeret på stakken.

Forthstack3.PNG

Ordet +føjer det til det forrige produkt. Til sidst udskriver kommandoen .resultatet til brugerterminalen. [ 12 ]

Selv de strukturelle funktioner i Forth er stakbaserede. For eksempel:

: ETAGE 5 ( n -- n ' ) DUP 6 < HVIS DROP 5 ANDEN 1 - SÅ ;

Denne kode definerer et nyt ord kaldet FLOOR5ved hjælp af følgende kommandoer (igen, "ord" er det udtryk, der bruges til en underrutine):

  • DUPdobbelt tallet på stakken;
  • <sammenligner 6 med det øverste tal på stakken og erstatter dem med en sand-eller-falsk værdi;
  • IFtager en sand-eller-falsk værdi og vælger at udføre kommandoer umiddelbart efter den eller hoppe til ELSE;
  • DROPskyl værdien på stakken;
  • og THENafslutter den betingede.

Teksten i parentes er en kommentar, der advarer om, at dette ord forventer et tal på stakken og vil returnere et muligvis ændret tal. Ordet FLOOR5svarer til denne funktion skrevet i programmeringssproget C :

int floor5(int v) { return v < 6 ? 5: v-1; }

Denne funktion er skrevet mere kortfattet som:

: GULV5 (n - n') 1-5 MAKS;

Du kan køre dette ord som følger:

1 ETAGE5.
5 ok
8 ETAGE5.
7 okay

Tolken skubber først et tal (1 eller 8) ind på stakken, kalder derefter FLOOR5, som viser dette nummer igen og skubber resultatet. Til sidst et opkald til "." fjerner resultatet fra stakken og udskriver det til brugerens terminal.

Faciliteter

Forth - parseren er enkel, da den ikke har nogen eksplicit grammatik . Fortolkeren læser en linje med input fra en brugerinputenhed, som derefter parses for et ord ved at bruge mellemrum som afgrænsninger ; nogle systemer genkender yderligere mellemrumstegn . Når tolken finder et ord, forsøger den at finde ordet i ordbogen . Hvis ordet findes, udfører fortolkeren den kode, der er knyttet til ordet, og vender derefter tilbage for at analysere resten af ​​inputstrømmen. Hvis ordet ikke findes, antages ordet at være et tal, og man forsøger at konvertere teksten, der repræsenterer det, til et tal og skubbe det ind på stakken; ved succes fortsætter tolken med at analysere inputstrømmen. Ellers, hvis ordopslags- og talkonverteringsoperationerne mislykkes, udskriver tolken ordet efterfulgt af en fejlmeddelelse, der angiver, at ordet ikke genkendes, inputstrømmen tømmes og venter på nyt brugerinput. [ 13 ]

Definitionen af ​​et nyt ord begynder med ordet :(kolon) og slutter med ordet ;(semikolon). For eksempel:

: X DUP 1+ . . ;

Dette vil kompilere ordet Xog gøre navnet tilgængeligt i ordbogen. Når det udføres ved at skrive, for eksempel 10 Xi konsollen, vil dette udskrive 11 10. [ 14 ]

De fleste Forth-systemer inkluderer en specialiseret assembler , der producerer eksekverbare ord. Assembleren er en speciel dialekt af compileren . Forth assemblers bruger ofte en omvendt polsk syntaks, hvor parametrene for en instruktion går forud for instruktionen. Det sædvanlige Forth assembler-design er at bygge instruktionen på stakken og derefter kopiere den ind i hukommelsen som sidste trin. Registre kan henvises til ved det navn, der bruges af producenten, nummereret (0..n, som brugt i den faktiske opcode), eller navngivet til deres formål i Forth-systemet: f.eks. "S" for register brugt som stak-pointer. [ 15 ]

Operativsystem, filer og multitasking

Classic Forth-systemer bruger traditionelt hverken operativsystemet eller filsystemet . I stedet for at gemme koden i filer, gemmes kildekoden i blokke skrevet til fysiske adresser på disken. Ordet BLOCKbruges til at oversætte nummeret på en diskblok på 1 KB til adressen på en buffer , der indeholder dataene, som håndteres automatisk af Forth-systemet. Nogle systemer implementerer sammenhængende diskfiler ved hjælp af systemdiskadgang, hvor filer er placeret i rækker af faste diskblokke. Disse er normalt implementeret som binære registre med fast længde med et helt antal registre pr. diskblok. Et hurtigt opslag opnås ved hash -adgang på nøgledataene.

Multitasking, (oftest kooperativ round-robin planlægning ), er normalt tilgængelig (selvom ordene multitasking og support ikke er dækket af ANSI Forth-standarden). Nøgleordet PAUSEbruges til at gemme udførelseskonteksten for den aktuelle opgave, til at finde den næste opgave og gendanne dens udførelseskontekst. Hver opgave har sine egne stakke, private kopier af nogle kontrolvariabler og et skrabeområde. Som følge heraf er opgaveskift enkel og effektiv. Videre er multitasking tilgængelig selv på meget simple mikrocontrollere som Intel 8051 , Atmel AVR og TI MSP430 . [ 16 ]

I modsætning hertil kører nogle Forth-systemer under et værtsoperativsystem såsom Microsoft Windows , Linux eller en version af UNIX og bruger værtsoperativsystemets filsystem til kilde- og datafiler; ANSI Forth standarden beskriver de ord, der bruges til input-output. Andre ikke-standardfaciliteter omfatter en mekanisme til at foretage opkald til operativsystemet eller værtsvinduesystemet , og mange leverer udvidelser, der bruger de bestemmelser, som operativsystemet giver. De har typisk et større og anderledes sæt af ord end det PAUSEForth standardord til opgaveoprettelse, suspension, ødelæggelse og prioritetsændring.

Autokompilering og krydskompilering

Et fuldt udstyret Forth-system, med al kildekode, vil kompilere sig selv med en teknik, der almindeligvis kaldes metakompilering af Forth-programmører (selvom udtrykket ikke nøjagtigt svarer til metakompilering som normalt defineret). Normalt er metoden at omdefinere en håndfuld ord, der sætter kompilerede bits i hukommelsen. Kompilerordene bruger specielt navngivne versioner af hente og lagre, der omdirigeres til et bufferområde i hukommelsen. Bufferområdet simulerer eller får adgang til et hukommelsesområde, der starter ved en anden adresse end kodebufferen. Sådanne kompilatorer definerer ord for at få adgang til både målcomputerens hukommelse og værtscomputerens hukommelse (kompilering). [ 17 ]

Efter at hente- og lageroperationerne er omdefineret for koderummet, compileren, assembleren osv. indsamles ved hjælp af den nye definition af hentning og butik. Dette genbruger effektivt al compiler- og fortolkerkode. Så Forth systemkoden er kompileret, men denne version er bufferet. Bufferen i hukommelsen skrives til disken, og der er mulighed for midlertidigt at indlæse den i hukommelsen til test. Når den nye version ser ud til at virke, overskriver den den tidligere version.

Der er adskillige variationer af sådanne compilere til forskellige miljøer. For indlejrede systemer kan koden skrives på en anden computer, en teknik kendt som krydskompilering , over en seriel port eller endda med en enkelt TTL - bit , mens ordnavne og andre ikke-eksekverbare dele af ordbogen bevares i databasen. original bygget computer. De minimale definitioner for denne Forth-kompiler er ordene hente og gemme for en byte , og det ord, der kommanderer et Forth-ord, der skal udføres. Ofte er den mest tidskrævende del af at skrive en fjernport at bygge det indledende program til at implementere hente, gemme og udføre, men mange moderne mikroprocessorer har indbyggede debugger-funktioner (såsom Motorola CPU32 ), der eliminerer denne opgave. [ 18 ]

Sprogstruktur

Den grundlæggende datastruktur i Forth er "ordbogen", der kortlægger "ord" til eksekverbar kode eller navngivne datastrukturer. Ordbogen hviler i hukommelsen som et kædet listetræ med links, der går fra det sidst definerede ord (nyeste) til det ældste, indtil en vagtpost er fundet, normalt en NULL-pegepind. Et kontekstskift får listeopslaget til at starte på et andet blad, og det kædede listeopslag fortsætter på en sådan måde, at grenen smelter sammen i hovedstammen igen og til sidst går til sentinel (NULL), roden (i sjældne tilfælde som i meta- kompilering ordbogen kan isoleres, der er flere). Effekten er en sofistikeret brug af navnerum (namespaces) og kan kritisk have den effekt at overbelaste nøgleord, betydningen er kontekstuel.

Et defineret ord består generelt af et hoved og en krop, hvor overskriften består af navnefeltet (NF) og linkfeltet (LF) og en krop bestående af kodefeltet (CF) og parameterfeltet . (PF).

Overskriften og brødteksten i en ordbogspost behandles separat, fordi de muligvis ikke er sammenhængende. For eksempel, når et Forth-program genkompileres til en ny platform, kan headeren forblive på kompileringscomputeren, mens kroppen går til den nye platform. I nogle miljøer (såsom indlejrede systemer) fylder headere unødigt hukommelse. Nogle krydskompilatorer kan dog placere hovederne på målcomputeren, hvis den pågældende computer forventes at understøtte et interaktivt Forth-system. [ 19 ]

Ordbogsindlæg

Det nøjagtige format for en ordbogspost er ikke foreskrevet, og implementeringerne varierer. Visse komponenter er dog næsten altid til stede, selvom den nøjagtige størrelse og rækkefølge kan variere. Beskrevet som en struktur kan en ordbogspost se sådan ud: [ 20 ]

struktur
  byte: flag \ 3bit flag + længden af ​​ordets navn
  char-array: navn \ navns køretidslængde er ikke kendt på kompileringstidspunktet
  adresse: forrige \ linkfelt, baglæns ptr til forrige ord
  adresse: kodeord \ ptr til koden for at udføre dette ord
  any-array: parameterfield \ ukendt længde af data, ord eller opkoder
endestruktur forord

Navnefeltet begynder med et præfiks, der angiver længden af ​​ordets navn (typisk op til 32 bytes), og forskellige bits til flag . Så tegnrepræsentationen af ​​ordnavnet følger præfikset. Afhængigt af den særlige implementering af Forth kan der være en eller flere NUL ("\0") bytes til justering.

Linkfeltet indeholder en pointer til det tidligere definerede ord. Pointeren kan være en relativ forskydning eller en absolut adresse, der peger på den forrige søskende.

Kodefeltmarkøren vil være: enten adressen på det ord, der skal udføre koden, eller data i parameterfeltet eller begyndelsen af ​​maskinkoden, som processoren vil udføre direkte. For ord defineret af ordet "kolon" :peger kodefeltmarkøren på det ord, der vil gemme den Forth aktuelle instruktionsmarkør (IP) på returstakken og indlæser IP'en med den nye adresse fra den, som fortsætter udførelsen af ​​ord . Dette er det samme, som processorens opkalds-/returinstruktioner gør.

Kompilerstruktur

Selve compileren består af Forth-ord, der er synlige for systemet, det er ikke et monolitisk program. Dette giver en programmør mulighed for at ændre kompileringsord til specielle formål.

Flaget "compile-time" i navnefeltet er indstillet til ord med "compile-time"-adfærd. De fleste simple ord udfører den samme kode, uanset om de er skrevet på en kommandolinje eller indsat i anden kode. Når du kompilerer disse, lægger compileren blot koden eller en trådet pointer ind i ordet. [ 14 ]

Klassiske eksempler på kompileringstidsord er kontrolstrukturer , såsom IFog WHILE. Alle Forths kontrolstrukturer og næsten hele dens compiler er implementeret som kompileringstidsord. Alle Forth kontrolfloword udføres under kompilering for at kompilere forskellige kombinationer af de primitive ord BRANCHy ?BRANCH(gren og gren, hvis falsk). Under kompilering bruges datastakken til at understøtte balancering, indlejring og backpatching af grenadresser for kontrolstrukturer. Den lille prøvekode:

... DUP 6 < HVIS DROP 5 ANDEN 1 - SÅ ...

vil blive kompileret som følgende sekvens inden for en definition:

... DUP LIT 6 < ?GREEN 5 DROP LIT 5 GREEN 3 LIT 1 - ...

Tallene efter BRANCHrepræsenterer relative springretninger. LIT er det primitive ord for at skubbe et "bogstaveligt" tal ind i datastakken.

Byg status og gengivelsesstatus

Ordet :(kolon) analyserer (parser) et navn som en parameter, opretter et ord (en "kolon" definition) og går ind i kompileringstilstanden. Tolken fortsætter med at læse mellemrumsafgrænsede ord fra brugerens inputenhed. Hvis et ord findes, udfører fortolkeren den kompileringssemantik , der er knyttet til ordet, i stedet for fortolkningssemantikken . Som standard er kompileringssemantikken for et ord at tilføje dets fortolkningssemantik til den aktuelle definition. [ 14 ]

Ordet ;(semikolon) afslutter den aktuelle definition og vender tilbage til fortolkningstilstanden . Hun er et eksempel på et ord, hvis kompileringssemantik adskiller sig fra standarden. Fortolkningssemantikken for ;(semikolon), den for de fleste kontrolflow- ord , og den for nogle andre ord er udefinerede i ANS Forth, hvilket betyder, at de kun skal bruges i definitioner og ikke i den interaktive kommandolinje. [ 14 ]

Fortolkertilstanden kan ændres manuelt med ordene [og ](venstre parentes og højre parentes) indtastes henholdsvis fortolkningstilstand eller kompileringstilstand. Disse ord kan bruges sammen med ordet LITERALtil at beregne en værdi under en kompilering og indsætte den i den aktuelle kolondefinition. Den LITERALhar kompileringsemantikken til at tage et objekt fra datastakken og tilføje semantikken til den aktuelle kolondefinition for at placere det objekt på datastakken.

I ANS Forth kan tolkens aktuelle tilstand læses fra flaget STATE , der indeholder værdien sand, når den er i kompileringstilstand og ellers falsk. Dette muliggør implementering af smarte tilstandsord med adfærd, der ændrer sig afhængigt af tolkens aktuelle tilstand.

Umiddelbare ord

Ordet IMMEDIATEmarkerer den seneste kolondefinition som et øjeblikkeligt ord , der effektivt erstatter dets kompileringssemantik med dets fortolkningssemantik. [ 21 ] Umiddelbare ord udføres normalt under kompilering, de kompileres ikke, men dette kan tilsidesættes af programmøren i enhver tilstand. ;er et eksempel på et umiddelbart ord. I Forth ANS tager ordet POSTPONEet navn som en parameter og tilføjer compiler-semantikken for det navngivne ord til den aktuelle definition, selvom ordet var øjeblikkelig markering. Forth-83 definerede de separate ord COMPILEog [COMPILE]for at tvinge kompilering af henholdsvis ikke-umiddelbare og umiddelbare ord.

Unavngivne ord og udførelsestokens

I ANS Forth kan unavngivne ord defineres med det :NONAME(unavngivne) ord, der kompilerer de følgende ord op til det næste ;(semikolon) og efterlader et eksekveringstoken på datastakken. Udførelsestokenet giver et uigennemsigtigt håndtag til kompileringssemantik, svarende til funktionsmarkører i C - programmeringssproget .

Eksekveringstokens kan gemmes i variabler. Ordet EXECUTEtager et eksekveringstoken fra datastakken og udfører den tilhørende semantik. Ordet COMPILE,(compile-comma) tager et eksekveringstoken fra datastakken og tilføjer den tilhørende semantik til den aktuelle definition.

Ordet '(enkelt anførselstegn) tager navnet på et ord som en parameter og returnerer på datastakken det eksekveringstoken, der er knyttet til det ord. I gengivelsestilstanden ' RANDOM-WORD EXECUTEsvarer det til RANDOM-WORD. [ 22 ]

Parsing af ord og kommentarer

Ordene :(kolon) og '(enkelt citat) er eksempler på ord, der tager deres argumenter fra brugerens inputenhed i stedet for datastakken. Et andet eksempel er ordet ((åben parentes), som læser og ignorerer følgende ord til og med den tætte parentes og bruges til at kommentere. På samme måde bruges ordet \(omvendt skråstreg) til kommentarer, der fortsætter til slutningen af ​​den aktuelle linje. ((åbne parenteser) og \(omvendt skråstreg) er ord som resten, og skal derfor adskilles fra det, der følger efter dem (i dette tilfælde kommentaren) med mindst ét ​​mellemrum.

Kodestruktur

I de fleste Forth-systemer består hoveddelen af ​​en kodedefinition af maskinsprog eller en form for gevindkode . Den originale Forth, som følger den uformelle standard for Forth Interest Group (FIG), er et Threaded Interpretive Language (TIL). Dette kaldes også indirekte trådet kode, men direkte trådet kode og Forth subrutinen er også blevet populært i moderne tid. De hurtigste moderne Forths bruger subrutine-trådning, indsætter simple ord som makroer og udfører kighulsoptimering eller andre optimeringsstrategier for at gøre koden mindre og hurtigere. [ 23 ]

Dataobjekter

Når et ord er en variabel eller et andet dataobjekt, peger CF på den runtime-kode, der er knyttet til definitionen af ​​det ord, der skabte det. Et definitionsord har en karakteristisk "definitionsadfærd" (oprettelse af en ordbogspost og muligvis allokering og initialisering af et mellemrum til dataene) og specificerer også adfærden for en forekomst af den klasse af ord, der er konstrueret af dette definitionsord. Eksempler omfatter:

VARIABLE
Navngiver en ikke-initialiseret hukommelsesplacering, en hukommelsesplacering for en celle. Opførselen af ​​en forekomst af en VARIABLEreturnerer dens placeringsadresse på stakken.
CONSTANT
Navngiver en værdi (angivet som et argument til ordet CONSTANT). Forekomstens adfærd returnerer denne værdi.
CREATE
Navngiv et sted; plads kan tildeles på denne placering, eller den kan indstilles til at indeholde en streng eller anden initialiseret værdi. Forekomstens opførsel returnerer adressen på begyndelsen af ​​denne hukommelsesplads.

Forth giver også en facilitet, hvorved en programmør kan definere nye definitionsord, der er specifikke for en applikation, og specificerer både en definitionsadfærd (på kompileringstidspunktet) og en instansadfærd (ved kørselstidspunktet). Nogle eksempler omfatter cirkulære buffere, navngivne bits på I/O- porte og automatisk indekserede arrays.

Dataobjekterne defineret af disse ord og lignende er globale i omfang. Funktionen for lokale variabler på andre sprog, i Forth er den leveret af datastakken (selvom Forth også har faktiske lokale variabler). Sammenlignet med andre sprog bruger Forth-stilen til programmering meget få navngivne dataobjekter; sådanne dataobjekter bruges typisk til at indeholde data, der bruges af et antal ord eller opgaver (i en multitasking-implementering). [ 24 ]

Forth håndhæver ikke sammenhæng i brugen af ​​datatyper; det er programmørens ansvar at bruge de relevante operatører til at læse (hente) og gemme (lagre) værdierne eller til at udføre andre operationer på dataene.

Programmering

Ord skrevet i Forth er kompileret til en eksekverbar form. Klassiske "indirekte trådede" implementeringer kompilerer lister over adresserne på ord, der skal udføres; mange moderne systemer genererer ægte maskinkode (inklusive opkald til bestemte ord og eksterne koder til andre udvidede på samme sted). Nogle systemer har optimeringskompilere. Generelt bliver et Forth-program gemt som hukommelsesbilledet af det kompilerede program med en enkelt kommando (f.eks. RUN), der udføres, når den kompilerede version indlæses.

Under udviklingen bruger programmøren tolken til at køre og teste hver lille brik, efterhånden som den udvikles. Derfor går de fleste Forth-programmører ind for løst top-down design og bottom-up udvikling med kontinuerlig test og integration. [ 25 ]

Top-down design er generelt en adskillelse af programmet i "vokabularer", som derefter bruges som værktøjssæt på højt niveau til at skrive det endelige program. Et veldesignet Forth-program læser som naturligt sprog og implementerer ikke bare en enkelt simpel løsning, men også et sæt værktøjer til at angribe relaterede problemer. [ 26 ]

Implementeringer

Da Forth virtuelle maskine er enkel at implementere og ikke har nogen standard implementeringsreference, er der et væld af implementeringer af sproget. Ud over at understøtte standardvarianterne af desktopcomputersystemer ( POSIX , Microsoft Windows , Mac OS X ), er mange af disse Forth-systemer også målrettet mod en række indlejrede systemer . Her er nogle af de mere fremtrædende systemer, der er i overensstemmelse med ANS Forth 1994-standarden.

Også bemærkelsesværdig er en implementering i Minecraft mod , RedPower 2 som et kontrolsystem.

Se også

Referencer

  1. NASA-ansøgninger af Forth
  2. Frem 200x standardindsats
  3. ^ "Fremde succeshistorier" . Hentet 9. juni 2006 . 
  4. ^ "Rumrelaterede anvendelser af Forth" . Arkiveret fra originalen 2007-09-05 . Hentet 4. september 2007 . 
  5. ^ "Forth Chips Side" . s. 54 . Hentet 9. juni 2006 . 
  6. abc C.H. Moore ; ED snarere; D. R. Colburn (april 1993). "Udviklingen af ​​Forth" . ACM SIGPLAN-meddelelser, bind 28, nr. 3. marts, 1993 . ACM SIGPLAN History of Programming Languages ​​Conference. 
  7. ^ Moore, Charles H. (1991). "Forth - De tidlige år" (HTML) . Arkiveret fra originalen den 15. juni 2006 . Hentet 3. juni 2006 . 
  8. ^ "The Forth-79 Standard" (PDF) . Arkiveret fra originalen den 13. juli 2011. 
  9. ^ "The Forth-83 Standard" . 
  10. ^ "Programmeringssprog: Forth" (HTML) . ANSI teknisk udvalg X3J14. 24. marts 1994 . Hentet 3. juni 2006 . 
  11. Tom reference ( hjælp )  .
  12. ^ Brodie, Leo (1987). Starting Forth (paperback ) (anden udgave). Prentice Hall. s. 20. ISBN  0-13-843079-9 . 
  13. ^ Brodie, Leo (1987). Starting Forth (paperback ) (anden udgave). Prentice Hall. s. 14. ISBN  0-13-843079-9 . 
  14. ^ abcd Brodie , Leo ( 1987). Starting Forth (paperback ) (anden udgave). Prentice Hall. s. 16. ISBN  0-13-843079-9 . 
  15. Rodriguez, Brad. "BYOASSEMBLER" (HTML) . Arkiveret fra originalen den 23. juni 2006 . Hentet 19. juni 2006 . 
  16. Rodriguez, Brad. "MULTITASKING 8051 CAMELFORTH" (PDF) . Arkiveret fra originalen den 22. juni 2006 . Hentet 19. juni 2006 . 
  17. Rodriguez, Brad (juli 1995). "FLYTTER FREM" (HTML) . Arkiveret fra originalen den 23. juni 2006 . Hentet 19. juni 2006 . 
  18. ^ Shoebridge, Peter ( 1998-12-21 ). "Motorola Background Debugging Mode Driver til Windows NT" (HTML) . Arkiveret fra originalen den 6. juni 2007 . Hentet 19. juni 2006 . 
  19. ^ Martin, Harold M. (marts 1991). "Udvikling af en bundet Forth-model" . ACM Tryk på . Hentet 19. juni 2006 . 
  20. ^ Brodie, Leo (1987). Starting Forth (paperback ) (anden udgave). Prentice Hall. pp. 200-202. ISBN  0-13-843079-9 . 
  21. ^ Brodie, Leo (1987). Starting Forth (paperback ) (anden udgave). Prentice Hall. s. 273. ISBN  0-13-843079-9 . 
  22. ^ Brodie, Leo (1987). Starting Forth (paperback ) (anden udgave). Prentice Hall. s. 199. ISBN  0-13-843079-9 . 
  23. Ertl, M. Anton; Gregg, David. "Implementeringsproblemer for superinstruktioner i Gforth" (PDF) . Arkiveret fra originalen den 25. juni 2006 . Hentet 19. juni 2006 . 
  24. ^ Brodie, Leo (1987). "Under kølerhjelmen". Starting Forth (paperback ) (2. udgave). Prentice Hall. s. 241. ISBN  0-13-843079-9 . «For at opsummere er der tre slags variabler: Systemvariabler indeholder værdier, der bruges af hele Forth-systemet. Brugervariabler indeholder værdier, der er unikke for hver opgave, selvom definitionerne kan bruges af alle opgaver i systemet. Regulære variabler kan være tilgængelige enten i hele systemet eller kun inden for en enkelt opgave, afhængigt af om de er defineret inden for OPERATOReller inden for en privat opgave. » 
  25. ^ Brodie, Leo (1984). Thinking Forth (paperback) . Prentice Hall. ISBN  0-13-917568-7 . 
  26. Det klassiske vaskemaskineeksempel beskriver processen med at skabe et ordforråd til naturligt at repræsentere problemdomænet på en læsbar måde.

Bibliografi

  • Brody, Leo (2007). Marcel Hendrix, red. Starting Forth (Online bog) . Marlin Ouverson (webudgaven). FORTH, Inc. Hentet 29. september 2007 . 
  • Brody, Leo (2004). Bernd Paysan, red. At tænke videre (PDF online bog) . ISBN  0-9764587-0-5 . Arkiveret fra originalen den 16. december 2005 . Hentet 15. september 2008 . 
  • Conklin, Edward K.; Elizabeth D. Rather et al. (8. september 2007). Forth Programmer's Handbook (paperback) (3. udgave). BookSurge Publishing. s. 274. ISBN  1-4196-7549-4 . 
  • Snarere Elizabeth D. Forth Application Techniques (spiralbundet) . Forth Inc. p. 158. ISBN  0-9662156-1-3 . 
  • Pelc, Stephen F. Programmering Forth (spiralbundet) . MicroProcessor Engineering Ltd. s. 188. 
  • Kelly, Mahlon G.; Nicholas Spies. FORTH: En tekst og reference . Prentice Hall. ISBN  0-13-326331-2 . 
  • Koopman, Jr., Philip J. (1989). Stack Computers: The New Wave (hardcover) . Ellis Horwood Limited. ISBN  0-7458-0418-7 . 
  • Pointain, Dick (1987). Objektorienteret Frem: Implementering af datastrukturer (paperback ) . Harcourt Brace Jovanovich. ISBN  0-12-563570-2 . 
  • Payne, William ( 19. december 1990 ). Embedded Controller Forth til 8051-familien . Elsevier. s. 528. ISBN  978-0125475709 . 

Eksterne links