Forth (programmeringsspråk)

Den grunnleggende datastrukturen Til Forth er » ordboken «som tilordner» ord » til kjørbar kode eller navngitte datastrukturer. Ordboken er lagt ut i minnet som et tre med koblede lister med koblingene som går fra det siste (sist) definerte ordet til det eldste, til en sentinel-verdi, vanligvis EN NULLPEKER, er funnet. En kontekstbryter fører til at et listesøk starter på et annet blad. En lenket liste søk fortsetter som grenen fusjonerer inn i hovedstammen fører til slutt tilbake til sentinel, roten.Det kan være flere ordbøker. I sjeldne tilfeller som meta-kompilering en ordbok kan være isolert og frittstående.Effekten ligner på nesting navnerom og kan overbelaste søkeord avhengig av konteksten.

et definert ord består vanligvis av hode og kropp med hodet som består av navnefeltet (NF) og lenkefeltet (LF), og kropp som består av kodefeltet (CF) og parameterfeltet (PF).

Hode og kropp i en ordbokoppføring behandles separat fordi De kanskje ikke er sammenhengende. For eksempel, når Et Forth-program rekompileres for en ny plattform, kan hodet forbli på kompileringsdatamaskinen, mens kroppen går til den nye plattformen. I noen miljøer (for eksempel innebygde systemer) opptar hodene minnet unødvendig. Noen kryss-kompilatorer kan imidlertid sette hoder i målet hvis målet selv forventes å støtte en interaktiv Forth.

Ordbok entryEdit

det eksakte formatet for en ordbokoppføring er ikke foreskrevet, og implementeringene varierer. Imidlertid er visse komponenter nesten alltid til stede, selv om den nøyaktige størrelsen og rekkefølgen kan variere. Beskrevet som en struktur, kan en ordbokoppføring se slik ut:

 structure byte: flag \ 3bit flags + length of word's name char-array: name \ name's runtime length isn't known at compile time address: previous \ link field, backward ptr to previous word address: codeword \ ptr to the code to execute this word any-array: parameterfield \ unknown length of data, words, or opcodes end-structure forthword

navnefeltet starter med et prefiks som gir lengden på ordets navn (vanligvis opptil 32 byte), og flere biter for flagg. Tegnrepresentasjonen av ordets navn følger deretter prefikset. Avhengig av den spesielle implementeringen Av Forth, kan det være en ELLER flere NULL (‘\0’) byte for justering.

koblingsfeltet inneholder en peker til det tidligere definerte ordet. Pekeren kan være en relativ forskyvning eller en absolutt adresse som peker til neste eldste søsken.

kodefeltpekeren vil enten være adressen til ordet som vil utføre koden eller dataene i parameterfeltet eller begynnelsen på maskinkoden som prosessoren vil utføre direkte. For kolon definerte ord, peker kodefeltpekeren til ordet som vil lagre den Nåværende Forth instruksjonspekeren (IP) på returstakken, og laste IP med den nye adressen for å fortsette utførelsen av ord. Dette er det samme som hva en prosessors samtale / returinstruksjoner gjør.

struktur av kompilatorenrediger

kompilatoren selv er ikke et monolitisk program. Den består Av Forth ord synlig for systemet, og kan brukes av en programmerer. Dette gjør at en programmerer kan endre kompilatorens ord til spesielle formål.

«kompileringstid» – flagget i navnefeltet er angitt for ord med» kompileringstid » – oppførsel. De fleste enkle ord utføre samme kode om de er skrevet på en kommandolinje, eller innebygd i koden. Når kompilering disse, kompilatoren bare plasserer kode eller en gjenget peker til ordet.

de klassiske eksemplene på kompileringstidsord er kontrollstrukturer som IF og WHILE. Nesten Alle Forths kontrollstrukturer og nesten alle kompilatorer er implementert som kompileringstidsord. Bortsett fra noen sjelden brukte kontrollflytord som bare finnes i noen få implementeringer, for eksempel en betinget retur, blir Alle Forths kontrollflytord utført under kompilering for å kompilere ulike kombinasjoner av primitive ord sammen med deres grenadresser. For eksempelIF ogWHILE, og ordene som samsvarer med disse, sett opp BRANCH (ubetinget gren) og ?BRANCH(pop en verdi av stabelen, og gren hvis den er falsk). Telles loop kontroll flyt ord fungerer på samme måte, men sette opp kombinasjoner av primitive ord som fungerer med en teller, og så videre. Under kompilering brukes datastakken til å støtte balansering av kontrollstruktur, nesting og back-patching av grenadresser. Koden:

 ... DUP 6 < IF DROP 5 ELSE 1 - THEN ...

vil bli kompilert til følgende sekvens i en definisjon:

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

tallene etter BRANCH representerer relative hoppadresser. LIT er det primitive ordet for å skyve et «bokstavelig» tall på datastakken.

Kompileringstilstand og fortolkningstilstandredit

ordet : (kolon) analyserer et navn som en parameter, oppretter en ordbokoppføring (en kolondefinisjon) og går inn i kompileringstilstand. Tolken fortsetter å lese romavgrensede ord fra brukerinngangsenheten. Hvis et ord er funnet, utfører tolken kompileringssemantikken knyttet til ordet, i stedet for tolkningssemantikken. Standard kompilering semantikk av et ord er å legge sin tolkning semantikk til gjeldende definisjon.

