Forth
Z Wikipedii
Forth jest językiem programowania wysokiego poziomu, lecz równocześnie należy do kategorii języków tzw. bliskich sprzętowi, czasem (potocznie) używa się określenia asemblerowy język programowania wysokiego poziomu.
Spis treści |
[edytuj] Charakterystyka języka Forth
Do cech charakterystycznych tego języka należą:
- natychmiastowa interpretacja wprowadzonych słów,
- natychmiastowa kompilacja definicji nowych słów,
- wykonywanie operacji za pośrednictwem stosu,
- zapis wyrażeń arytmetycznych w odwrotnej notacji polskiej.
Specyfika języka sprawia, że jest to język dla specjalistów, głównie z dziedziny automatyki. Jego główne zastosowania to systemy czasu rzeczywistego i sterowanie urządzeniami.
Twórcą języka jest Amerykanin Charles H. Moore, który stworzył pod koniec lat 60. pierwszą jego implementację.
Program napisany w języku Forth składa się z sekwencji słów rozdzielonych separatorami (jeden ze znaków: spacja, znak o kodzie zero #0, powrót karetki #13). Słowa pamiętane są w słowniku, w którym można tworzyć podsłowniki i dowolnie je rozszerzać (aż do granic możliwości systemu komputerowego). Nowo definiowane słowa są natychmiast kompilowane i gotowe do użycia.
Specyfika tego języka prowadzi do programowania od dołu do góry (od szczegółu do ogółu).
[edytuj] Historia
Stworzenie Fortu (Forth) jak mowy i środy programowania było stopniowym. Dla jego «krystalizacji» знадобилося ponad dziesięć lat. Właśnie tyle знадобилося Charlesowi (Czaku) H. Muru, żeby z zdekompletowanych osobistych idei dobrać najlepsze i pokłaść ich na noty wyjściowego kodu.
Jak właśnie to odbywało się napisano na Internetwęźle stworzonej samym Murom firmy - http://forth.com :
«Kariera Mura, jak programisty zaczęła się w końcu 50-х lat XX wieku w Smitsonows'kij Astrofizycznego Obserwatorium z programami rozliczenia ефемерид, orbitalnych elementów, pozycji kosmicznych sztucznych sputników, i tym podobnie Wyjściowy kod tych programów wypełniał dwie lady перфокарт. Żeby minimalizować perekompilację tych dużych programów, on doskonalił prostego interpretatora, który by czytał mapy, które kierowały programem. To nadało jemu możliwość komponować różne równania dla kilku sputników bez perekompilację. Ten interpretator zawierał kilka rozkazów i pojęć (koncepcji), które zachowały się we współczesnym Forcie: przeważnie rozkazy czytania „słów“, rozdzielonych lukami, przekształcenia liczb z zewnętrznego przedstawienia do wewnętrznego i konstrukcja „IF . ELSE“. On zrozumiał, że wprowadzenie programów w wolnej formie, jak efektywny (mniejszy i szybszy kod), tak i pewniej, aniżeli ogólna praktyka Fortranu - formatują w specyficznych kolumienkach, które przyprowadzały do licznych ponownych przejści kompilatora zza niewierny wyrównanych kolumienek.
W 1961, Mur otrzymał licencjata z Fizyki w MIT i wstępował do szkoły dyplomowanych fachowców Stenfordu. On również zajął część maszynowego czasu w Stendfords'kom Liniowym Akceleratorze (SLAC), przepisawszy kod, dla optymalizacji zarządu pęczkiem dwamilowego elektronowego akceleratora, wykorzystując dla rozszerzenia programów części z jego poprzedniej pracy z metodą najmniejszych kwadratów. Kluczową częścią tej pracy był program pod nazwą CURVE, zaprogramowana w Algolu (1964). Dla zarządu tym programem, Mur wykorzystywał rozszerzoną wersję swojego interpretatorowi, która kierowała стеком (стосом) dla przekazania parametrów, zmiennych (z przydatnością jawnie wybrać i popamiętać znaczenie), arytmetyki i operatorów porównania, i możliwością wyznaczyć i interpretować procedury.
W 1965, Mur przejechał do nowemu Jorkowi, żeby pracować wolnym programistą. Pracując z Fortran, Algol, Jovial, PL/I i różnymi asemblerami, on przedłużał wykorzystywać swojego interpretatora coraz częściej. Dla minikomputerów i terminali dalekopisów tych, że pojawiły się w końcu 60-х, Mur dodał operatorzy zarządu I/O symboli. Jeden z projektów włączał translator Fortran-Algol i утиліти redagowania plików. To obwarowywało jego pewność u znaczności użycia luki jak rozmeżuwacza słów.
W 1968 przed chwilą żonaty Mur, dołączył się do Mohasco Industries in Amsterdam NY. Tu on rozwijał programy komputerowej grafiki dla IBM 1130 z 2250 graficznym wyświetlaczem. Ten komputer miał 16-wyładowczy CP, 8K operatywnej pamięci, pierwszy dysk, klawiaturę, drukarkę, кард-рідер (co wykorzystał się jak rezerwowa kopia dysku!) i kompilator Fortranu. On dodał kross-assembler do swojego programu, żeby generować kod 2250, a także prymitywny redaktor z instrumentami zarządu pierwotnym kodem. Ten system mógł rysować dynamiczne 3-D wizerunki, za jedno przejście, podczas gdy oprogramowanie IBM dla tej konfiguracji mogło wyrysowywać tylko statyczne 2-D wizerunki. Dla zabawy, on również zapisał wczesną wersję Spacewar i przepisał program Algol Chess nową mową, teraz (po raz pierwszy) nazwanemu FORTH. On był porażony tym, na ile wszystko stale prościej.
Imię FORTH jest zamierzone jak nazwa oprogramowania dla komputerów czwartego (FOURTH) pokolenia, które Mur widział takim, że charakteryzuje się rozprowadzonymi malutkimi komputerami. Operacyjny system, który on wykorzystywał wtenczas, miał ograniczenie na imiona plika do pięciu символів, - tak „U“ był odrzucony. FORTH był zapisany po literach w górnym registrze, w związku rozpowszechnionej upper-case пристроїв вводу-виводу do końca 70-х. Użycie „Forth“ stało się ogólnie przyjętym, kiedy stał się szeroko dostępnym dolny register, ponieważ słowo nie było акронімом.
Mur stworzył Forth-bazovane, poszerzane, środowisko programowania dla IBM 1130 2250 które przewyższało środowisko na Fortranie. To dodanie rozkazów cyklowi, koncepcja przechowywania początkowych danych w 1024-bajtowych blokach i instrumentach dla zarządu nimi.
Najważniejszym, był teraz słownik. Procedury teraz miały imiona, i interpretatora odprowadzało poszukiwanie z użyciem skorowidzy imion dla zgodności. Imiona kompilowały z licznikiem i trzema symbolami, praktyka, wzięta w kompilatorze Stenfordu i która przeważała w Forth do końca 1980-х. W granicach wejścia słownika było „kodowe pole“, że zawierało adres kodu, który wykonywał się dla tej підпрограми. To było realizacją niebezpośredniego szytego kodu, który było wykorzystano za pięć lat do publikacji D'juara o niebezpośrednie kodowanie która pojawiła się u Communications of the ACM [Dewar 1975]. Użycie niebezpośredniego szytego kodu było ważną innowacją, ponieważ niebezpośrednie przejście było jedynym w górze jak tylko słowo było znalezione. Słownikowe artykuły (słowa) słownika mogły wskazywać albo na inne procedury „wysokiego poziomu“ albo na instrukcji w maszynowych rozkazach.
Nareszcie, po to, żeby zapewnić prosty mechanizm dla wkładania підпрограм, było dodano drugi стек (стос) - „Stos nawrotów“. Korzyść od obecności stosu, że rezerwuje się dla adresów nawrotu, była ta, że inny stos mógł wykorzystywać się wolno dla przekazania parametrów, bez konieczności „balansowania“ do i po wezwań. W 1970 Mohasco przeznaczyły Mura na ambicjonalny projekt, z dołączaniem nowego Univac 1108, który opracowywał sieć dzierżawią linii, systemu wprowadzenia zamówień. On przeniósł Forth na Univac 1108, i zorganizował związek z modułami Cobolu, zgodnie tablicy imion urządzeń dla dialogowej obróbki zapytań. Na Univac 1108 Forth był przepisany na asemblerze. Ta wersja Forth miała dodatkowe mechanizmy dla wyznaczenia i zarządu zadaniami, a także efektywnym schematem zarządu buforami bloków dysku, podobną do schematów że wykorzystują się dotąd. Na żal, ekonomiczny spadek zmusił Mohasco zakryć projekt na krótko przed jego zakończeniem.»
(Tłumaczenie dokonano http://forth.org.ua)
[edytuj] Interpreter i kompilator
W trakcie swojego działania interpreter języka może znajdować się w jednym ze stanów:
- definiowania,
- wykonywania.
Jeżeli system języka Forth znajduje się w stanie wykonywania, wprowadzane słowa są natychmiast interpretowane i wykonywane. Wśród słów języka Forth znajdują się słowa, tzw. kompilatory (w nomenklaturze języka Forth), standardowe (np. ":", "CONSTANT") lub zdefiniowane przez programistę, które powodują przejście systemu w stan definiowana. W tym stanie kolejne słowa są traktowane jako część definicji nowego – właśnie definiowanego – słowa, aż do napotkania słowa kończącego definicję (standardowo ";"). Taka definicja podlega kompilacji, a nowo zdefiniowane słowo umieszczone zostaje w słowniku.
[edytuj] Słowa
Słowa języka mogą należeć do kategorii:
- operatorów biernych,
- operatorów czynnych (które wykonywane są także wtedy, gdy interpreter znajduje się w stanie definiowania, chyba że programista użyje słowa, które spowoduje umieszczenie w polu nowej definicji adresu tego operatora zamiast jego wykonanie).
[edytuj] Kompilatory
[edytuj] Pojęcie kompilatora w Forth
Kompilatorem (w nomenklaturze języka Forth), nazywa się słowo, które powoduje przejście systemu Forth w stan definiowania, zinterpretowanie najbliższego słowa jako nazwy nowego operatora (słowa języka Forth) i w konsekwencji skompilowanie kolejnych słów zawartych w aktualnie przetwarzanej definicji według zadanych (zawartych w definicji kompilatora ) instrukcji oraz umieszczenie nowego słowa w słowniku (ewentualnie w podsłowniku).
W język Forth wbudowane są standardowe kompilatory , takie między innymi jak: ":" – podstawowy kompilator operatorów, "CONSTANT" – definiowanie stałych i inne. Programista ma także możliwość definiowania własnych kompilatorów .
(POTEGA 3; a -- b) : POW DUP DUP * * ; 5 POW
Zdefiniowano operator bierny POW – podniesienie do 3 potęgi, który zostaje skompilowany i umieszczony w słowniku. Po tej operacji może być używany tak jak słowa standardowe. Umieszczenie na stosie liczby 5 (w stanie wykonywania) i wykonanie operatora POW powoduje umieszczenie na stosie wyniku operacji (5*5*5).
[edytuj] Kompilatory standardowe
Język Forth posiada zdefiniowane kompilatory standardowe:
- CONSTANT nazwa (a -- ) : definicja operatora (słowa o właściwościach stałej) o nazwie jak najbliższe słowo wejściowe nazwa i wartości a pobranej ze stosu
- VARIABLE nazwa (a -- ) : definicja operatora (słowa o właściwościach zmiennej) o nazwie jak najbliższe słowo wejściowe nazwa i wartości a pobranej ze stosu; wykonanie operatora powoduje umieszczenie adresu danej na stosie
- : nazwa słowa_definiujące ; ( -- ) : utworzenie operatorów, które można przez analogię porównać do podprogramu w językach programowania ogólnego przeznaczenia
- USER : podstawowy kopilator niskopoziomowy, wiele słów standarodwych jest utworzonych za pomocą tego kompilatora
- VOCABLUARY : utowrzenie słownika.
[edytuj] Definiowanie kompilatorów
Definicja nowego kompilatora ma postać:
: nazwa
<BUILDS
słowa kompilujące
DOES>
słowa wykonawcze
;
[edytuj] Instrukcje strukturalne
[edytuj] Wprowadzenie
Język Forth posiada, jak większość języków programowania wysokiego poziomu, zestaw standardowych instrukcji strukturalnych umożliwiających programowanie złożonych problemów i algorytmów. Jednak znamienną cechą języka Forth jest jego rozszerzalność przejawiająca się między innymi możliwością definiowania własnych, nowych instrukcji strukturalnych.
[edytuj] Standardowe instrukcje strukturalne
warunek IF instrukcje wykonywane gdy warunek spełniony [ELSE instrukcje wykonywane gdy warunek nie spełniony] THEN | ENDIF
przy czym warunek jest po prostu ciągiem instrukcji języka Forth, a operator IF bada czy na stosie jest wartość różna od zera:
-
- jeżeli tak to wykonywane są instrukcje wykonywane gdy warunek spełniony,
- jeżeli nie to wykonywane są instrukcje wykonywane gdy warunek nie spełniony lub instrukcje po słowie THEN (lub ENDIF co jest równoważne) jeżeli fraza ELSE została pominięta.
: SELECT KEY 10 =
IF
+
ELSE
*
THEN ;
2 3 SELECT
przed_DO
DO
instrukcje
LOOP | +LOOP
po_LOOP
Operator DO ustala (na podstawie wartości ze stosu) dwa parametry iteracji: ograniczenie – warunek zakończenia, oraz wartość początkową. Dla słowa LOOP krok wynosi +1, dla +LOOP wartość kroku pobierana jest ze stosu, przy czym może to być wartość ujemna. Cykl wykonywany jest co najmniej jednokrotnie, gdyż sprawdzenie warunku wykonywane jest na końcu. Operator I udostępnia wartość zmiennej sterującej cyklem.
: CIAG
10 2 DO
I . 2
+LOOP ;
(wyprowadzenie liczb 2 4 6 8)
- instrukcja repetycyjna
BEGIN przed_WHILE WHILE po_WHILE REPEAT
Po wykonaniu przed_WHILE operator WHILE sprawdza wartość na stosie, jeżeli jest to zero to kończy instrukcję REPEAT, jeżeli nie to wykonywane jest po_WHILE a operator REPEAT powoduje skok do BEGIN i powtórzenie cyklu.
: WAINT_SP
BEGIN
KEY 32 = 0= WHILE
REPEAT
BEGIN instrukcje AGAIN
[edytuj] Definiowanie własnych instrukcji strukturalnych
Język ten umożliwia definiowanie własnych instrukcji strukturalnych przy pomocy operatorów skoków warunkowych i bezwarunkowych 0BRANCH i BRANCH.
[edytuj] Stosy w systemie języka Forth
System języka Forth posługuje się dwoma stosami:
- stosem parametrów,
- stosem powrotów.
[edytuj] Stos parametrów
Stos parametrów jest to podstawowy element systemu, również dla użytkownika, na którym wykonywane są operacje. Służy przede wszystkim do przekazywania argumentów operacji i przekazywania wyników operacji (podprogramów).
[edytuj] Stos powrotów
Stos powrotów w zasadzie pełni rolę stosu systemowego. Lista operacji podstawowych na stosie powrotów jest dość ograniczona. Do najważniejszych z nich należą:
- >R (a -- ) : przeniesienie danej słowowej a ze stosu parametrów na stos powrotów,
- R> ( -- a) : umieszczenie danej słowowej a na stosie parametrów ze stosu powrotów,
- R ( -- a) : skopiowanie danej słowowej a na stosie parametrów ze stosu powrotów,
- RP! ( -- ) : usunięcie wszystkich danych ze stosu powrotów,
- RP@ ( -- a) : umieszczenie na stosie parametrów adresu szczytu stosu powrotów,
- R0 ( -- a) : umieszczenie na stosie parametrów adresu pustego stosu powrotów (początku).
Jak widać są to głównie operacje sterujące, służące następującym celom (dla których przeznaczony jest stos powrotów) :
- przechowywanie śladów wzajemnych wywołań operatorów (podprogramów),
- przechowywanie parametrów instrukcji strukturalnych,
- pomocniczy stos roboczy dla danych,
- chwilowa pamięć podręczna dla użytkownika (programisty),
- inne.
System języka Forth automatycznie wykorzystuje stos powrotów do przechowywania licznika interpretera IP sterującego wywoływaniem kolejnych słów (jako podprogramów).
[edytuj] Słownik
Słownik w języku Forth skupia w sobie wszystkich zdefiniowane i dostępne do użycia słowa. Jest on strukturą drzewiastą, podzieloną na podsłowniki, które mogą być podzielone na kolejne podsłowniki, przy czym główny słownik nosi nazwę FORTH i skupia podstawowe operacje w tym zdefiniowane w kodzie maszynowym. Dodatkowo zwykle definiowane są także:
- EDITOR : słowa dotyczące edytora,
- ASSEMBLER : umożliwiający programowanie hybrydowe.
Zawsze jeden słownik jest słownikiem bieżącym, od którego rozpoczyna się poszukiwanie definicji słowa. Bezpośrednio po uruchomieniu bieżącym jest słownik FORTH. Operacje słownikowe:
- VOCABULARY nazwa IMMEDIATE : zdefiniowanie nowego słownika (w bieżącym słowniku definiowania),
- nazwa: ustalenie bieżącego słownika,
- CONTEXT : zmienna przechowująca odniesienie do bieżącego słownika,
- nazwa DEFINITIONS : zmiana słownika definiowania,
- CURRENT : zawiera odniesienie do bieżącego słownika definiowania.
Należy zauważyć, że przy takiej organizacji można definiować wielokrotnie to samo słowo w różnych słownikach w różny sposób, a to, która definicja zostanie użyta, zdeterminowane będzie kolejnością przeszukiwania słowników. Można to uznać za rodzaj przeciążania nazw.
[edytuj] Bibliografia
- Jan Ruszczyc, Poznajemy FORTH, SOETO Warszawa 1987 r., Seria: Informatyka mikrokomputerowa
- Jan Bielecki, Język FORTH, Wydawnictwa Naukowo-Techniczne, Warszawa 1988, Seria: Mikrokomputery, ISBN 83-204-0930-6
[edytuj] WEB-Adresy
- Strona-kolekcja zesłań na resursy po Fort mowie
- Strona internetowa rosyjskojęzycznych użytkowników mowy Forth
- Strona internetowa Ukraińskiego społeczeństwa mowy Forth
- Zesłania na fort-zasoby
- Web Ring Fortu
- Aktywne Forum po mowie Fort na winglion
- Forum po mowie Fort na Airbase
- Fith - The Alien Language With A LIFO Grammar
- American National Standard for Information Systems Programming Languages Forth Secretariat Computer and Business Equipment Manufacturers Association{ref-en}
- Rosyjskie tłumaczenie standardu ANS FORTH 94 (dokonany Sergiuszem Kadocznykowym, w tym tłumaczeniu są znane kilku błędów, na przykład w opisie słowa SEARCH)
- forth.ru
- opis w wapedia.mobi
[edytuj] Zobacz też
wieloparadygmatowe: Ada • C++ • Common Lisp • D • Fortran • Icon • JavaScript • Nemerle • Perl • Python • Ruby • Snobol
proceduralne i strukturalne: AWK • C • COBOL • Forth • Modula-2 • Oberon • Pascal • PL/SQL • Rey • REXX • Lib Sh
obiektowe: C# • Eiffel • Java • Object Pascal • Objective-C • PHP • Smalltalk
funkcyjne: Erlang • F# • Haskell • Lisp • ML • Ocaml • Scheme
inne: ABAP • Asembler • C-- • GAUSS • Lustre • MCPL • SAS 4GL • SQL • Visual Basic • VB.NET • occam • QCL
ezoteryczne: INTERCAL • Brainfuck • BeFunge • Unlambda • Malbolge • Whitespace • FALSE • HQ9+ • Shakespeare • Whirl • Ook
historyczne: ALGOL • APL • BASIC • Clipper • JAS • Lisp • MUMPS • PLAN • PL/I • PL/M • SAKO • SAS (asembler) • Simula
| "Dziennik Polski" z dodatkiem o Janie Pawle II |
|
W czwartek 16 października br. wraz z "Dziennikiem Polskim" (Wydawnictwo Jagiellonia SA) ukaże się bezpłatny dodatek pt. "Jan Paweł II cuda".
|
| "Globtroter" zmieni wydawcę |
|
Od listopada br. miesięcznik "Magazyn Podróżników Globtroter" ma wydawać spółka Globtroter.tv. Została ona wydzielona ze spółki PressKontakt, która jest obecnie wydawcą tego tytułu.
|
| Magazyn dla abonentów platformy N |
|
Jeszcze w październiku do abonentów platformy satelitarnej N (ITI Neovision) trafi pierwszy numer dwumiesięcznika ”Magazyn Abonenta”. Jego wydawcą jest Media Consulting Group.
|
| BBC HD w Polsce od grudnia |
|
1 grudnia br. rozpocznie nadawanie w Polsce kanał BBC HD.
|
| Polsat uruchomi trzy nowe kanały |
|
Zygmunt Solorz-Żak, właściciel Telewizji Polsat SA, zapowiada, że w przyszłym roku jego firma uruchomi trzy kanały tematyczne.
|