User:Oksana Hristova/sandbox/Forth BG

Forth

Структура на кода
В повечето Форт системите, тялото на дадена кодова дефиниция се състои или от машинен език или от някаква форма на нишков код. Оригиналния Форт, които следва неформалния FIG стандарт (Forth Interest Group), е нишковотълкователен език. Това се нарича индиректнонишков код, но директнонишкови и подпрограмнонишкови Форт кодове също са станали популярни в днешно време. Най-бързите и модерни Форт кодове използват подпрограмни нишки, вмъкват просто думи като макроси и изпълняват шпионкова оптимизация или други оптимизиращи стратегии, за да направят кода по-малък и бърз.

Обекти от данни
Когато една дума е променлива или друг обект от данни, кодовото поле сочи към кода, изпълняван по време на работа, който е свързан с дефиниращата дума, която я е създала. Дефиниращата думата има характерно "дефиниращо поведение" (създавайки речник и евентуално заделяйки и инициализирайки пространство в паметта) и също така определя поведението на дадена инстанция от класа от думи, създадени от дефиниращата дума. Примери включват:
 * Наименува неинициализирана едноклетъчна локация в паметта. Инстанционното поведение на дадена променлива  връща нейния адрес в стека.
 * Наименува неинициализирана едноклетъчна локация в паметта. Инстанционното поведение на дадена променлива  връща нейния адрес в стека.


 * Наименува стойност (уточнена като аргумент към константата ). Инстанционното поведение връща стойността.
 * Наименува стойност (уточнена като аргумент към константата ). Инстанционното поведение връща стойността.


 * Наименува локация; мястото може да бъде заделеното на дадената локация или може да бъде направено да съдържа низ или друга инициализирана стойност.
 * Наименува локация; мястото може да бъде заделеното на дадената локация или може да бъде направено да съдържа низ или друга инициализирана стойност.

Инстанционното поведение връща адресът на началото на това място.

Форт също така предоставя инструмент, чрез който програмиста може да дефинира нови, специфични за дадена апликация, дефиниращи думи, посочвайки както специфично дефиниращото поведение, така и инстанционното поведение. Някои примери включват кръгови буфери, наименувани битове на даден I/O порт и автоматично индексирани масиви.

Обектите от данни, дефинирани от тези и подобни думи, са с глобален обхват. Функцията, която се осигурява от локалните променливи в други езици, е осигурена от купчината от данни във Форт (въпреки че Форт също разполага с реални локални променливи). Стилът на програмиране на Форт използва много малко наименувани обекти от данни в сравнение с други езици; обикновено подобни обекти от данни се използват за съдържането на информация, която се използва от множество думи и обекти (в една многообектна имплементация).

Форт не налага последователност в употребата на обектите от данни; програмистът носи отговорност да използва подходящите оператори да взима и запазва стойност или да изпълнява други операции с информацията.

Програмиране
Думите, написани на Форт, се компилират в изпълним файл. Класическите реализации с "индиректни нишки" компилират списъци на адреси на думи, които да бъдат изпълнени последователно; много съвременни системи генерират реален машинен код (включително повиквания към някои външни думи и код за други, разширени в място). Някои системи притежават оптимизиращи компилатори. Най-общо казано, програма, написана на Форт, се записва като образ на паметта на компилираната програма с една единствена команда (например, RUN), който се изпълнява, когато компилираната версия е заредена.

По време на разработката, програмистът използва преводача в режим REPL за изпълнение и тестване на всеки малък детайл, докато се разработва. Поради това повечето програмисти на Форт препоръчват свободен дизайн отгоре-надолу, и разработка отдолу-нагоре с непрекъснато тестване и интеграция.

Дизайнът отгоре-надолу обикновено представлява разделяне на програмата в "речници", които след това се използват като комплекти от инструменти на високо равнище за написване на окончателната програма. Една добре проектирана Форт програма се чете като естествен език, и имплементира не само едно-единствено решение, но и инструменти за атакуване на свързани проблеми.

Примерът "Здравей, свят!"
В този пример на конзолен екран се извежда текстът „Здравей, свят!“:

Една възможна имплементация:

; HELLO &lt;cr&gt; Hello, world!

Думата  (Carriage Return) кара следващия изход да се изведе на нов ред. Думата, правеща разбор   (дот-цитат) чете двоен цитат от разграничена низ и добавя код към настоящото определение, така че обработеният низ ще бъдат показан по време на изпълнение. Интервалния писмен знак, делящ думата   от низа    не е включен като част от низа. Той е необходим, така че парсера разпознава  като Форт дума.

Една стандартна Форт система играе ролята и на преводач, и същия изход може да се получи, като въведете следния фрагмент от код в Форт конзолата:

CR .( Hello, world!)

