Mai departe | |
---|---|
Semantică | imperativ |
Clasa de limba | limbaj de programare, limbaj de programare interpretat și limbaj de programare compilat |
Tipul de execuție | interpret/compilator |
Aparut in | 1971 |
Autor | Charles H. Moore |
Tip sistem | nedactilografiat |
Implementări majore | gForth , pForth, kForth, SP-Forth [1] , win32forth [2] |
Dialectele | FORTH-79, FORTH-83, ANSI FORTH 1994, ColorForth , RetroForth . Al patrulea standard 2012 |
A fost influențat | APL , Lisp |
influențat | PostScript , Factor și alte limbaje concatenative |
Fișiere media la Wikimedia Commons |
Forth ( eng. Forth ) este unul dintre primele limbaje de programare concatenative , în care programele sunt scrise ca o secvență de lexeme („cuvinte” în terminologia limbajului Forth). Expresiile matematice sunt reprezentate prin notație postfixă atunci când se utilizează notația stivă . Sprijină mecanisme de meta-extensie a semanticii și sintaxei limbajului pentru a se adapta la domeniul dorit. Sintaxa de la nivel de bază în Forth este simplă și constă dintr-o singură regulă: „toate definițiile sunt separate prin spații”. Definițiile a patra pot avea orice combinație de caractere.
O serie de proprietăți, și anume interactivitatea , flexibilitatea și ușurința de dezvoltare, fac din Forth un limbaj eficient pentru cercetarea aplicată și construirea de instrumente. Sistemele de control încorporate sunt domenii evidente de aplicare pentru acest limbaj . Datorită simplității sale , compilatorul , și adesea compilatorul Forth , este ușor de implementat pentru marea majoritate a microcontrolerelor și este, de asemenea, folosit ca instrument de programare încrucișată . De asemenea, este folosit la programarea calculatoarelor care rulează diverse sisteme de operare sau ca mediu de operare independent.
Limba Forth a fost creată de Charles X. Moore la sfârșitul anilor 1960 și începutul anilor 1970. Moore și-a numit limbajul al patrulea , crezând că va fi limbajul de computer de a patra generație . Dar, deoarece lucra la o mașină IBM 1130 , care permitea nume compuse din cel mult cinci litere majuscule, numele a fost convertit în FORTH ( ing. înainte - înainte). Cu toate acestea, primele experimente ale lui Moore privind crearea unui interpret simplu care facilitează scrierea de programe pentru controlul echipamentelor astronomice datează de la sfârșitul anilor 1950. [3]
Din 1971, Moore a lucrat la Observatorul Național de Astronomie Radio , participând la dezvoltarea programelor de colectare și prelucrare a datelor primite de radiotelescop . Atunci a apărut prima implementare a limbii Forth. La această lucrare a participat și colaboratorul lui Moore, Elizabeth Rather , care poate fi considerată al doilea programator de forturi din lume .
Limbajul nou creat a fost acceptat ca principal limbaj de programare de către Societatea Americană de Astronomie . Mai târziu, în 1973, Charles Moore și Elizabeth Rather au fondat FORTH, Inc [4] , timp în care limbajul a fost portat pe multe platforme în următorul deceniu.
La sfârșitul anilor 1970, FORTH Interest Group (FIG) a fost format din programatori interesați de dezvoltarea limbajului. Acest grup a dezvoltat conceptul de model FIG Forth, un sistem public disponibil care poate fi portat cu ușurință la arhitecturi de computer populare. Acest sistem de referință Forth, FIG-FORTH, este adesea considerat standardul original al limbii.
Ideea standardizării oficiale a Forth a apărut inițial în cadrul Asociației Internaționale a Astronomilor ( Stiințele Astronomice Engleze , AST ). În mai 1977, la o întâlnire de la Observatorul Național Kitt Peak ( SUA ), a fost elaborat un glosar al limbii Forth, desemnat ca AST.01.
În februarie 1978, standardul FORTH-77 a fost adoptat la Utrecht , având ca scop implementarea microcomputerelor .
În octombrie 1979, o întâlnire pe insula Santa Catalina ( California ) s-a încheiat cu dezvoltarea standardului FORTH-79, care se aplică tuturor tipurilor de computere.
În toamna anului 1983, a avut loc o întâlnire pentru a dezvolta următorul standard, aprobat în 1984 ca FORTH-83. Standardul Fort-83 diferă de standardul Fort-79 în unele detalii, dar nu în substanță.
În 1988, grupul SIGFORTH [5] a fost organizat ca parte a ACM ; a existat și un grup ACM rus corespondent (președinte - prof. S. N. Baranov ( Sankt Petersburg , SPIIRAS )). SIGFORTH există acum ca parte a SIGPLAN general
În 1994, după o lungă negociere care a implicat multe firme interesate, a fost adoptat standardul de limbă ANSI Forth. [6]
Actualul standard al limbii Forth a fost adoptat în 2012. [7]
Un exemplu binecunoscut al succesului lui Fort este utilizarea acestuia în software-ul unui vehicul de coborâre la adâncime, la căutarea Titanicului în 1985 . Fort a fost folosit și în software-ul spectrografului de pe Shuttle , în micromodule pentru controlul sateliților artificiali de pe Pământ, pentru sistemul de control de pe aeroportul din Riad , sisteme de viziune computerizată , automatizarea analizei sângelui și controlului cardiologic, traductoare de buzunar.
Dialectul Forth este folosit în OpenBoot , software-ul de bază bazat pe procesoare SPARC și PowerPC .
La începutul anilor 1980, John Warnock și Chuck Geschke de la Adobe Systems au creat limbajul PostScript [8] . În ciuda asemănărilor dintre limbi, John Warnock a remarcat [9] că Forth nu a avut o influență asupra creării PostScript-ului.
Există procesoare și controlere care suportă modelul de calcul al limbajului la nivel hardware. Multe implementări open source ale Forth au fost create pentru diverse platforme hardware. Firme separate (printre care trebuie menționat, în primul rând, FORTH, Inc fondată de Charles Moore și compania britanică MicroProcessor Engineering Ltd. [10] ) furnizează versiuni comerciale ale limbajului cu capacități diferite.
Două jocuri pe computer de acasă de la Electronic Arts create în anii 1980 au fost scrise în Forth: Worms? (1983) [11] și Starflight (1986). [12] Canon Cat (1987) a folosit Forth ca limbaj de programare a sistemului .
Conferințele EuroForth au loc anual, inclusiv în Rusia, Anglia, Austria, Germania, Spania, Republica Cehă (fosta în Cehoslovacia). [13]
Partea principală a sistemului Forth este o listă legată de cuvinte , sau dicționar , din care un cuvânt este numit după nume pentru a îndeplini funcții specifice. Programarea a patra constă în definirea de cuvinte noi pe baza cuvintelor definite anterior în dicționar. Odată ce cuvintele noi sunt compilate într-un dicționar, ele nu diferă ca formă de cuvintele deja din dicționar. Descrierea unui cuvânt dintr-un dicționar se numește intrare .
Structura unei intrări „tipice” din dicționarul patru este:
În mod convențional, articolele Forth pot fi împărțite în două categorii: articole de nivel scăzut și articole forth . Articolele de primul tip conțin în câmpul de cod un pointer către o procedură din codurile procesorului țintă care realizează direct semantica cuvântului. Câmpul de parametri al unor astfel de articole conține parametrii trecuți procedurii sau codul acesteia în sine. Articolele patru conțin pointeri către alte articole din câmpul de parametri, iar câmpul de cod indică o procedură specială numită interpret de legături . În practică, structura articolului depinde de implementare, dar, de regulă, este similară cu cea discutată mai sus. Principiul folosit în câmpul de parametri al unui articol al patrulea se numește cod threaded , iar interpretorul de legături este numit o mașină virtuală .
Din punct de vedere gramatical, textul procesat de traducătorul Forth este o secvență de jetoane ( eng. token ), separate prin spații și caractere de sfârșit de rând. Traducătorul de șiruri de intrare selectează următorul simbol și îl caută în dicționarul curent, iar căutarea este efectuată de la cuvinte mai noi la cele mai vechi. Dacă cuvântul nu este găsit, se încearcă interpretarea jetonului ca o intrare numerică, care, dacă are succes, este împinsă în partea de sus a stivei. Dacă jetonul se potrivește cu cuvântul Forth, este analizată starea curentă a steagului de compilare al sistemului Forth . Dacă steagul este șters, atunci cuvântul este executat - controlul este transferat conform indicatorului câmpului de cod al articolului găsit. Dacă steag-ul este setat, cuvântul este compilat , adică un pointer către câmpul său de cod este atașat articolului creat curent. Dacă un număr a fost tradus, acesta este scos din stivă și compilat într-un cod literal , a cărui execuție în interiorul unei intrări de dicționar împinge numărul în partea de sus a stivei. În plus, cuvintele pot conține un steag imediat , caz în care sunt întotdeauna executate.
Mecanism de trecere a parametrilor între cuvinte:
Limbajul oferă o modalitate de a lucra cu memoria de sistem ca regiune liniară.
O componentă obligatorie a sistemului este, de asemenea, stiva de returnare. Disponibil programatic pentru a schimba fluxul de control al programului.
Toate cele de mai sus se aplică conceptului de Fort numai în prima aproximare. Forth nu este tocmai un limbaj de programare; mai degrabă, se suprapune noțiunii de limbaj de programare. Forth este mai mult o mașină virtuală și un sistem de operare ForthOS. [paisprezece]
Sintaxa și semantica lui Forth pot fi extinse la orice alt limbaj de programare chiar în momentul interpretării (compilării) unui program Forth. Utilizarea Forth ca metalimbaj este convenabilă datorită disponibilității instrumentelor Forth care acceptă acele limbi care sunt deja în sistemul Forth. Toate resursele sistemului Forth sunt disponibile utilizatorului și sunt prezentate sub formă de intrări de dicționar. De regulă, intrările de dicționar definite de utilizator au exact aceeași reprezentare în sistemul Forth ca toate celelalte intrări de dicționar care alcătuiesc întregul sistem Forth.
Un fel de cod threaded este folosit ca o reprezentare automată a unui program compilat .
Atunci când se utilizează codul subrutinei , se obține codul mașinii, în care, în comparație cu codul generat de compilatorul unui limbaj de programare convențional, în care atât variabilele, cât și adresele de retur din subrutine sunt plasate pe o singură stivă, nu există operații pentru „glisare”. and drop” a parametrilor subrutinei. Stiva principală a procesorului este folosită ca stiva de retur, stiva de date este organizată de software.
Atunci când se utilizează un cod threaded, altul decât codul subrutinei, definițiile Forth constând numai din codul mașinii sunt numite primitive . Într-un astfel de cod cu fire de execuție, ei încearcă adesea să folosească stiva de procesor principal ca stivă de date și să acceseze datele care se află pe el sub formă de instrucțiuni ale mașinii popși push.
Unul dintre avantajele nu atât de evidente ale utilizării codului indirect în fir este că tot codul nativ, adică primitivele, apelurile interpretorului de cod și variabilele, pot fi plasate într-un singur segment de cod care nu va fi accesibil pentru modificare. Toate celelalte coduri Forth se află în segmentul de date. Pot exista multe dintre aceste segmente și este mai ușor să lucrați cu un singur număr de segment decât cu două.
Al patrulea sisteme pot utiliza, de asemenea, bytecode ca o concluzie logică a dezvoltării codului indirect cu fire și codului pliat cu un tabel de adrese. În acest caz, codul programului (Forth) este o secvență de octeți sau codul unui procesor virtual inventat. Pentru a executa acest cod, trebuie să existe un tabel de 256 de adrese (2-byte, 4-byte sau 8-byte) la care se află primitivele Forth sau definițiile complexe.
Această opțiune este foarte diferită de alte tipuri de cod și merită o atenție specială.
Un exemplu de definiție a unui cuvânt .SIGN care tipărește fraza corespunzătoare în funcție de semnul numărului din partea de sus a stivei:
\ Tipăriți semnul unui număr : .SEMN ( n -- ) ?DUP 0=DACĂ "ZERO" ALTE 0>DACĂ ." NUMĂR POZITIV" ALTE ." NUMĂR NEGATIV" ATUNCI APOI ;Un exemplu de cod real care creează o constantă șir în forma acceptată în Forth (cu un contor):
\ Creați o „constantă” dintr-un șir : S-CONSTANT ( c-addr u "<spații>nume" -- ) CREA DUP , 0?DO DUP C@ C,CHAR+ LOOP DROP 0 C, FACE> DUP CELL+ SWAP @ ;Acest exemplu creează o definiție a cuvântului namefolosind cuvântul CREATE. Când numele cuvântului este executat, adresa pointerului către zona de memorie care se afla în momentul compilării cuvântului va fi plasată pe stivă. Pentru a putea fi folosit cumva, acolo este scris un șir („compilat”). Când un cuvânt este executat, cuvintele specificate după cuvânt sunt executate DOES>.
Astfel, în acest exemplu, a fost creat un nou construct sintactic. Caracteristici similare sunt rareori furnizate în alte limbaje de programare.
Pe lângă crearea de noi constructe sintactice, una dintre cele mai puternice caracteristici ale lui Forth este abilitatea de a interfera cu procesul de compilare cu cuvinte de execuție imediată (cuvinte imediate).
Exemple de astfel de cuvinte standard:
[ - Trecerea temporară la modul de execuție (de fapt, adesea scrie doar 0 în variabila STATE).
] — Reveniți la modul de compilare.
LITERAL - Compilați numărul aflat în prezent în partea de sus a stivei ca o constantă. Este și un cuvânt de execuție imediată.
Exemplu de cod în care sunt folosite aceste cuvinte:
\ Unele dimensiuni ale datelor în kiloocteți 16 mărime CONSTANTĂ \ Tipăriți un raport privind conversia kiloocteților în octeți :raport(-) mărimea . ." kilobytes sunt echivalenti cu " [ marimea 1024 * ] LITERAL . "octeți" ;Una dintre temele recurente ale controversei lui Forth este locul său printre limbile imperative „clasice”. Programele patru au un aspect extrem de neobișnuit:
Secretul de vorbire al maestrului Yoda a dezvăluit:
programatorul Old Fort era doar el.
Taina discursului lui Yoda descoperit este:
Yoda era doar un vechi programator Forth. [cincisprezece]
Aceste caracteristici determină avantajele și dezavantajele limbajului Forth:
Poate că ceea ce împiedică cu adevărat dezvoltarea Fortului este „moștenirea grea” care a venit de la mașinile de capacitate redusă pentru care a fost creat inițial. Standardul ANSI FORTH 94 are, de exemplu, următoarele caracteristici:
Multe dintre aceste caracteristici se datorează faptului că, la momentul adoptării standardului, existau multe sisteme Forth prost compatibile care se bazau pe două standarde parțial diferite din 1979 și 1983.
Limbaje de programare | |
---|---|
|