GO
F

O

R

T

H

AND
MULTIPLY

„Idźcie i mnóżcie...”

Mike Curtis wyjaśnia cechy języka, które czynią go wręcz idealnym dla mikrokomputerów


BASIC zrobił dla dla świat(k)a mikrokomputerów to, co Henry Ford dla motoryzacji, tzn. udostępnił je rzeszom użytkowników, oraz uczynił je znacznie prostszymi w obsłudze. Nadchodzi jednak taki moment w rozwoju każdego (ambitniejszego) użytkownika komputera, kiedy zaczyna on(a) czuć potrzebę poznania nowych języków programowania; i krok ten jest znacznie ułatwiony obecną dostępnością wszelakich kompilatorów i interpreterów, których kiedyś dla mikrokomputerów nie było: Pascal, Lisp, C, PL/I, APL, Forth, COBOL... tę listę można długo jeszcze ciągnąć.

Niektórzy z użytkowników sięgną raczej po kompilator języka oferującego bardziej wyszukane instrukcje sterujące i lepiej dla nich czytelny kod, jak np. Pascal czy COBOL — inni wyżej będą cenić prędkość oraz niskie zapotrzebowanie na zasoby języka maszynowego (assemblera). Stojąc na rozdrożu, prowadzącym do języków niskiego lub wysokiego poziomu, wielu z takich niezdecydowanych przeoczyło nieco mniej widoczną trzecią drogę, a mianowicie język Forth.

Opracowany w połowie lat 60-tych ub. w. głównie do tworzenia aplikacji sterujących oprzyrządowaniem, początkowo dostępny był wyłącznie na dużych komputerach (mainframe) oraz minikomputerach, i dostarczany wyłącznie przez firmę Forth, Inc. — założoną przez twórcę języka, Charlesa H. Moore'a, oraz jego ówczesnych współpracowników. Nazwa języka w zamyśle miała oznaczać czwartą (ang. fourth) generację języków programowania, ale ponieważ komputer trzeciej generacji IBM 1130 dopuszczał jedynie pięcioznakowe identyfikatory, skrócono nazwę właśnie do „Forth”.

Szybko rozchodzące się o tym wieści stały się katalizatorem powstania zainteresowanego językiem nieformalnego ruchu, który wyłonił się w efekcie działalności szeregu grup propagujących język poprzez tworzenie i dystrybucję między sobą systemów opartych na Forth-cie dla mikrokomputerów. Obecnie Forth bez kłopotu jest dostępny jako „gotowy produkt” dla wielu platform sprzętowych, i zapewne dołączy do czołówki najpopularniejszych języków programowania.

Jego atrakcyjność jako „trzeciej drogi” w tworzeniu mikrokomputerowych aplikacji polega na tym, że łączy on szybkość oraz ekonomię charakterystyczną raczej dla assemblera, z nowoczesną, modularną strukturą programu, która — raz już opanowana — pozwoli na znacznie szybsze tworzenie aplikacji, niż w wielu innych językach wysokiego poziomu, nie mówiąc już o kodzie maszynowym. Ceną tego jest kod źródłowy może nie aż tak łatwo czytelny (dla nowicjusza) jak ten programu napisanego w Pascalu, czy nawet w BASIC-u, i że wiele obiektów, zwykle uważanych za dostępne „domyślnie” (np. zmienne tekstowe, arraye, arytmetyka zmiennoprzecinkowa), nie jest obecnych do natychmiastowego wykorzystania (uwaga nie całkiem aktualna obecnie — przyp. tłum.), aczkolwiek mogą one być bardzo łatwo dodane w momencie nabrania biegłości w posługiwaniu się językiem. Jednakowoż w jaki sposób to się dokona, stanie się jasne dopiero po krótkim przedstawieniu unikalnej struktury Fortham która czyni go tak odmiennym językiem od sekwencyjnie wykonywanych języków jak BASIC czy Pascal, iż wymagać to będzie dość fundamentalnego „mentalnego przestawienia się”. W szczególności: zapomnijmy w tym momencie, co takiego właściwie stanowiło „program” w BASIC-u, czy podobnym języku.

