Forth (limbaj de programare)

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 29 septembrie 2020; verificările necesită 18 modificări .
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.

Istorie

Creare

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.

Standardizare

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]

Dezvoltare ulterioară și cazuri de utilizare

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]

Concepte de bază ale sistemului clasic Forth

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.

Al patrulea tip de cod

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ă.

Exemple de programe

.( Salut Lume)

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" ;

Caracteristici ale limbii Forth

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:

  • Programul constă dintr-o secvență neobișnuită de cuvinte, printre care nu există așa-numitele cuvinte „cheie” care sunt recunoscute și procesate în alte limbaje de programare într-un mod special.
    Odată cu lansarea seriei de filme Star Wars , a apărut o glumă despre asta, care a devenit acum un clasic, care ilustrează bine această caracteristică a Fortului:

Secretul de vorbire al maestrului Yoda a dezvăluit:
programatorul Old Fort era doar el.

Text original  (engleză)[ arataascunde]

Taina discursului lui Yoda descoperit este:
Yoda era doar un vechi programator Forth. [cincisprezece]

  • Exemplul de mai sus indică în același timp caracteristica unică a lui Forth: absența unei liste de parametri între paranteze și capacitatea de a programa în limba lor maternă. Utilizarea structurilor de vocabular ale limbii materne face posibilă înțelegerea programului, ceea ce crește fiabilitatea acestuia. .
  • Notația poloneză inversă ” a expresiilor aritmetice și având mai multe stive.
  • Natura duală a compilatorului Forth. Este imposibil să spunem fără echivoc dacă Forth este un compilator sau un interpret. Poate fi folosit aproape întotdeauna în două moduri, cu excepția cazurilor rare precum „compilarea țintă” (traducerea în codul mașinii a unui program pentru un sistem cu o arhitectură diferită).
  • Fără tip de sistem . La fel ca limbajele de asamblare , Forth nu are un sistem de tip încorporat. Nu există nicio modalitate de a ști dacă partea de sus a stivei este un număr cu semn, un număr fără semn, un indicator către un șir, un caracter sau două numere tratate ca un număr lung. Controlul tipului este responsabilitatea programatorului. În acest caz, se folosesc seturi speciale de cuvinte (de exemplu, scrierea și citirea celulelor de memorie se face cu cuvinte !și @, iar caracterele - cu cuvinte C!și C@), unele entități sunt plasate pe stive speciale (de exemplu, un teanc de numere în virgulă mobilă , conform standardului ANSI FORTH 94; poate fi, poate fi sau nu implementat folosind stiva principală).

