structura de date de bază a Forth este „dicționarul” care mapează „cuvintele” la codul executabil sau la structurile de date numite. Dicționarul este așezat în memorie ca un arbore al listelor legate cu legăturile care pornesc de la cel mai recent (cel mai recent) cuvânt definit la cel mai vechi, până când se găsește o valoare santinelă, de obicei un pointer nul. Un comutator de context determină o căutare listă pentru a începe de la o frunză diferită. O căutare listă legată continuă ca ramura fuzionează în trunchiul principal duce în cele din urmă înapoi la sentinel, rădăcina.Pot exista mai multe dicționare. În cazuri rare, cum ar fi meta-compilarea, un dicționar ar putea fi izolat și autonom.Efectul seamănă cu cel al spațiilor de nume cuibăritoare și poate supraîncărca cuvintele cheie în funcție de context.
un cuvânt definit constă în general din cap și corp cu capul format din câmpul de nume (NF) și câmpul de legătură (LF) și corpul format din câmpul de cod (CF) și câmpul de parametri (PF).
capul și corpul unei intrări din dicționar sunt tratate separat, deoarece este posibil să nu fie contigue. De exemplu, atunci când un program Forth este recompilat pentru o nouă platformă, capul poate rămâne pe computerul de compilare, în timp ce corpul merge la noua platformă. În unele medii (cum ar fi sistemele încorporate) capetele ocupă memoria inutil. Cu toate acestea, unii compilatori încrucișați pot pune capete în țintă dacă se așteaptă ca ținta în sine să susțină un interactiv mai departe.
dicționar entryEdit
formatul exact al unei intrări în dicționar nu este prescris, iar implementările variază. Cu toate acestea, anumite componente sunt aproape întotdeauna prezente, deși dimensiunea exactă și ordinea pot varia. Descris ca o structură, o intrare în dicționar ar putea arăta astfel:
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
câmpul Nume începe cu un prefix care dă lungimea numelui cuvântului (de obicei până la 32 de octeți) și câțiva biți pentru Steaguri. Reprezentarea caracterului numelui cuvântului urmează apoi prefixul. În funcție de implementarea particulară a Forth, pot exista unul sau mai mulți octeți NUL (‘\0’) pentru aliniere.
câmpul link conține un pointer către cuvântul definit anterior. Indicatorul poate fi o deplasare relativă sau o adresă absolută care indică următorul frate mai vechi.
indicatorul câmpului de cod va fi fie adresa cuvântului care va executa codul sau datele din câmpul parametrilor, fie începutul codului mașinii pe care procesorul îl va executa direct. Pentru cuvintele definite cu două puncte, indicatorul câmpului de cod indică cuvântul care va salva indicatorul curent de instrucțiuni (IP) pe stiva de returnare și va încărca IP-ul cu noua adresă de la care să continue executarea cuvintelor. Acest lucru este la fel ca ceea ce fac instrucțiunile de apel/returnare ale unui procesor.
structura compilerEdit
compilatorul în sine nu este un program monolitic. Se compune din mai departe Cuvinte vizibile pentru sistem, și utilizabile de către un programator. Acest lucru permite unui programator să schimbe cuvintele compilatorului în scopuri speciale.
steagul „timp de compilare” din câmpul Nume este setat pentru cuvintele cu comportament „timp de compilare”. Majoritatea cuvintelor simple execută același cod, indiferent dacă sunt tastate pe o linie de comandă sau încorporate în cod. La compilarea acestora, compilatorul plasează pur și simplu codul sau un pointer filetat la cuvânt.
exemplele clasice de cuvinte în timpul compilării sunt structurile de control precumIF
șiWHILE
. Aproape toate structurile de control ale Forth și aproape toate compilatoarele sale sunt implementate ca cuvinte de compilare. În afară de unele cuvinte de flux de control rar utilizate găsite doar în câteva implementări, cum ar fi o întoarcere condiționată, toate cuvintele de flux de control ale lui Forth sunt executate în timpul compilării pentru a compila diverse combinații de cuvinte primitive împreună cu adresele lor de ramură. De exemplu, IF
și WHILE
și cuvintele care se potrivesc cu acestea, configurați BRANCH
(ramură necondiționată) și ?BRANCH
(scoateți o valoare din stivă și ramificați dacă este falsă). Cuvintele contorizate ale fluxului de control al buclei funcționează în mod similar, dar configurează combinații de cuvinte primitive care funcționează cu un contor și așa mai departe. În timpul compilării, stiva de date este utilizată pentru a sprijini echilibrarea structurii de control, cuibărirea și patching-ul din spate al adreselor ramurilor. Fragmentul:
... DUP 6 < IF DROP 5 ELSE 1 - THEN ...
ar fi compilat la următoarea secvență în interiorul unei definiții:
... DUP LIT 6 < ?BRANCH 5 DROP LIT 5 BRANCH 3 LIT 1 - ...
numerele de dupăBRANCH
reprezintă adrese de salt relative. LIT
este cuvântul primitiv pentru împingerea unui număr” literal ” pe stiva de date.
starea de compilare și interpretarea stateEdit
cuvântul:
(colon) analizează un nume ca parametru, creează o intrare în dicționar (o definiție a colonului) și intră în starea de compilare. Interpretul continuă să citească cuvinte delimitate de spațiu de pe dispozitivul de introducere a utilizatorului. Dacă se găsește un cuvânt, interpretul execută semantica de compilare asociată cuvântului, în loc de semantica de interpretare. Semantica implicită de compilare a unui cuvânt trebuie să adauge semantica sa de interpretare la definiția curentă.
cuvântul;
(semi-colon) termină definiția curentă și revine la starea de interpretare. Este un exemplu de cuvânt a cărui semantică de compilare diferă de cea implicită. Semantica de interpretare a ;
(semi-colon), majoritatea cuvintelor fluxului de control și alte câteva cuvinte sunt nedefinite în Ans Forth, ceea ce înseamnă că acestea trebuie utilizate numai în interiorul definițiilor și nu pe linia de comandă interactivă.
starea interpretului poate fi modificată manual cu cuvintele (paranteză dreaptă) care intră în starea de interpretare sau, respectiv, în starea de compilare. Aceste cuvinte pot fi folosite cu cuvântul
LITERAL
pentru a calcula o valoare în timpul unei compilări și pentru a insera valoarea calculată în definiția curentă a colonului. LITERAL
are semantica de compilare pentru a lua un obiect din stiva de date și pentru a adăuga semantica la definiția curentă a colonului pentru a plasa acel obiect pe stiva de date.
în ANS Forth, starea actuală a interpretului poate fi citită din steagulSTATE
care conține valoarea true atunci când este în stare de compilare și false altfel. Acest lucru permite implementarea așa-numitelor cuvinte inteligente de stat cu comportament care se schimbă în funcție de starea actuală a interpretului.
imediat wordsEdit
cuvântulIMMEDIATE
marchează cea mai recentă definiție a colonului ca un cuvânt imediat, înlocuind efectiv semantica sa de compilare cu semantica sa de interpretare. Cuvintele imediate sunt executate în mod normal în timpul compilării, nu compilate, dar acest lucru poate fi anulat de programator în oricare dintre stări. ;
este un exemplu de cuvânt imediat. În Ans Forth, cuvântul POSTPONE
ia un nume ca parametru și adaugă semantica de compilare a cuvântului numit la definiția curentă, chiar dacă cuvântul a fost marcat imediat. Forth – 83 definite cuvinte separateCOMPILE
și pentru a forța compilarea cuvintelor non-imediate și, respectiv, imediate.
cuvinte fără nume și tokensedit de execuție
în Ans mai departe, cuvintele fără nume pot fi definite cu cuvântul:NONAME
care compilează următoarele cuvinte până la următorul;
(semi-colon) și lasă un jeton de execuție pe stiva de date. Jetonul de execuție oferă un mâner opac pentru semantica compilată, similar cu indicatoarele funcționale ale limbajului de programare C.jetoanele de execuție pot fi stocate în variabile. Cuvântul EXECUTE
ia un jeton de execuție din stiva de date și efectuează semantica asociată. Cuvântul COMPILE,
(compilare-virgulă) ia un jeton de execuție din stiva de date și adaugă semantica asociată la definiția curentă.
cuvântul'
(bifați) ia numele unui cuvânt ca parametru și returnează jetonul de execuție asociat cu acel cuvânt în stiva de date. În starea de interpretare,' RANDOM-WORD EXECUTE
este echivalent cuRANDOM-WORD
.
Edit
cuvintele:
(două puncte),POSTPONE
'
(bifați) sunt exemple de parsare a cuvintelor care își iau argumentele de pe dispozitivul de introducere a utilizatorului în locul stivei de date. Un alt exemplu este cuvântul(
(paren) care citește și ignoră următoarele cuvinte până la și inclusiv următoarea paranteză dreaptă și este folosit pentru a plasa comentarii într-o definiție de două puncte. În mod similar, cuvântul \
(backslash) este utilizat pentru comentarii care continuă până la sfârșitul liniei curente. Pentru a fi analizat corect, (
(paren) și \
(backslash) trebuie separate prin spațiu alb de următorul text de comentariu.
structura codeEdit
în majoritatea sistemelor Forth, corpul unei definiții de cod constă fie din limbajul mașinii, fie dintr-o formă de cod filetat. Originalul Forth care urmează standardul FIG informal (grupul de interese Forth), este un TIL (limbaj interpretativ filetat). Acest lucru se mai numește cod cu filet indirect, dar forturile cu filet direct și subrutină au devenit, de asemenea, populare în timpurile moderne. Cele mai rapide forturi moderne, cum ar fi SwiftForth, VFX Forth și iForth, compilează codul mașinii native.
data objectsEdit
când un cuvânt este o variabilă sau alt obiect de date, CF indică codul runtime asociat cuvântului definitoriu care l-a creat. Un cuvânt definitoriu are o caracteristică „comportament definitoriu” (crearea unei intrări în dicționar plus eventual alocarea și inițializarea spațiului de date) și specifică, de asemenea, comportamentul unei instanțe a clasei de cuvinte construite de acest cuvânt definitoriu. Exemplele includ:
VARIABLE
numește o locație de memorie neinițializată, cu o singură celulă. Comportamentul instanță a unuiVARIABLE
returnează adresa pe stivă.CONSTANT
denumește o valoare (specificată ca argument pentruCONSTANT
). Comportamentul instanței returnează valoarea.CREATE
denumește o locație; spațiul poate fi alocat în această locație sau poate fi setat să conțină un șir sau altă valoare inițializată. Comportamentul instanței returnează adresa de la începutul acestui spațiu.
Forth oferă, de asemenea, o facilitate prin care un programator poate defini noi cuvinte definitorii specifice aplicației, specificând atât un comportament definitoriu personalizat, cât și un comportament de instanță. Câteva exemple includ tampoane circulare, biți numiți pe un port I/O și matrice indexate automat.
obiectele de date definite de aceste cuvinte și cuvinte similare sunt globale în domeniu. Funcția furnizată de variabilele locale în alte limbi este furnizată de stiva de date din Forth (deși Forth are și variabile locale reale). Stilul de programare Forth folosește foarte puține obiecte de date numite în comparație cu alte limbi; de obicei, astfel de obiecte de date sunt utilizate pentru a conține date care sunt utilizate de un număr de cuvinte sau sarcini (într-o implementare multitasked).
Forth nu impune consecvența utilizării tipului de date; este responsabilitatea programatorului să utilizeze operatori adecvați pentru a prelua și stoca valori sau pentru a efectua alte operațiuni asupra datelor.