„Serce” Fortha stanowi słownik ok. 100 podstawowych słów (w Forth-cie nie ma rozkazów, czy poleceń; są „słowa”; dlatego tutaj nie tyle „piszemy program”, co „tworzymy słownik” — przyp. tłum.) przechowywanych bezpośrednio w pamięci. Kilkadziesiąt z tych słów jest zwykle zdefiniowanych w kodzie maszynowym, natomiast pozostałe są zdefiniowane w ich kontekście (tzn. już bezpośrednio w Forthcie — przyp. tłum.), Słowa te mogą być rozmaicie nazwane, jak np. ALLOT, ECHO, czy po prostu +. Ten koncept — definiowania nowych słów na bazie poprzednich — ma pierwszoplanowe znaczenie dla języka, i (ale z grubsza tylko porównując) można byłoby to widzieć np. jako napisanie programu w Pascalu w postaci kaskady coraz głębiej zagnieżdżonych procedur. Główna czynność programisty w tym języku to budowanie własnego słownika, zawierającego słowa uruchamiające akcje, wymagane przez docelowo tworzoną w ten sposób aplikację. Raz utworzone, słowa takie zostają wkompilowane w obecny już w pamięci słownik, którego stają się częścią na równych prawach z uprzednio tam obecnymi słowami. Ich działanie może zostać wypróbowane natychmiast. Programista tworzy potem „słowa coraz wyższego poziomu” w kontekście tych wcześniej utworzonych — i tak dalej, i tak dalej — aż do chwili, kiedy jego program staje się... jednym słowem („najwyższego poziomu”). Po wpisaniu tego słowa (jako polecenia, np. z klawiatury) interpreter Fortha znajduje odpowiednią pozycję słownika, gdzie obecne są wskaźniki do innych słów (tych poprzednich), w kontekście których zostało ono zdefiniowane. Pozycje słownikowe tych z kolei zawierają wskaźniki do jeszcze wcześniejszych, które posłużyły do definicji — i tak to idzie dalej aż do poziomu zbioru tych najbardziej podstawowych słów (core), zdefiniowanych już bezpośrednio w kodzie maszynowym. Każde ze słów uruchamia określone akcje w kolejności jego odnalezienia, tak więc Forth nie jest ani interpreterem, ani też kompilatorem, w tradycyjnym rozumieniu tych określeń; on jest nimi oboma. W taki sposób Forth niejako wymusza tworzenie aplikacji metodą „od góry do dołu”, tj. właśnie ulubioną metodą zwolenników programowania strukturalnego. Kod źródłowy programu w Forth-cie składa się z serii definicji nowych i nowych słów (z których każde można niezależnie wykonać, tj. każde z nich może uruchomić określone akcje), prowadzących do finalnej aplikacji. Takie bloki kodu mogą być wczytywane z dysku czy taśmy razem z „jądrem” Fortha, ale w przypadku programów bardzo oszczędnie korzystających z pamięci (np. układy sterowania w przemyśle), wszystko co zbędne (włącznie z kompilatorem i nieużywanymi pozycjami słownika) może być usunięte, pozostawiając w taki sposób zupełnie minimalny system, akurat taki, jaki niezbędny jest do wykonania swej pracy; może on być potem przeniesiony np. do EPROM mikrokontrolera, i zajmować nawet mniej niż 1 kilobajt pamięci.

Cała uroda Fortha widoczna jest głównie w jego rozszerzalności — możemy to także określić jako „podatność”. Użytkownik sam rozbudowuje język w takim kierunku i zakresie, jaki jest mu akurat potrzebny do stworzenia określonej aplikacji. Mając napisany program jednocześnie poszerzamy swój prywatny słownik, którego słowa zapewne znajdą zastosowanie w następnych programach.