ordet ; (semikolon) fullfører gjeldende definisjon og går tilbake til tolkningstilstand. Det er et eksempel på et ord hvis kompileringssemantikk er forskjellig fra standard. Tolkningssemantikken til ; (semikolon), de fleste kontrollflytord og flere andre ord er udefinert I ANS Forth, noe som betyr at de bare må brukes innenfor definisjoner og ikke på den interaktive kommandolinjen.

tolketilstanden kan endres manuelt med ordene (høyre brakett) som angir henholdsvis tolketilstand eller kompileringstilstand. Disse ordene kan brukes med ordet LITERAL for å beregne en verdi under en kompilering og å sette inn den beregnede verdien i gjeldende kolondefinisjon. LITERAL har kompileringssemantikken til å ta et objekt fra datastakken og legge til semantikk i gjeldende kolondefinisjon for å plassere objektet på datastakken.

I ANS Forth kan tolkens nåværende tilstand leses fra flagget STATE som inneholder verdien sann når den er i kompileringstilstand og falsk ellers. Dette tillater implementering av såkalte statsmarte ord med atferd som endres i henhold til tolkens nåværende tilstand.

Umiddelbare ordredit

ordet IMMEDIATE markerer den nyeste kolondefinisjonen som et øyeblikkelig ord, og erstatter effektivt sin kompileringssemantikk med sin fortolkningssemantikk. Umiddelbare ord utføres normalt under kompilering, ikke kompilert, men dette kan overstyres av programmereren i begge stater. ; er et eksempel på et øyeblikkelig ord. I ANS Forth tar ordet POSTPONE et navn som en parameter og legger til kompileringssemantikken til det navngitte ordet til gjeldende definisjon, selv om ordet ble merket umiddelbart. Forth-83 definerte separate ord COMPILE og for å tvinge sammenstillingen av henholdsvis ikke-umiddelbare og umiddelbare ord.

Ikke Navngitte ord og utførelse tokensEdit

I ANS Forth kan ikke navngitte ord defineres med ordet :NONAME som kompilerer følgende ord opp til neste ; (semikolon) og etterlater et utførelsestoken på datastakken. Utførelsestokenet gir et ugjennomsiktig håndtak for kompilert semantikk, som ligner funksjonspekerne Til c-programmeringsspråket.

Utførelsestokener kan lagres i variabler. Ordet EXECUTE tar et utførelsestoken fra datastakken og utfører den tilknyttede semantikken. Ordet COMPILE, (compile-comma) tar et utførelsestoken fra datastakken og legger til den tilknyttede semantikken i gjeldende definisjon.

ordet ' (tick) tar navnet på et ord som en parameter og returnerer utførelsestokenet som er knyttet til det ordet på datastakken. I tolketilstand er' RANDOM-WORD EXECUTE ekvivalent med RANDOM-WORD.

Rediger

ordene: (kolon),POSTPONE' (tick) er eksempler på parsing av ord som tar sine argumenter fra brukerinndataenheten i stedet for datastakken. Et annet eksempel er ordet ( (paren) som leser og ignorerer følgende ord opp til og med neste høyre parentes og brukes til å plassere kommentarer i en kolondefinisjon. På samme måte brukes ordet \ (backslash) for kommentarer som fortsetter til slutten av gjeldende linje. For å bli analysert riktig må ((paren) og \ (backslash) skilles med mellomrom fra følgende kommentar tekst.

Struktur av codeEdit

i De Fleste Forth systemer består kroppen av en kodedefinisjon av enten maskinspråk eller en form for gjenget kode. Den opprinnelige Forth som folger den uformelle FIG-standarden (Forth Interest Group), er ET TIL (Threaded Interpretive Language). Dette kalles også indirekte-gjenget kode, men direkte-gjenget og subrutine gjengede Forths har også blitt populært i moderne tid. De raskeste Moderne Forths, Som SwiftForth, VFX Forth og iForth, kompilerer Forth Til innfødt maskinkode.

data objectsEdit

NÅR et ord er en variabel eller et annet dataobjekt, peker CF på kjøretidskoden som er knyttet til det definerende ordet som skapte det. Et definerende ord har en karakteristisk «definerende oppførsel» (opprette en ordbokoppføring pluss muligens tildeling og initialisering av datarom) og spesifiserer også oppførselen til en forekomst av klassen av ord konstruert av dette definerende ordet. Eksempler er:

VARIABLENavngir en initialisert, en-celle minneplassering. Forekomst av enVARIABLEreturnerer adressen på stakken.CONSTANTNavngir en verdi (angitt som et argument tilCONSTANT). Forekomst returnerer verdien.CREATENavngir et sted; plass kan tildeles på dette stedet, eller det kan settes til å inneholde en streng eller annen initialisert verdi. Instansvirkemåte returnerer adressen til begynnelsen av dette området. Forth gir også et anlegg der en programmerer kan definere nye applikasjonsspesifikke definerende ord, og angir både en tilpasset definerende oppførsel og instansadferd. Noen eksempler inkluderer sirkulære buffere, navngitte biter på en i / O-port og automatisk indekserte arrayer.

dataobjekter definert av disse og lignende ord er globale i omfang. Funksjonen gitt av lokale variabler på andre språk er gitt av datastakken I Forth (Selv Om Forth også har ekte lokale variabler). Forth programmering stil bruker svært få navngitte dataobjekter sammenlignet med andre språk; vanligvis brukes slike dataobjekter til å inneholde data som brukes av en rekke ord eller oppgaver (i en multitasked implementering).Det er programmererens ansvar å bruke passende operatører til å hente og lagre verdier eller utføre andre operasjoner på data.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.