Forth (чете се „форт“) е императивна стеково базирана среда за програмиране, създадена от Чарлз „Чък“ Мур. Характеризира се със структурно програмиране, рефлексия (способността да се модифицира структурата на програмата по време на изпълнението ѝ), свързано програмиране (функциите са подредени една до друга) и гъвкавост (програмистът може да създава нови команди). Въпреки че не е акроним, името на езика понякога се изписва с главни букви „FORTH“, следвайки обичайната практика от по-ранните години.
Като процедурно програмен език без Типизация на данните, Форт се характеризира с интерактивно изпълнение на команди (което го прави подходящ като команден интерпретатор за системи без операционна система) и със способност да компилира последователност от команди за по-късно изпълнение. Някои Форт имплементации (обикновено първите версии или написаните изключително като портативни) компилират нишков код, но много имплементации генерират оптимизиран машинен език подобно на други езикови компилатори.
Форт се използва за Open Firmware (стандарт на фърмуер) за първоначално зареждане на ОС в космически приложения, като космическия апарат Филе и при различни видове хардуерни системи. Най-продаваната за 1986 игра Starflight, работеща под DOS, създадена от Електроник Артс, е написана на Форт.
Преглед Средата за разработка на Форт съчетава компилатора с интерактивен потребителски интерфейс, където потребителят определя и изпълнява подпрограми, наречени думи. Думите могат да бъдат тествани, предефинирани, и отстраняването на грешките може да се осъществи без прекомпилиране или рестартиране на цялата програма. Всички синтактични елементи, включително променливи и основни оператори са дефинирани като думи. Форт средите се различават по това как се съхранява получената програма, но в идеалния случай изпълнението на програмата има същия резултат, както ръчно да въведеш изходния код.
Стекове Повечето среди за разработка с рекурсивни подпрограми използват „стек“ за контрол на потока, който съхранява локални променливи, включително и параметри на подпрограмата (в системи с извикване по стойност (Call by value), като например C). Форт често няма локални променливи, нито такива извиквани по стойност. Вместо това междинните стойности се съхраняват във втори „стек“. Думите оперират с най-горните стойности в първия стек, който поради това може да се нарече „стек“ от параметри или „данни“, но по-често се нарича просто „стек“. Вторият стек се нарича „linkage“ or „return“ „стек“, с абревиатура „rstack“. Ядрото на ОС се грижи за манипулирането на стека, като позволява той да се използван за временно съхранение в рамките на думата, но освен в тези случаи той не може да се използва за подаване на параметри или манипулиране на данни.
Повечето команди са специфицирани по начина си на въздействие върху „стека“. Обикновено параметрите са разположени на върха на „стека“, преди командата да се изпълни. След изпълнението параметрите се изтриват и заменят от връщаните стойности. За аритметичните оператори се следва правилото на обратната полска нотация. Вижте по-долу примери за използването на „стек“.
Поддръжка Форт е прост, но допускаш разширение език. Неговата модулност и разширяемост позволява писането на програми от високо ниво като CAD системи. Форт е бил използван успешно в създаването на големи, сложни проекти. Разработените приложения са доказали в продължение на десетилетия, че са лесни за поддръжка в еволюиращи хардуерни платформи. Forth has a niche both in astronomical and space applications. Форт се използва в астрономически и космически приложения. Днес Форт все още се употребява в много вградени системи заради преносимостта му, ефективното използване на паметта, краткото време за развитие, както и бързата скорост на изпълнение.
Вграден е успешно в модерни RISC процесори, а също така са произведени процесори, които използват Форт като машинен език.
Други приложения на Форт включват: boot ROM, използван от Apple Inc., Sun и OLPC XO-1, FICL – първият етап на BTX (boot_loader) на операционната система FreeBSD.
История Форт еволюира от лична система за програмиране на Чарлз Мур, като се е развивала непрекъснато от 1968 г.
За първи път Форт е предоставен на други програмисти през 1970 г., започвайки с Елизабет Радър от Националната радио астрономическа обсерватория на САЩ. След работата си в NRAO, Чарлз Мур и Елизабет Радър създават компанията FORTH през 1973 г., усъвършенстват и пренасят Форт системи за десетки други платформи през следващото десетилетие.
Forth е наречен така през 1968 г. по името на обяснителния файл – FOURTH. Тъй като IBM_1130 позволява имена на файлове само до 5 знака е модифицирано на „Forth“. Мур вижда Форт като наследник на трето поколение езици за програмиране, или като софтуер за хардуер „четвърто поколение“.
Тъй като Чарлз Мур често е сменял своята работа през кариерата си, ранният натиск върху развиването на програмния език е бил върху това да се улесни пренасянето му на различни компютърни архитектури. Системата Форт често се е използвала за въвеждане на нов хардуер. Например Форт е първият резидентен софтуер на новия чип Intel 8086 през 1978 г. и MacFORTH е първата развита система за първия Macintosh на Apple през 1984 г.
MicroFORTH е разработена за микропроцесорите Intel 8080, Motorola 6800 и Zilog Z80, които започват да се произвеждат през 1976 г. MicroFORTH по-късно се използва от любители да произвеждат Форт системи за други архитектури, като 6502 през 1978 г. Широкото разпространение на езика води до неговата стандартизация. Общото приложение е стандартизирано в стандартите Форт-79 and FORTH-83 и Форт-83, съответно през годините 1979 г. и 1983 г. Тези стандарти са обединени от ANSI през 1994 г., обяснени в ANS Форт.
Форт става много популярен през 1980 г., тъй като е подходящ за малките микрокомпютри по онова време, поради своята компактност и преносимост. Понр един домашен компютър, британската Юпитер ACE, е имал заложен Форт в ROM операционната си система, използвал също Форт за своя система за програмиране. Rockwell, също произвеждат едночипови микрокомпютри с Форт ядра, на R65F11 и R65F12. Пълното „родословно“дърво е в Технически университет – Виена. Insoft Garforth е версия на Форт с графични разширения. А ASYST е Форт разширение за измерване и контролиране на персонални компютри.GraFORTH II Language Reference (PDF) ASYST was a Forth expansion for measuring and controlling on PCs.Campbell et al, „Up and Running with Asyst 2.0“, MacMillan Software Co., 1987
Перспектива на програмиста Форт силно разчита на изрично ползване на „стек“ данни и на обратна полска нотация (RPN или постфиксната нотация), често се използва в калкулатори отHewlett-Packard. В RPN операторът се намира след неговите операнди, за разлика от общо използваната инфискна нотация, където операторът се намира между неговите операнди. Postfix нотация прави езика по-лесен за разбор и разширяване. Гъвкавостта на Форт прави статичната БНФ граматика неуместна, и не разполага с монолитен компилатор. Разширяването на компилатора изисква само написването на нова дума, вместо модифициране на граматиката и промяна на основната имплементация.
Използването на RPN, може да намери резултата на математическия израз (25 * 10 + 50) по този начин: 25 10 * 50 + CR . 300 ok
Този команден ред първо слага 10 и 25 в скрития стек,
а думата *умножава двете числа на върха на стека и ги заменя с тяхното произведение.
След, което числото 50 е сложено в стека.
Думата +го добавя към произведението. CR премества резултата на нов ред (това е от гледна точка на форматирането и може да бъде пропуснато но – при повечето имплементации без тази дума ще изкарат резултата на един и същи ред с входните данни, поради което ще се наруши четимостта). Накрая командата . отпечатва резултата на потребителския терминал. След, което ако всичко е преминало успешно, текстовия редактор изписва „Ок“ и минава на нов ред, за да вземе още входна информация, без да е нужно изрично да му се дава команда за това.Дори структурните характеристики на Форт са стеково базирани. Например: : FLOOR5 (n -- n') DUP 6 < IF DROP 5 ELSE 1 – THEN ; Този код дефинира нова дума наречена FLOOR5 използваща следните команди: DUP копира числото в стека; 6 слага 6 в началото на стека; < сравнява първите две числа в стека (6 и копирания вход), и ги заменя с булева стойност „вярно“ или „не вярно“; IF взима тази булева стойност и избира да изпълни командата веднага или да премине към ELSE; DROP игнорира стойността на стека. След, което THEN приключва условието. Текстът в кавичките е коментар, който те подсеща, че тази дума очаква число в стека и ще върне вероятно променено число. Думата FLOOR5 е равностойна на същата функция написана на програмния език „C“ използващ тернарен оператор:int floor5(int v) { return (v < 6) ? 5 : (v – 1); }Тази функция е написана по сбито по следния начин : FLOOR5 (n -- n') 1 – 5 MAX ; Можете да изпълните тази думата така: 1 FLOOR5 CR . 5 ok 8 FLOOR5 CR . 7 ok Първо интерпретатора слага число (1 или 8) в стека, след което вика думата FLOOR5, която изкарва резултата. CR мести изходните данни на нов ред. Накрая „.“ извиква резултата и го принтира на потребителския терминал.
Възможности Форт няма категорична формална граматика. Интерпретаторът чете ред от потребителското входно устройство, след което се прави разбор на реда, използвайки шпацията като разграничител, като някои системи разпознават допълнителните празни символи. Когато интерпретаторът отдели една дума, той я проверява в речника. Ако намери думата, интерпретаторът изпълнява кода асоцииран с думата, след което се връща да прави разбора на останалата част от входния поток. Ако не намери думата, приема че е число и прави опит да я превърне в число, като я избутва в стека; ако действието е успешно, интерпретаторът продължава разбора на входния поток. В противен случай, ако проверката и опита за превръщането и в число се провали, интерпретаторът отпечатва думата последвана от съобщение за грешка, което показва, че не разпознава думата, премахва я от входния поток и чака за ново въвеждане от потребителя.
Дефинирането на нова дума дума започва със символа : (двоеточие) и завършва с ; (точка и запетая). Например, : X DUP 1+ . . ; ще компилира думата X, и ще направи името откриваемо в речника. Когато операцията се изпълни след като се въведе 10 X, в конзолата ще се отпечата 11 10.
Повечето Форт системи включват асемблер, който позволява да се определят точно думите, щадейки ресурсите на процесора. Обикновено асемблерът ги складира в отделно именно пространство (wordlist), тъй като се ползват рядко от потребителите. Асемблерите на Форт също могат да използват обратен полски запис.
Типичния асемблер подготвя операнди в стека като накрая помага копирането на цялата команда в паметта. Асемблерът на Форт в същността си е макро асемблер, така че е лесно да се определят псевдоними на регистри в зависимост от тяхната роля в системата на Форт: например „Datastackpointer“ използван като стек указател (променлива, съдържаща адрес в паметта) за регистъра.
ОС, файлове, едновременно изпълнение Повечето Форт системи работят под хост операционни системи като Microsoft Windows, Linux или версия на Unix, като за източник на файлове с данни използва системните файлове на съответната хост операционна система; стандартът на Форт ANSI описва използваните входящи и изходящи компютърни думи. Всичко модерни Форт системи използват нормални текстови файлове за източник, дори ако те са вградени. Вградената система с резидентен компилатор взима своя източник чрез серийна линия.