Forth to coś więcej, niż tylko kolejny język programowania: to system operacyjny (sic!), zawierający swój własny kompilator, interpreter, assembler, edytor tekstu, i nawet podstawowy system zarządzania plikami; krótko mówiąc: jest to kompletne środowisko do pisania, testowania tudzież używania oprogramowania. Oczywiście: BASIC oferuje zbliżone środowisko, chociaż nie tak kompletne, jednakowoż Forth ma znaczące nad nim przewagi.

Prędkość wykonywania programów napisanych w Forth-cie jest (typowo) ok. dziesięciokrotnie wyższa, niż ich BASIC-owych odpowiedników. Komputer 16-bitowy winien wykonywać program Fortha z prędkością zbliżoną do działania ekwiwalentnej aplikacji napisanej bezpośrednio w kodzie maszynowym, zaś 8-bitówka jedynie trochę wolniej. Co prawda, skompilowany BASIC dobrego producenta może być, w niektórych przypadkach, prawie równie szybki, wszelako zawsze można skorzystać z wbudowanego w Forth assemblera, i „krytyczne czasowo” słowa napisać bezpośrednio w języku maszynowym. Forth, i programy w nim pisane, nie wymagają dużej ilości pamięci operacyjnej, porównując do wymagań innych systemów; tak samo, jak w przypadku BASIC-a, Forth obecny jest cały czas w pamięci, ale dla większości systemów oznacza to zajętość poniżej 10 kilobajtów RAM (mowa o 8-bitówkach — przyp. tłum.), i to włącznie z obszarem na kompilowane programy. Nieco więcej RAM-u zajmą bufory niezbędne do operacji dyskowych (lub pseudo-dysk w przypadku systemu wyłącznie z taśmą jako pamięcią masową), co w dalszym ciągu oznacza, że dobrze opracowany system Forth zmieści się raptem w 16 KB pamięci RAM! Porównajmy to choćby z min. 48 KB, wymaganymi dla przyzwoitego kompilatora Pascal-a.

Natura tego języka sprawia, iż Forth jest modularny, interaktywny, i strukturalny; nie ma np. odpowiednika BASIC-owego polecenia GOTO, i właściwie to nawet nie bardzo dałoby się znaleźć zastosowanie dla niego w Forth-cie. Te właśnie cechy ułatwiają tworzenie programów niedużymi sekcjami, które następnie łatwo przetestować przed połączeniem ich w większe moduły. Dzięki temu czas tworzenia aplikacji zostaje znacząco zredukowany, jak również pozostawia to mniej okazji do popełnienia błędów. Z doświadczenia wiadomo, że typowo stworzenie programu w Forth-cie zajmuje co najwyżej połowę tego czasu, który byłby wymagany w przypadku BASIC-a.

Taką, można powiedzieć, ostateczną przewagą Fortha — przez wielu uważaną za najważniejszą — jest fakt, że Forth sam jest napisany w Forth-cie. Zwykle raptem „parę bajtów” pozostaje poza słownikiem, tak więc programy tworzone przez użytkownika, czy też słowa przez niego definiowane, traktowane są przez system dokładnie tak samo jak te, które znajdowały się w nim już wcześniej. Kiedy Forth szuka jakiegoś słowa, przeszukuje słownik od końca (tj. od najpóźniej zdefiniowanych słów), co daje m.in. wręcz możliwość zredefiniowania słów „systemowych”, czy dodania swoich własnych instrukcji sterujących. Widać zatem, że program w Forth-cie stanowi raczej rozszerzenie systemu o słowa, które uzupełniają go poleceniami czy usługami wymaganymi przez docelową aplikację.