(дот-скобата) е непосредствена дума, която прави разбор на низ, който е разграничен чрез скоби, и го показва на екрана. Както при думата    интервалният писмен знак    от     не е част от низа.

Думата    се използва преди текста за печат. По установена практика, Форт преводачът не изкарва изхода на нов ред. Друга установена практика е преводачът да изчаква входа в края на предишния ред, след   диалог. Не съществува имплицитно "флъш-буфер" действие в думата   на Форт, както е понякога в други езици за програмиране.

Смесване на състояния на компилиране и интерпретация
Ето дефиницията на думата , която при изпълнение издава единствената буква   :



Това определение е написано, за да използва ASCII стойността на    (81) директно. Текстът между скобите е коментар и се игнорира от компилатора. Думата    приема стойност от стека от данни и показва съответния символ.

Следващото предефиниране на    използва думите   (лява скоба),   (дясна скоба),   и , за да смени състоянието интерпретатора временно, да изчисли ASCII стойността на     символа, да се върне към състояние на компилация и да добави изчислената стойност към настоящата двуеточна дефиниця:



Думата за разбор    приема разделена чрез интервали дума като параметър и поставя стойността на първия й символ на стека от данни. Думата    е пряка версия на. Използвайки  , примерната дефиниция на     може да бъде пренаписана по следния начин:



Това определение използва    (обратна наклонена черта) за описване на коментара.

И двете    и     са предварително определени ANS Форт. Използвайки    и   ,     може да се дефинира по следния начин:



Пълна RC4 шифър програма
През 1987 г. Рон Ривест разработва RC4 шифър-системата за RSA Data Security, Inc. Кодът е изключително прост и може да бъде написан от повечето програмисти, следвайки описанието:

Имаме масив от 256 байта, от които всички са различни. Всеки път, когато масива се използва, той се променя, като размества два байта. Размените се контролират от броячи i и j, като всеки първоначално е 0. За да получите новия i, добавете 1. За да получите новия j, добавете байт масивa на новото i. Разменете байт масивите на i и j. Кодът е байт масив от сумата от байт масивите на i и j. После се използва метода на изключване с един байт от обикновения текст, за да се кодира, или от шифър текста за декриптиране. Масивът се инициализира като се прави да бъде равен на 0 до 255. След това се преминава през него, използвайки i и j, получавайки новото j, като се добавя към него байт масива на i и ключов байт, и разменяйки байтовете на масиви на i и j. Накрая, i и j се правят да бъдат равни на 0. Всички прибавяния са по модул от 256.

Следната стандартна Форт версия използва само основни и основни разширени думи.

0 value ii       0 value jj 0 value KeyAddr   0 value KeyLen create SArray  256 allot   \ state array of 256 bytes
 * KeyArray     KeyLen mod   KeyAddr ;


 * get_byte     + c@ ;
 * set_byte     + c! ;
 * as_byte      255 and ;
 * reset_ij     0 TO ii   0 TO jj ;
 * i_update     1 +   as_byte TO ii ;
 * j_update     ii SArray get_byte +   as_byte TO jj ;
 * swap_s_ij

jj SArray get_byte ii SArray get_byte jj SArray set_byte ii SArray set_byte


 * rc4_init ( KeyAddr KeyLen -- )

256 min TO KeyLen  TO KeyAddr 256 0 DO  i i SArray set_byte   LOOP reset_ij BEGIN ii KeyArray get_byte  jj +  j_update swap_s_ij ii 255 < WHILE ii i_update REPEAT reset_ij
 * rc4_byte
 * rc4_byte

ii i_update  jj j_update swap_s_ij ii SArray get_byte  jj SArray get_byte +   as_byte SArray get_byte  xor

Това е един от многото начини за тестване на кода: hex create AKey  61 c, 8A c, 63 c, D2 c, FB c,
 * test  cr   0 DO  rc4_byte . LOOP  cr ;

AKey 5 rc4_init 2C F9 4C EE DC 5 test   \ output should be: F1 38 29 C9 DE

Имплементации
Поради това, че виртуалната машина на Форт е лесна за имплементация и няма стандартна референтна имплементация, има множество реализации на езика. В допълнение към поддръжката на стандартните видове десктоп компютърни системи (POSIX, Microsoft Windows, bg:Mac OS X/Mac OS X), много от тези Форт системи също така са насочени към различни вградени системи. Изброени са някои от най-важните системи, които съответстват на 1994 ANS Forth стандарта.
 * Gforth - преносима ANS Forth имплементация от проекта GNU
 * SwiftForth - настолни и вградени Форт системи от Forth, Inc., инициаторите на езика;
 * VFX Forth - високооптимизиращ естествен Форт код
 * SP-Forth - портативно Форт изпълнение от Russian Forth Interest Group
 * Open Firmware - буутлоудър и BIOS стандарт, базиран на ANSI Forth