Aceste caracteristici determină avantajele și dezavantajele limbajului Forth:

  • Un programator experimentat familiarizat cu setul de instrucțiuni și arhitectura procesorului poate scrie „kernelul” unui sistem Forth în câteva zile.
  • Libertatea oferită programatorului necesită un puternic control de sine. Pragul de intrare pentru programare în Forth este mai scăzut decât cel al limbajelor de programare clasice, dar necesită obișnuirea și înțelegerea nu numai a capabilităților și caracteristicilor sintaxei Forth, ci și a înțelegerii filozofiei de bază.
  • Forth nu acceptă nicio paradigmă de programare și le suportă pe toate în același timp. Scrierea unui set de cuvinte pentru organizarea OOP într-un program Forth (și pot fi mai multe dintre ele în același timp și se vor înțelege bine împreună) este mult mai ușor decât a decide ce caracteristici sunt necesare din acest set de cuvinte.
  • Împărțirea programului în mai multe cuvinte mici vă permite să le verificați rapid și ușor individual, transmițându-le seturile necesare de parametri de intrare și controlând ceea ce rămâne pe stivă. De fapt, aceasta înseamnă că, pentru a testa o componentă a programului, nu trebuie să descărcați toate componentele dependente ca întreg.
  • Cele mai multe implementări ale lui Forth vă permit să decompilați programul. Textul rezultat diferă puțin de original.
  • Forth vă permite să implementați orice tehnologie de programare disponibilă în alte limbi și sisteme. De asemenea, permite tehnici care sunt interzise în alte limbi (de exemplu, auto-modificarea codului). Eliminarea consecințelor negative ale acestor tehnici prin crearea unui vocabular potrivit care să stimuleze o tehnică competentă pentru utilizarea lor este încredințată și programatorului.
  • Dimensiunea codului Forth pentru sistemele pe 16 biți, când programul este scris corect, este uneori de 10-20 de ori mai mică decât codul compilat din programul C. Pentru sistemele pe 32 de biți, acest decalaj este și mai mare. În sistemele de operare, câștigul total poate fi de sute sau chiar de mii de ori. Motivul este foarte simplu - o sarcină terminată în Forth are o dimensiune de câțiva octeți, toate rutinele auxiliare sunt implementate ca definiții disponibile pentru toată lumea. Sistemul Forth se va potrivi în procesor, în care alte sisteme, în principiu, nu sunt capabile să se potrivească.
  • Sincronizarea proceselor și firelor în sistemele multitasking, schimbarea contextului, implementarea accesului la resurse limitate sunt cele mai dificile probleme la scrierea unui sistem de operare. Pentru a susține aceste caracteristici, sunt create chiar și instrucțiuni speciale în microprocesoare. Pentru interpret, aceasta nu este deloc o problemă, deoarece emulează orice procesor și orice instrucțiune necesară.

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:

  • Un program portabil trebuie să presupună că o stivă de numere în virgulă mobilă poate fi implementată folosind stiva de bază. Din fericire, acesta nu este cazul pentru majoritatea compilatoarelor moderne. Dar însuși faptul prezenței unei astfel de clauze în standard creează anumite inconveniente. Când se programează cu utilizarea activă a aritmeticii în virgulă mobilă, această normă a standardului este în mod tradițional ignorată.
  • O regulă similară există în ceea ce privește stiva de flux de control. Totul nu este atât de simplu aici, deoarece adesea acesta este exact ceea ce este - în timpul procesului de compilare, stiva este folosită de compilator însuși. În marea majoritate a cazurilor, acest lucru nu are niciun efect asupra programului, dar caracteristica în sine trebuie reținută. De exemplu, dacă doriți să calculați un număr în timpul compilării, în afara începutului definiției, și apoi să îl introduceți într-un cuvânt ca constantă, atunci va trebui să utilizați un fel de soluție.
  • Definițiile multor cuvinte din standard sunt la nivel prea scăzut. De exemplu, cuvântul 2*nu se înmulțește cu doi, așa cum sugerează și numele, ci „mută bitul numărul unu la cea mai semnificativă cifră binară, umplând bitul cel mai puțin semnificativ cu zero”. Desigur, pe majoritatea mașinilor moderne, acesta este același lucru, dar însuși faptul de a folosi caracteristicile unei anumite arhitecturi este alarmant. (Există, de asemenea, cuvinte standard de deplasare de biți mai evidente LSHIFTși RSHIFT.)

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.

Vezi și

Dialectele Aplicații