Powyższe naprowadza nas jednak na coś, co niektórzy uznają za wadę języka: otóż bardzo łatwo jest nieuważnym działaniem spowodować „wysypkę” systemu, i jest to ceną za korzystanie z systemu dającego użytkownikowi nieograniczoną właściwie swobodę. Niektóre z bardziej wyszukanych systemów posiadają wbudowane pewne mechanizmy ochronne — i zawsze użytkownik może dodać swoje własne — jednak pewien stopień wrażliwości jest nieuchronną konsekwencją natury Fortha. Nie jest, co prawda, jakoś specjalnie trudno zniwelować skutki takiego „crashu”, wszelako niewygodne może być, gdy musimy w tym celu ponownie wczytać cały system, korzystając z wolnej pamięci masowej.

Inną wadą Fortha — ale to jedynie z punktu widzenia początkujących — może być korzystanie ze stosów oraz odwrotnej notacji polskiej. Jednak trudności tym spowodowane dla większości ludzi mają źródło raczej w ich uprzedzeniach; wprawdzie bez wątpienia język taki, jak BASIC, może być łatwiejszy do nauki dla nowicjusza, jednak każdy, kto „załapał” podstawowe zasady programowania, opanuje Fortha bez przesadnych trudności.

Stosy

Co to takiego te stosy? Najlepiej wyobrazić je sobie jako stertę jakichkolwiek obiektów czy przedmiotów; taką analogią mogą być np. talerze ułożone jeden na drugim. Obiekty takie możemy dodawać do stosu jedynie od góry — dokładając do już się w nim znajdujących — i podobnie: jedyny obiekt, który możemy bezpiecznie ze stosu zdjąć, to ten na samym wierzchu („najświeższy”), dodany jako ostatni. Takie obiekty, które umieszczamy na stosie Fortha, to — najogólniej mówiąc — liczby 16-bitowe (w systemach 8-bit i 16-bit — przyp. tłum.), a sam stos przedstawia sobą wygodne miejsce czasowego przechowania danych, gdyż użytkownik nie musi specjalnie zajmować się tym, gdzie „na chwilę” wrzucić dane, a jedynie zwracać uwagę na ich kolejność. Umieszczanie liczby na stosie to PUSHING, zaś zdejmowanie jej stamtąd to PULLING.

Część definicji słowa Fortha winien stanowić opis jego wpływu na zawartość stosu, np. + ( n1 n2 — sum ) oznacza, że słowo + pobierze dwie wartości ze stosu (przed jego użyciem muszą tam już być), z zapisu widzimy, że n2 jest na samym szczycie stosu (chociaż dla działania dodawania, z uwagi na przemienność, nie ma to oczywiście znaczenia), bo prawa strona oznacza „wierzch” — po prawej zaś stronie myślnika widzimy efekty zastosowania słowa, czyli że (w tym konkretnym przypadku) po pobraniu dwóch wartości ze stosu, zwróci ono tam jedną wartość, stanowiącą ich sumę.

Notacja postfix w naturalny sposób komponuje się z korzystaniem ze stosów; wymaga ona podania operatora po wpisaniu argumentów, dlatego napiszemy 2 3 + (zamiast 2 + 3, jak w tradycyjnej notacji infix), albo B C + A * zamiast A*(B+C). Zauważmy, jak ładnie jedno z drugim się łączy: najpierw argumenty trafiają na stos, a potem dopiero operator pobiera je stamtąd, i ew. zwraca na stos wynik(i). Tak więc notacja postfix odwzorowuje to, co rzeczywiście dzieje się w komputerze.

