5 4 3 2 1 * / + -
(Malé cvičení – jaký je výsledek poslední sekvence operací?).
.SOT v alun ej mekdelsyv ez ,lyb yb sipop isjensepjeN
Tento příkaz je velmi jednoduchý a už jsme jej použili na screenshotech – jedná se o prostou tečku: ., kterou je však nutné od ostatních příkazů oddělit alespoň jednou mezerou nebo jiným „bílým“ znakem.
Ono je to nepatrne slozitejsi, nekdy neni mezera potreba, pokud je jasny konec predchoziho slova.
0 .( zero). cr 1 ." one".
Posledni tecky na radku jsou rozeznany jako slovo.
Obrázek 16: Interaktivní otestování slova DOUBLE.
Pro double bych volil pro osmibit urcite dup +
A ten obrazek je vadny, vysledek ma byt 42. Neco se pokazilo.
(aha v 17. je to uz v poradku)
Inicializace smyčky do-loop je jednoduchá. Na zásobník operandů se nejprve uloží dvě hodnoty. První hodnotou se specifikuje počet opakování smyčky, druhou hodnotou (tj. hodnotou uloženou na vrcholu zásobníku) pak počáteční hodnota.
To si nemyslim. Plati ze druha hodnota je pocatecni, ale prvni neni pocet opakovani ale "cilova" hodnota. Nebo jeste lepe hodnota kterou kdyz prekrocis poslednim krokem ukonci smycku. Ono jeste zalezi na tom zda je KROK kladny nebo zaporny.
Pro zaporne je to VCETNE pro kladne VYJMA.
Podoba se to spis komplikovane FOR smycce, kde se pocita s pretecenim.
10 15 do i . loop
bude vypisovat 15 16 17 ... 32767 -32768 -32767 .. -1 0 1 2 3 4 5 6 7 8 9 pokud je stack 16 bitovy. Smycky funguji JEN uvnitr slov.
na modernim fortu (64 bit...) radeji spuste neco jako
: smycka ( krok -- ) 10 15 do i . cr dup +loop drop ; 1 cell 8 * 4 - lshift smycka
Da se rici ze pravidlo ukonceni smycky se da prevest na pouziti slova WITHIN, protoze jeho spravna implementace ma presne to chovani, vcetne ze zaporne jsou VCETNE.
Nejjednodušší forma smyčky do-loop, která se má opakovat desetkrát, vypadá následovně:
10 1 do loop
Jak je z předchozího úryvku kódu patrné, bude se smyčka provádět desetkrát, přičemž první hodnota počitadla bude rovna jednotce.
Fakt nevim zda fig FORTH na Atarku se chova jinak. Ale jak jsem popisoval vyse, tohle by melo udelat 9 opakovani. Jedna az devet.
Viz obrazek 20 a 21 kde je vstup 10 0 a opakuje se 10x a 6 1 a opakuje se 5x.
To same obrazek 23 a 24.
Skoda ze neni zvolen pocate treba 5 at je jasne ze prvni hodnota neni pocet opakovani ale vyjma hodnota pro kladny krok.
Ten WITHIN s implementavi jde najit na https://forth-standard.org/standard/core/WITHIN
A pokud ma smycka prezit i rekurzi tak pravdepodobne uklada cilovou a aktualni hodnotu na RAS.
Takze pro predcasne ukonceni potrebujete UNLOOP.
Pokud zjistite implementaci tak muzete nahradit slova jako I J K, nebo pridat dalsi.
Fakt je to dost komplikovany aby to fungovalo signed i unsigned. S kladnym i zapornym krokem.
Nekdy je snazsi pouzit jiny typ smycky. Treba FOR NEXT kterou nedefinuje standard je na vetsinu veci vhodnejsi. Ta ma jeden pocatecni parametr a snizuje se k nule (vcetne).
https://gforth.org/manual/1.0/Counted-Loops.html
A nebo nejakou BEGIN ... neco smycku.
Díky za upozornění, zkusil jsem to napsat přesněji (a já si říkal - ty smyčky si nech na příště, už je málo času na to to napsat kvalitně)
Este tam obcas nieco ostalo neopravene:
Nejjednodušší forma smyčky do-loop, která se má opakovat **desetkrát**, vypadá následovně:
10 1 do loop
Jak je z předchozího úryvku kódu patrné, bude se smyčka provádět devětkrát, přičemž první hodnota počitadla bude rovna jednotce.
jj je to tak. snad už opraveno všude. A vlastně mě to donutilo se k té smyčce vrátit ještě jednou příště, protože tam je spousta dalších "pastí".
mimochodem, ten nick "forth" už na rootu vidím dlouho. Předpokládám, že tedy ten jazyk používáš i dnes v praxi?
pekny clanek, ja jsem se pousmal nad redakcnim systemem, co si zrejme nemysli, ze c++ je evoluci ccka ve vsech ohledech a pripadech :)
C+±
OT: syn měl na průmce Python a C#. Ten druhý ho nechytnul. Teď na VŠ mají C++ a jemu se to líbí! Pořád teď přemýšlím, kde jsme udělali chybu při výchově .-)
Tak to byl sprint... Díky za skvělý úvod do úplně jiného světa , ale už se nemůžu dočkat následujícího dílu, protože přes to všechno, co dnešní článek obsáhl (úvod, historie, základy jazyka...) jsme se vlastně nedostali až tak úplně k forthu na Atari: forth je de facto i operační systém s vlastními pravidly - zapomeňme na DOS, ale dokonce i na to, že na disketách jsou soubory(!). Proto bych hodně uvítal pro všechny stručný popis, jak se v tom pracuje, co že jsou ty obrazovky, jak moc je svým způsobem nebezpečný příkaz SAVE (bez kopie instalační diskety ani ránu!) a jestli je potřeba znát nějake 'ed' triky na práci v editoru.
A hlavně, jak se programuje na Atari: ekvivalent peek a poke, ale i všeobecně jak se něco STVOŘÍ. Zatím umíme jediný výkonný příkaz, a to tečku. Takže naše programy jsou trošku ekvivalentem výpočtů s výstupem na děrnou pásku. Nebo ještě jinak, pomůžu si tou analogií s PostScriptem: zatím jsme ve stavu, že umíme spoustu výpočtů, ale stránka dokumentu je pořád čistě prázdně bílá. Protože na zásobníku nám funguje všechno, ale ty "vedlejší efekty" (něco nakresli) jsme zatím nenaťukli.
Takže teď týden vydržet do dalšího dílu... :)
Díky, no ano, zkuste vydržet.
Trošku nalákám: disketová verze Forthu dokonce obsahuje "obrazovky" pro práci s grafikou, stejně jako v BASICu. A i podporu pro práci s assemblerem (ale v RPN zápisu).
Tak to je nejlepší zpráva rána, že s dalším dílem počítáte. Dál už snad ani lákat netřeba, já se těším tak, že bych ten další díl bral hned zítra :)
Ale teda klobouk dolů - dokázal jste v tomto díle "zkompresovat" ani nevím kolik dílů původního seriálu. Opravdu hodně hutný díl, skvělý úvod.
12. 11. 2026, 08:35 editováno autorem komentáře
Chyba zmiňovaná v příspěvku @forth je už o obrázek dřív, tj. na obr. 15: v definici slova jsou prohozené '*' a '2' - tím pádem se provede násobení neznámým číslem (co bylo zrovna na zásobníku) a následně se uloží dvojka - a ta se pak také vypíše pomocí tečky na obr. 16.
Správně má být:
: DOUBLE 2 * ;
Na obrázku 18 už vše funguje, protože tam máme novou definici slova z obr. 17.
Dakujem za zaujimavy clanok. My co sme vyrastali na Basicu a neskor Fortrane je to velmi zaujimave citanie, celkom ma laka si to cez vikend vyskusat.
Přesně - je to úplně fascinující nový svět...
A hlavně už jsem pochopil, proč Pavel říkal, že sice je to trochu 'mimozenské', ale splňuje jako jediný jiný jazyk než Basic tu podmínku, že by mohl být jako hlavní interpretr po zapnutí a dalo by se v něm psát zároveň k vyhodnocení ihned i program. Fakt zajímavý koncept - jen by mě zajímalo: netušíte někdo, jestli nějak postupem doby udělali nějakou implementaci navazující na běžný IT svět? Myslím jako fakt, že není to prostředí Forth přímo "na železe", nemá vlastní implementaci operačního systému, vlastní způsoby zápisu na disky (bez souborů) apod.?
Díky. Ten Factor vypadá zajímavě i mocně. Otázka je, jestli aspoň ten žije nějak víc. Podle jejich vlastních stránek se mi to moc nezdá, ale víc jsem zatím nestihl prozkoumat.
O FORTHu se kdysi v dobách atárka vykládaly legendy, ale nebyl k tomu žádný návod (aspoň ne v našem Atari klubu). Potom vyšel seriál o FORThu v časopisu Elektronika. Jinak existovala i kazetová verze fig Forthu a ani nebyla velká. Snad jen pár desítek otáček. Určitě menší nebo kratší, než většina her.
jj FORTH byl tak jednoduchý na implementaci, že byl "nalezlý" doslova všude. Zrovna ten fig-FORTH byl tehdy hodně standard.
Nebylo to v Amatérském Rádiu? Aspoň tak si to pamatuju. Ten seriál mi změnil myšlení :)
12. 11. 2026, 12:14 editováno autorem komentáře
tak zase takovou paměť nemám, gratuluji. Ale ano, z toho ofoceného to trošku vypadá, že to nemělo bílé pozadí.
Pro vytváření nových slov se používají pouze dvě zabudovaná slova
To není tak docela pravda. Jde pouze o tzv. colon definitions. Nové slovo ve strojovém kódu vytvořím pomocí slova CODE jméno a tělo definuji buď přímo pomocí kódů instrukcí a operandů přes slova , (čárka), nebo si zapnu slovník ASSEMBLER a pak píšu v Assembleru (ten má obvykle ovšem také FORTHovskou notaci, tj. registry/operandy následované instrukcí). Definice takového slova se ukončuje slovem END-CODE (nebo C;). Je ale nutné si uvědomit, že základním slovem k vytvoření nového slova ve slovníku je CREATE (nebo <BUILDS), které je využito k definici všech možných typů slov, včetně proměnných a konstant přes slova VARIABLE a CONSTANT - protože konstanta je také jen slovo, jež zanechá na zásobníku odpovídající hodnotu, stejně jako proměnná, která na něm zanechá adresu. Slovo je i ( - tj. komentář, fungující tak, že dané slovo zkonzumuje a zahodí vše, až do symbolu pravé kulaté závorky včetně, nebo \ - tj. komentář, fungující tak, že toto slovo zkonzumuje a zahodí vše až do konce řádku. Dokonce mohu vytvořit zákeřnou definici 7 CONSTANT 5 a opepřit to : + - ; - FORTH buduje slovník jako zásobník, takže novější definice překryje starší, což se projeví v interpretačním režimu od tohoto okamžiku dále a u všech nově definovaných slov (dříve definovaná slova se budou stále odkazovat na původní definici). A ten první špek využívá toho, že FORTH se nejprve pokouší vstupní řetězec interpretovat jako slovo a teprve když se mu to nepodaří, zkusí to převést na číslo - v tomto případě ale ve slovníku narazí na slovo 5, jež na zásobník ukládá hodnotu 7. Teprve když se nepodaří vstupní řetězec interpretovat ani jako číslo, vyhlásí chybu. A jelikož mechanismus interpretace čísel se řídí proměnnou BASE, zajímavá situace nastane, vložíme-li do ní hodnotu 36 - tedy sdělíme-li interpretu, že veškerá čísla má očekávat v třicetšestkové soustavě. Jen nepovím, že v tom případě může platné číslo obsahovat znaky 0..9 a A..Z. ;)
jj já vím, ale nechtěl jsem hned v prvním článku do toho plést přechody do COMPILE atd. Myslel jsem to z pohledu běžného programátora - tomu si stačí zapamatovat : SLOVO ... ; Na to, jak to vypadá uvnitř, stejně přijde při implementaci vlastního FORTHu (a k tomu doiteruje možná každý, kdo FORTH používá :-)
Ja bych urcite zacal slovy jako DEPTH a S. (tecka neni konec vety, ale klasicka forthovina co kasle na to jak to delaji vsichni ostatni a pro efektivitu si to udela po svem, stejne jako slovo carka)
Kdybych ty slova pouzival od zacatku na testovani tak by me to hodne usnadnilo pouzivani. Primlouvam se za S. na konci kazde ukazky!
Extended fig-Forth by to mel umet.
https://www.atarimania.com/games/atari-400-800-xl-xe-utilities-extended-fig-forth-29927
Podle stranky 25 https://www.atarimania.com/8bit/files/Extended_Fig_Forth_rev_2.pdf
ale neni problem si to nejak sesmolit sam jako vetsinu slov z neceho co konkretni implementace umi
: .s depth dup ." <" 0 .R ." > " begin dup 0 > while dup pick . 1 - repeat drop ;
PS: Mimochodem na strane 24 je jako prvni slovo k debugovani uvedeno B? co ma vypisovat skrytou behovou promenou kde je ulozeno v jake soustave se vypisuji cisla.
Na strance 38 (pdf, nebo 29 ve vnitrnim cislovani) je videt ze to umi i BASE co prezilo dodnes.
https://forth-standard.org/standard/core/BASE
jj to je dobrý nápad. Jinak fig-FORTHovská slova jsou třeba tady https://github.com/ForthHub/FIG-Forth/blob/master/glossary.txt
FORTH jsem viděl jen vzdáleně z rychlíku, ale neznamená nastavení BASE, že se rozbije celej zbytek systému? Nebo to už pro definovaná slova nemá význam?
Nemusis ani gforth instalovat, protoze na netu je hodne online stranek kde si to muzes vyzkouset.
: test 60 emit 62 emit cr ; : sto 100 ; sto . test hex sto . test : test 60 emit 62 emit cr ; : sto 100 ; sto . test dec sto . test
Az budes premyslet proc to posledni cislo je jinak nez cekas tak zacni premyslet nad devatym radkem, co tam je, co si myslis ze tam je a co tam skutecne je.
Emulátor pro opravdové muže:
https://pavel-krivanek.github.io/forth/teletype/
Nebo pro méně zmužilé měkejše:
https://pavel-krivanek.github.io/forth/crt/
Trochu som to skusal, mne to pripada viac ako asembler nez programovaci jazyk. Ale je to uplne mimo mojej komfortnej zony a preto sa mi to ako vyzva paci.
Občas je to spíš hlavolam než asembler - když člověk potřebuje nějakou složitější operaci na zásobníku, tak mi to přijde jako takové ty hlavolamy s posouváním vláčků na různě dlouhé slepé koleje. Třeba je to tím, že člověk z jiných jazyků není zvyklý takto uvažovat, ale nemyslím si - i v dobách, kdy jsem psal programy v PostScriptu, jsem si musel ty zásobníkové operace stále kreslit. Naštěstí jsou málokdy potřeba nějaké složitosti. Ale schválně si zkuste (bez tužky a papíru) přijít na to, co dělá tento primitivní program, resp slovo .D v něm, a posuďte čitelnost :)
: .D SWAP DUP ROT DUP ROT SWAP ;
( test )
2 1 .D .D .D
+ . - . * . / .
Co se pamatuju, tak pokud někdo potřebuje složitější operace na zásobníku, tak má podle Chucka Moora problém s designem a měl by refaktorovat.
(na druhou stranu Chuck Moore a "moderní" forthy se už dávno rozešli, jeho color forth je fascinující, ale hodně minoritní)
jeho color forth je fascinující, ale hodně minoritní
ColorForth je základní nástroj k programování jeho GA144 - což je podobně fascinující procesor (clock-less, "144-jádrový") jako prakticky vše od Chucka. Takže zase tak minoritní není.
Já jsem si FORTH po počátečním WTF? někdy v 15 letech zamiloval o 10 let později a už mě to nepustilo. Má naprosto nedostižný poměr mezi nároky (na HW, na implementaci) a tím, co nabízí. Jakmile člověk zažije ten aha!-moment, zjistí, jak neuvěřitelně mocný nástroj to je a začne si doprogramovávat hromadu dalších věcí - objektové programování à la C++, objektové programování à la Smalltalk, objektové programování à la CLOS, FP aritmetiku, infixovou notaci, lokální proměnné, pojmenované parametry, datové typy, GUI slovník... Když se dostatečně vyblbne, tak si uvědomí, že ten jazyk je dokonalý tak, jak je, že všechny ty blbiny, co mají jiné jazyky, on nepotřebuje, protože ty blbiny řeší něco, co se dá ve FORTHu vyřešit elegantněji ad-hoc řešením. A někdy v mezičase si během pár hodin napíše v Assembleru, jen tak mimochodem, vlastní FORTH, aby si ověřil, že je to opravdu tak jednoduché a vážně to funguje a dá se to naprosto plnohodnotně používat.
Dobře napsaný program ve FORTHu se pozná tak, že od druhé úrovně výše se čte jako vyprávění mistra Yody. Špatně napsaných programů moc není, protože by se v tom autor velice brzy sám zamotal.
používáš svůj FORTH nebo nějaký gForth nebo pForth? A nebo máš na mysli vývoj na něco jiného než x86(64)?
Na PC v MS-DOSu jsem používal F-PC, i když jsem si cvičně napsal i vlastní pak později pro Linux (v GAS). Ale já jsem FORTH používal spíše pro non-PC platformy, zejména vlastní implementace pro DSP řady ADSP-21xx, nakonec i vlastní 16bitový zásobníkový CPU na FPGA (tyto dvě věci v rámci podnikání, STC implementace).
Pokud by měl někdo nutkání napsat si vlastní FORTH, tak doporučuji sérii článků "Moving Forth" od Brada Rodrigueze. Pro Linux existuje SmithForth - zajímavostí této implementace je, že je napsaná přímo ve strojovém kódu x86-64! A nutno podotknout, že velmi hezky a přehledně, se spoustou komentářů. K "překladu" stačí jen standardní utilita xxd. Čímž chci poznamenat, že FORTH se přirozeně nejlépe píše v Assembleru a níž (a nebo přímo ve FORTHu jako cross-compiler, nebo - což je ještě zajímavější - jako meta-cross-compiler, který přeloží sám sebe pro jinou platformu - zde se využívá toho, že většina FORTHu se stejně píše ve FORTHu).
A pokud by někdo chtěl vyzkoušet zvládnutí tohoto jazyka, tak klasika "Starting Forth" a "Thinking Forth" od Leo Brodie - posledně jmenovaná je podle mě užitečná, i když člověk u FORTHu nezůstane.
ano, "Thinking Forth" a samotnej FORTH mě před cca patnácti lety naučil, co to vlastně je refactoring. V C/Javě to nebylo tak kritické, ale FORTH dlouhé nudle neodpouští.
Prekladac me z toho udelal vnitrne 2 tokeny OVER_SWAP a TUCK. Coz je vlasnte 2DUP.
Davam prednost kdyz se slovo 2DUP definuje jako OVER OVER, je to jasnejsi a bude to asi i rychlejsi v kazde implementaci.
Ta svoboda co dostanes ve forthu nakonec neco stoji.
Ne kazdy to zvladne.
Chces jezdit na koni bez sedla? Tak bez do toho, kdyz chces. Jen si mozna zlomis vaz.
Nebude na tebe kricet ze tohle je rezervovane slovo... klidne si to predefinuj. A pak zase vrat puvodni definici pozdeji.
To ze nemusis pozna ani co je slovo nebo hex cislo je dan za to ze nemas zadne ohradky typu 0x... nebo [_a-zA-Z][_a-zA-Z0-9]*. To ze slova jsou takove vyrazy nebo filtry a ze dokazi brat kdykoliv promenlivy pocet parametru a vracet to same. Dokonce to mohou menit i podle vstupu nebo nejakeho bocniho kanalu. Jen to pak budes muset nejak ustat aby ten program neskoncil v chaosu.
Ta volnost pak konci tim, ze kdyz to budes brat vazne tak zjistis ze standard dela banda idi*tu a ze az kdyz si to cele udelas po svem ti narostou kridla a v ten moment se to take stane jazyk jen pro tebe a nikoho dalsiho...
A taky to uplne neni vhodny jazyk napriklad pokud chces neco delat nad bajty. Je to pak trosku nepohodlne, protoze zakladni jednotky jsou o sirce cell nebo dvojite. Pripadne nejaky float pravdepodobne nad vlastnim zasobnikem.
Ano slo by to nejak rozsirit ze bys udelal emulovany dalsi zasobnik ciste pro bajty a konverzni slova atd.
Postfixova notace neni problem, ale kdyz pak pises ( a b -- a+b ) tak uz michas postfix a infix a pri infixu to obcas chce i zavorky a ty ted nemuzes napsat protoze koncova zavorka ukonci komentar.
Slozitejsi algoritmy co maji vic jak 3 promenne :D uz pravdepodobne budou vyzadovat bud zvolit jiny algoritmus, rozdelit to na podulohy, nebo si neco ulozit do pameti a pak to radsi cist pres @ (Programator bude vedet ze to neni rekurze a muze to pouzit, jeho starost). Ppripadne pouzit lokalni promenne v modernich verzich. Protoze cteni z pameti bude rychlejsi nez to tahat z hlubokeho zasobniku.
Ten zpusob mit to na zasobniku je strasne efektivni, protoze je to virtualni masina, kde programator sam resi vhodne rozmisteni v registrech na skutecnem hw. TOS bys mel pokud to jde mit v registru, mozna i NOS. Ale proste ne vzdy to jde tak minimalizovat.
Navic forth muze byt i docela slozity jakmile zjistis, ze ma veci jako DOES>. To fakt uz neni pro kazdeho kdyz zjisti ze tohle otvira dalsi slozitosti (nebo prilezitosti jezdit i na medvedovi).
Problem forthu je i to ze se daval na veci kde by proste BASIC selhal. Mala ROM a 1Kb RAM a tady to mas! Je to superpocitac s forth... :D
PS: Ja si zasobnik kreslim v tech schematech. Protoze tohle splete i AI. Ale nejsem nejaky forth progamator.
Tak tohle je podle mě soupis výhod a nevýhod Forthu v kostce - to by se mohlo tesat, kdyby to bylo kratší :)
Ano: zkusil jsem si naimplementovat 2DUP bez OVER. Jen tak, přišlo mi, že přeci pomocí ROT a DUP to musí být snadné :)
Nemám ve Forhu žádné zkušenosti, pracoval jsem kdysi jen v PostScriptu a ten umí dát na zásobník i struktury (ukazatel na ně), takže se 2DUP nepotřebuje, ale ve Forthu jsem (zatím) nic takového neviděl, tak mi přišlo, že si člověk musí sám napsat 2DUP, 4DUP, 6DUP...
Ohledně Forthu: já považuju také za neuvěřitelné, z jak malého základu lze vybudovat celý jazyk, jak si člověk může předefinovat úplně cokoliv. A má téměř absolutní svobodu, jak kdyby si zároveň tvořil jazyk, kompilátor i vlastní program naráz. Ale bojím se, že právě proto to v praxi vede ke znovuvynalézání miliónů různě šišatých kol pořád dokola, protože než pochopit cizí knihovnu, každý stejně usoudí, že si to raději napíše odznova sám - a určitě "líp" ve smyslu optimalizace zrovna pro toto konkrétní použití. Kdo to ale pak všechno přečte a vyzná se v tom? Včetně autora samotného po delší době? To nevím. Mám málo zkušeností na to to odhadnout, ale tak intuitivně za ta léta v IT mi přijde, že takhle pojatá ta svoboda je právě zároveň největší výhoda a zároveň Achilova pata Forthu...
Ohledně míchání notací v popisech typu ( a b --- a+b ) : přijde mi, že je to i v originální dokumentaci ještě zákeřnější, stačí vzít jejich značení a k tomu nekomutativní operaci, aby to bylo vidět: ( n1 n2 --- n1/n2 ). Když si to zkusíte, zjistíte, že n1 fakt není na vrcholu zásobníku, jak by jeden čekal. Na vrcholu je vždycky ten poslední zmiňovaný parametr na vstupu. Takže n1 je tady druhé od vrcholu, zatímco u popisu ROT je třetí od vrcholu...
A také to znamená, že když chcete testovat svoje nové slovo porovnáním stavu zásobníku před a po pomocí .S , tak si to musíte (minimálně v hlavě) přerovnat, pokud to chcete porovnat s tou definicí/popisem.
Ja prisel ze lepsi je to znacit \ ( n1 n0 -- n3 ) n3: n1/n0
Nulou to zacina kvuli tomu jak se chova PICK (ten zvolil pri definici nulu spravne).
Ale to ze se tam micha ten infix v komentarich je trosku problem.
Oboje samostatne neni problem, i kdyz u infixu si musis pamatovat poradi operaci atd a postfix je uz optimalizovany by design, stejne jako mas uz optimalizovany jak mas rozmistit hodnoty v regisrech.
Ale na tom stretu to zacne o sebe drit.
2DUP jde udelat spoustou zpusobu SWAP TUCK SWAP TUCK.
Podle odkazu od p. Tisnovskeho to ale neumi nektere "zakladni" casto pouzivna slova jako
: NIP ( b a -- a ) SWAP DROP ; : -ROT ( c b a -- a c b ) ROT ROT ; : TUCK ( b a -- a b a ) DUP -ROT ;
Ale tech kombinaci je prirozene stejne mnohem vic nez forth bezne nabizi. Protoze zabiraji misto ve slovniku.
Premyslel jsem ze ty nazvy by sli udelat i jako ACB misto -ROT. _A misto NIP. ABA misto TUCK.
on právě FORTH nějak nezapadá do škatulek "assembler", "překladač", "vyšší programovací jazyk". Má od každého něco. Jinak zajímavé je, že v assembleru vůbec nemám problém číst nebo psát "nudle" dlouhé přes několik obrazovek, ale ve FORTHu už slovo obsahující deset dalších slov je problém a musí se dělat refaktoring. Ten je navíc tak jednoduchý, že to k tomu svádí pořád. Kdežto v assembleru radostně pokračuju s nudlemi a špagetami :)
No jo, ale k tomu je pár otázek od laika - pardon, asi jsou fakt laické:
1. co vím, tak ve forthu jsou všechna slova globální, takže vznikne obří nezapamatovatelný slovník alias maglajz. Leda nějak prefixovat jako v dřevních dobách... Nebo jak se to řeší?
(ve svém programu potřebuju všechny části programu, takže dělením na obrazovky si nepomůžu)
2. přeložený/interpretovaný kód teda obsahuje cca z 50% instrukce skoku nebo jak se to optimalizuje? Je něco jako 'inline'?
3. ty "obrazovky" jsou další performance killer: např. obrazovka 18 ve fig-forthu obsahuje de facto jen tři skoky do dalších obrazovek, to je celý její obsah. Zabírá (jako každá obazovka, z definice) KILOBAJT! To se nějak kompresí za běhu? Ostatně jak jinak by se vešlo do Atari 88 kilobajtových obrazovek (a ještě místo na vlastní kód programu)...
Trošku mi to připomíná, jak jsem se dozvěděl, že ve forthu je programovaná grafika v mých oblíbených textovkách typu Price of Magik, Collosal Adventure apod. Tam než se ta grafika na cca třetině obrazovky vykreslí, tak jsem většinou už zase o obrazovku dál... Zatímco ten ošklivě špagetový assembler např. ve Spindizzy rozbalí ze zkompreseného archívu a vykreslí 3D scénu přes celou obrazovku rychleji než obnovovací čas mezi dvěma TV snímky...
Jenže to může být použitým algoritmem, nechci jen kvůli tomu na forth nasazovat. Spíš se mi to jen vybavilo :) Obecně mě zajímá, že z definice jazyka podle mě musí plynout tyhle základní laické otázky o performance každému, tak jak se to v praxi řeší?
ono u těch her bylo pomalé to vyplňování. Ale zase to jelo ve svém "vlákně" a hra nečekala na dokreslení. Na dobu vzniku dost dobré...
(mě tam tedy vždy zaráželo, kolik obrazovek a k tomu jejich popisků se vlastně vejde do hry, která měla tak 40kB max).
ad 1.: Ne. FORTH má slovníky. Navolíte si, do kterého přidáváte nové definice a kde se vyhledávají ty stávající. Volíte i pořadí slovníků, ve kterém se začne vyhledávat, ve kterém se bude pokračovat při neúspěchu atd.
ad 2.: Ano, může se optimalizovat přes inlinování.
ad 3.: Screeny se obvykle nekomprimují*, preferuje se taková štábní kultura, která co nejlépe využívá celou plochu screen. Screena zabírá právě jeden blok, kompresí by se to zkomplikovalo. I tak je průměrné plýtvání místem od konce řádku do okraje screeny asi tak 40-60 % bloku, takže to není zrovna úsporný způsob ukládání zdrojového textu programu.
* latinsky comprimere = stlačovat, odv. komprimovat; supinum je compressum, odtud nomen actionis compressio = stlačování, odv. komprese. Jinými slovy - "kompresovat" zní hodně divně. ;)
Nemusis pak premyslet jakou kombinaci mas udelat ten efekt na tom zasobniku. Chces 2DUP a neznas jmeno? No tak vyzkousis BABA jestli to sezere.. :D
Nieco tak mimozemske som davno nevidel. Zacinam tusit, ako sa citila lingvistka Louise Banks vo filme Arrival.
Forth je velmi zajimavy jazyk. Kdysi, nekdy radove v 1983, vychazely v Amaterskem Radiu na pokracovani clanky o Forthu. S kolegou nas to tak zaujalo, ze jsme zacali psat interpreter Forth na TNS Slusovice (Z80). Jelikoz jsme nemeli ani assembler, jenom monitor a debugger, psali jsme to primo v hex kodech Z80. Od te doby je znam zpameti odpredu dozadu :-). Jak postupne vychazel serial, pridavali jsme tam dalsi a dalsi vlastnosti. Byl to celkem zajimavy projekt. Kdovi, kde skoncila ta derna paska.
Kdysi davno (tak 10 let, mozna 15) jsem dokonce napsal znovu dalsi, tentokrat kompilator Forth pro PIC (Microchip). Samozrejme napsany ve Forthu :-) https://github.com/josefpavlik/picoforth
Forth se mi hodil i v jednom zajimavem projektu. Potreboval jsem v embeded zarizeni (ESP32) cist registry inverteru pres modbus, prepocitavat je (nasobeni konstantou, scitani nekolika registru a podobne). To cele muselo byt rizeno jednoduchym konfiguracnim stringem. Udelal jsem do toho firmware jednoduchy interpreter neceho, co velmi silne pripomina forth a v tom config stringu je vicemene program ve forthu :-)
Nemusim zduraznovat, ze jedine kalkulacky, ktere pouzivam, jsou od HP :-)