Note

  1. Proiectul SP-Forth la SourceForge.net
  2. Grupul de proiecte Win32Forth . Consultat la 18 august 2006. Arhivat din original pe 13 august 2006.
  3. CH Moore, ED Rather, DR Colburn. Evoluția lui Forth . Anunțuri ACM SIGPLAN, Volumul 28, Nr. 3. martie 1993 / Conferința de Istoria limbajelor de programare (aprilie 1993). Consultat la 19 februarie 2010. Arhivat din original pe 22 august 2011.
  4. Instrumente de dezvoltare și programare a sistemelor încorporate de FORTH, Inc. Consultat la 19 februarie 2010. Arhivat din original pe 4 ianuarie 2010.
  5. A 22-a Conferință EuroForth . Data accesării: 19 februarie 2010. Arhivat din original la 5 decembrie 2008.
  6. DPANS'94 . Data accesului: 22 iulie 2007. Arhivat din original la 30 iunie 2007.
  7. Înainte . forth-standard.org . Preluat la 2 mai 2022. Arhivat din original la 11 mai 2022.
  8. Adobe PostScript 3 - Resurse . Consultat la 2 decembrie 2006. Arhivat din original pe 3 ianuarie 2007.
  9. Federico Biancuzzi, Shane Worden. Pionierii programarii. Conversații cu creatorii limbajelor majore de programare = Masterminds of Programming: Conversations with the Creators of Major Programming Languages. - Simbol-Plus, 2011. - S. 502. - 608 p. — ISBN 9785932861707 .
  10. MPE - MicroProcessor Engineering Limited . Consultat la 19 februarie 2010. Arhivat din original pe 5 ianuarie 2010.
  11. Maynard, David S. David Maynard: Software Artist . Preluat la 27 iunie 2021. Arhivat din original la 15 iunie 2021.
  12. Maher, Jimmy Starflight . Anticarul digital (28 octombrie 2014). Preluat la 23 mai 2017. Arhivat din original la 25 aprilie 2017.
  13. EuroForth: European Forth Conference . Data accesului: 24 ianuarie 2010. Arhivat din original la 16 iunie 2010.
  14. ForthWiki - ForthOS . Consultat la 1 februarie 2006. Arhivat din original la 30 august 2005.
  15. Originea utilizatorului Aquatix . Preluat la 12 august 2012. Arhivat din original la 9 februarie 2014.

Literatură

  • Baranov S. N., Kolodin M. Yu. Fenomenul Fort // Informatica de sistem. - Novosibirsk: VO "Nauka". Editura din Siberia, 1995. - Editura . 4 . - S. 193-291 . — ISBN 5-02-030678-9 .
  • Baranov S. N., Nozdrunov N. R. Limbajul patru și implementările sale. - L . : Mashinostroenie, 1988. - 157 p. - (calculator în producție). — 100.000 de exemplare.  — ISBN 5-217-00324-3 .
  • Leo Brody. Gândind înainte . — ISBN 0-9764587-0-5 . Arhivat pe 16 decembrie 2005 la Wayback Machine
  • Brody L. Curs de programare Începând înainte = Începând înainte. O introducere în limbajul Forth și sistemul de operare pentru începători și profesioniști / Per. din engleza; cuvânt înainte I. V. Romanovsky. - M. : Finanţe şi statistică, 1990. - 352 p. - 40.000 de exemplare.  - ISBN 5-279-00252-6 .
  • Brody L. Modul de a gândi - Fort .
  • Burago A. Yu., Kirillin V. A., Romanovsky I. V. Fort este un limbaj pentru microprocesoare. - Societatea „Cunoașterea”, organizația Leningrad, 1989. - 36 p. - (Pentru a ajuta lectorul). - 26.000 de exemplare.
  • Dyakonov V.P. Forth-sisteme de programare a calculatoarelor personale. - M. : Nauka, 1992. - 352 p. — ISBN 5-02-014460-6 .
  • Kelly M., Spies N. Limbajul de programare Fort / Per. din engleza. - M . : Radio și comunicare, 1993. - 320 p. — ISBN 5-256-00438-7 .
  • Semyonov Yu. A. Programare în limbajul patru. - M .: Radio și comunicare. — 240 s. — 50.000 de exemplare.  — ISBN 5-256-00547-2 .
  • Townsend K., Foght D. Proiectare și implementare software de sisteme expert pe computere personale / Per. din engleza. V. A. Kondratenko, S. V. Trubitsyna. - M. : Finanţe şi statistică, 1990. - 320 p. - ISBN 5-279-00255-0 (URSS) ISBN 0-8306-2692-1 (SUA).
Publicații de jurnal

Link -uri

Standard Resurse în limba rusă Colecții de link-uri către resurse viitoare