Może już czas poprzeć powyższe odrobiną samego Fortha; jeśli następującą sekwencję wpiszemy z klawiatury (mając uruchomiony interpreter Fortha, oczywiście): 4 5 <Enter>, Forth odpowie ok (jest to standardowa odpowiedź systemu Forth w sytuacji braku jakiegokolwiek błędu) w tym samym wierszu ekranu, i w rezultacie obie podane wartości znajdą się na stosie. Następnie wpisanie + <Enter> spowoduje pobranie ich, dodanie, oraz zwrotne wyprowadzenie na stos ich sumy. Aby pobrać tę sumę ze stosu (opróżniając go tym samym), użyjemy słowa . (tak, kropki), które wyprowadzi wartość sumy na ekran, a odbędzie się to np. tak:
. <Enter> 9 ok
A jeśli spróbujemy np. czegoś takiego:
HEX F 2 * . <Enter> 1E ok
...ujrzymy działanie przeprowadzone w systemie szesnatkowym — i dalej działania arytmetyczne w tym właśnie systemie będą przedstawiane, do czasu, aż wpiszemy słowo DECIMAL, przywracające w(y)prowadzanie wartości w systemie dziesiątkowym.
Niektóre ze słów służą wyłącznie do przeprowadzania manipulacji na stosie, np.
DUP ( n1 — n1 n1) duplikuje obiekt znajdujący się na szczycie stosu
SWAP ( n1 n2 — n2 n1) zamienia pozycjami dwa obiekty ze szczytu
OVER ( n1 n2 — n1 n2 n1) kopiuje drugi (licząc od „wierzchu”) obiekt na szczyt
ROT ( n1 n2 n3 — n2 n3 n1) przemieszcza trzeci obiekt na szczyt
DROP ( n1 —) usuwa obiekt ze szczytu

Słownik

Główna różnica między Forthem, a językiem w rodzaju BASIC-a, tkwi w korzystaniu ze słownika, oraz w kodzie nizanym pośrednio (ITC). Kod nizany bezpośrednio (DTC) oznacza, że na program składa się lista określonych, uprzednio przygotowanych procedur/funkcji, zaś nizany pośrednio stanowi „listę adresów do adresów” takich procedur. Zakładając, iż zestaw rzeczonych procedur/funkcji jest właściwie dobrany — tak, że każde zadanie programistyczne może zostać rozwiązane przy ich użyciu — obie metody dadzą w efekcie działające programy, ponieważ procedury te działają (z „punktu widzenia procesora”) jak instrukcje wysokiego poziomu, a same są przecież napisane w kodzie maszynowym. W taki sposób otrzymujemy coś jakby „mix” programu napisanego w języku wysokiego poziomu, ale zarazem działającego prawie z prędkością programu napisanego w kodzie maszynowym. Dodatkową zaletą w porównaniu z tradycyjnymi kompilatorami jest, że każda procedura, niezależnie od stopnia jej komplikacji, reprezentowana jest raptem przez dwa bajty jej adresu, tak więc mamy rzeczywiste obniżenie zajętości pamięci RAM komputera. Nie będziemy dalej zagłębiać się w przewagi ITC nad DTC — nie leży to w zakresie tematyki niniejszego artykułu — poprzestając na konstatacji, że ułatwia to traktowanie programów jako procedur zawierających inne procedury (i same też mogące być składnikami innych). Sam Forth pierwotnie był tworzony z użyciem kodu DTC, jednakowoż obecnie właściwie powszechnie stosuje się ITC (uwaga nie całkiem aktualna obecnie — przyp. tłum.).

Pozycja słownika Fortha zawiera następujące informacje:

Jako się rzekło: pisanie programu w Forth-cie wymaga dodawania nowych i nowych pozycji słownika w kontekście uprzednich — czyli tworzenia słów, których parametry są adresami innych słów, a które będą stanowić elementy owego właśnie tworzonego, nowego słowa. Są rozmaite sposoby definicji nowych słów, niewątpliwie najczęściej używaną jest „definiowanie dwukropkiem” (colon definition); słowo : zostało stworzone do sygnalizowania początku definicji, zaś ; na oznaczenie jej zakończenia. Przykładowo: aby zdefiniować słowo przeliczające stopnie Celsjusza na skalę Fahrenheita, należy dane wejściowe najpierw przemnożyć przez 9, potem podzielić przez 5, i na koniec dodać 32. Stworzymy zatem słowo DEGC=

: DEGC= 9 * 5 / 32 + . ." DEGF" ;

Zwróćmy uwagę na zastosowane odstępów w powyższej definicji; Forth wykorzystuje spację (pusty odstęp) jako ogranicznik, tak więc musi być chociaż pojedyńczy odstęp między sąsiadującymi w definicji słowami, aby system mógł je rozróżnić (a nie traktować jako jedno słowo o jeszcze innej nazwie). Również dlatego w nazwie słowa nie może być spacji (zostałoby uznane przez interpreter jako dwa osobne słowa). Słowo ." drukuje następujące za nim (i po odstępie!) znaki aż do znalezienia ogranicznika " (a to nie jest słowo, a jedynie ogranicznik tekstu; zatem przed nim nie musi być odstępu). Zauważmy także, że na stosie — przed wykorzystaniem nowego słowa — musi znajdować się jakaś wartość, bowiem słowo * wymaga obecności dwóch wartości na stosie. Po zdefiniowaniu słowo DEGC= znajduje się w słowniku — jako jego najświeższa pozycja — i można go użyć jak każdego innego słowa: albo do definicji kolejnego słowa, albo bezpośrednio, interaktywnie, na przykład tak:

10 DEGC= <Enter> 50 DEGF OK

(lub: 12 DEGC= <Enter> 53 DEGF OK)

...z czego od razu widzimy, że Forth stosuje arytmetykę liczb całkowitych (stałoprzecinkową). Nie ma standardowej metody postępowania z liczbami zmiennoprzecinkowymi (ta uwaga całkowicie nieaktualna w przypadku systemów opracowanych na komputery 16/32/64-bit — przyp. tłum.), aczkolwiek liczne procedury opublikowano w prasie fachowej. Wiele osób uważa to za dodatkową wadę Fortha, jednakowoż w praktyce większość programistów Fortha nie odczuwa tego jako istotnego ograniczenia; standardowo dostępne są słowa ułatwiające posługiwanie się arytmetyką stałoprzecinkową, czego przykładem może być choćby /MOD ( n1 n2 — reszta iloraz), które odkłada na stos zarówno iloraz, jak i resztę z dzielenia. Forth oferuje także słowa umożliwiające działanie na liczbach podwójnej precyzji, i one właśnie, wprawdzie kosztem niewielkiego, dodatkowego nakładu pracy, dają efekt w postaci szybszych i dokładniejszych obliczeń, niż w przypadku tych prowadzonych na liczbach zmiennoprzecinkowych (to dotyczyło 8-bitówek bez koprocesora numerycznego — przyp. tłum.).

Zmienne nie są tak masowo stosowane, jak to widzimy w przypadku innych języków, bowiem do czasowego przechowywania wartości używany jest stos. Każda potrzebna zmienna musi być zatem nowo utworzonym słowem, na przykład:

0 VARIABLE X <Enter> OK

...utworzy słowo X jako zmienną, której pole parametrów ma rozmiar jednej komórki (czyli dwóch bajtów w systemach 8-bit i 16-bit; uwaga: „komórka” w Forthcie, CELL, jest wielokrotnością tzw. „komórki pamięci” RAM, która zwykle mieści po prostu jeden bajt; są to dwa różne pojęcia — przyp. tłum.), i która może być użyta do przechowania dowolnej liczby całkowitej pojedyńczej precyzji. Kiedy słowo X zostaje zastosowane, pozostawia ono na stosie adres swego pola parametrów, i w ten sposób, znając ten adres, możemy zeń pobrać wartość przechowywaną przez zmienną, korzystając ze słowa @ (nazywamy je „pobierz”), albo zapisać pod tenże adres nową wartość, wykonując słowo ! (nazywamy je „wpisz”). Zatem X @ pozostawia na stosie wartość przechowywaną w zmiennej X, zaś X ! wpisze do zmiennej X (czyli do pola parametrów słowa X) wartość aktualnie znajdującą się na szczycie stosu (a jeśli stos był pusty — zostanie zgłoszony błąd).

Możliwe jest utworzenie zmiennych innych typów, ale zawsze na programiście spoczywa obowiązek zaalokowania stosownej ilości miejsca w przestrzeni przeznaczonej na słownik (korzystając ze słowa ALLOT), oraz do utworzenia słów udostępniających zawartość takich zmiennych. Weźmy jako przykład prostą tablicę jednowymiarową, zawierającą dziesięć liczb o rozmiarze jednej komórki (w sensie „komórki Fortha”), która może zostać utworzona tak:

0 VARIABLE ARRAY 18 ALLOT (18 bajtów + 2 bajty zaalokowane już słowem VARIABLE = 20 bajtów dla 10 liczb 16-bitowych).

Wprawdzie wykonanie słowa ARRAY również spowoduje odłożenie na stos adresu pola parametrów (tożsamego z adresem pierwszego elementy tablicy), ale słowo to możemy tak zredefiniować, aby mieć łatwy dostęp do wszystkich elementów tabeli:

: ARRAY 1 - 2 * (aby obliczyć offset bajtowy) ARRAY (korzystamy z uprzedniej definicji, aby pobrać adres bazowy) + ;

Tak więc po takiej zmianie, np. 3 ARRAY zostawi adres 3 elementu tablicy na stosie. Są także inne sposoby dokonania tego samego — przy jednej tylko definicji — korzystając z innych metod definicji nowej pozycji słownika, ale ta zademonstrowana jest chyba najłatwiejsza do zrozumienia.

Forth udostępnia dobrze nam znane instrukcje sterujące. Przykładami tych najczęściej używanych będą, na przykład:

Spójrzmy na poniższy przykład, ilustrujący zastosowanie słów IF oraz DO..LOOP, jak również sugerujący, jak rozbić program na osobne moduły. Przyjmijmy, że nasza tablica ma zawierać dziesięć stopni uzyskanych przez dziesięciu zdających egzamin, a wyniki mają być wyprowadzone jako ZDAŁ (min. 45% pozytywnych odpowiedzi) albo OBLAŁ. Zdefiniujmy sobie zatem najpierw słowo OCENA, które zbada liczbę znajdującą się na szczycie stosu, i odpowie stosownym komunikatem:

: OCEŃ 45 < ( pobiera dwie liczby ze szczytu stosu, i zwraca 1 gdy druga jest mniejsza, niż ta na samym szczycie — czyli 45 — w przeciwnym wypadku zwraca 0 )
IF ." OBLAŁ"
ELSE ." ZDAŁ"
ENDIF ;

Bez problemu możemy powyższe słowo teraz wypróbować, np.:

62 OCEŃ <Enter> ZDAŁ ok

...i możemy teraz to słowo wykorzystać w następnym:

: STOPNIE 11 1 ( indeks pętli DO LOOP, powtórzonej 10 razy, bowiem 11 jest wartością, przy której już ponowne wejście nie nastąpi)
DO
I ARRAY @ ( I odkłada aktualną wartość indeksu na stos)
DUP . ( aby wyprowadzić tę wartość na ekran ) 5 SPACES
OCEŃ CR ( ocena, a CR po to, by przejść do następnego wiersza ekranu )
LOOP ;

Podsumowując: Forth nie jest wprawdzie językiem przeznaczonym dla „kompletnie zielonych” w technice mikrokomputerowej, ale posiada tyle przewag nad BASIC-em i podobnymi językami, że jest godną uwagi alternatywą dla poważnie zainteresowanych programowaniem. Swobodnie dostępne są implementacje tego języka dla wszystkich najpopularniejszych mikrokomputerów.

Znakomitym podręcznikiem dla początkujących, który nie tylko przedstawi wszystko, co należy wiedzieć o Forth-cie, ale i ułatwi zrozumienie podstawowych zasad działania mikrokomputerów, jest „Starting Forth” autorstwa Leo Brodiego.


Artykuł „Go Forth and multiply” z Personal Computer World z grudnia 1981, str. 126 — tłumaczenie © 2015 Zbigniew Baniewski
(wszystkie przykłady programistyczne w dialekcie figForth)