Mainitsin Forthin täällä ja keskustelu meni siihen minne yleensäkin, eli syntaksin kummallisuuteen. Yritän tähän nyt koota jotain lyhkäistä, että mahdollisesti kieleen tutustumattomat eivät säikähdä tuosta tuomiosta vaan kokeilevat kieltä.
Forth ei ole missään nimessä jokapaikan höylä ja jotkin asiat ovat hieman hankalia. Lisäksi kirjastoja ei ole oikein tarjolla. Kuitenkin sillä on helppo tehdä monia asioita ja se löytyy hassuista paikoista, yleensä sulautetuista järjestelmistä.
Esimerkiksi seuraava ohjelma on itsestään selvä, ja se voisi ohjata pesukonetta.
Viimein rivi on hieno.
( Washing Machine Embedded Application ) \ Port assignments 01 CONSTANT PORT \ bit-mask name bit-mask name 1 CONSTANT MOTOR 8 CONSTANT FAUCETS 2 CONSTANT CLUTCH 16 CONSTANT DETERGENT 4 CONSTANT PUMP 32 CONSTANT LEVEL A colon begins a new definition. \ Device control : ON ( mask -- ) PORT C@ OR PORT C! ; : OFF ( mask -- ) INVERT PORT C@ AND PORT C! ; Definitions can contain generic SwiftX words and any others you've defined… \Timing functions : SECONDS ( n -- ) 0 ?DO 1000 MS LOOP ; : MINUTES ( n -- ) 60 * SECONDS ; : TILL-FULL ( -- ) \ Wait till level switch is on BEGIN PORT C@ LEVEL AND UNTIL ; …so, application-specific functions are defined in terms of previous definitions… \ Washing machine functions : ADD ( port -- ) DUP ON 10 SECONDS OFF ; : DRAIN ( -- ) PUMP ON 3 MINUTES ; : AGITATE ( -- ) MOTOR ON 10 MINUTES MOTOR OFF ; : SPIN ( -- ) CLUTCH ON MOTOR ON 5 MINUTES MOTOR OFF CLUTCH OFF PUMP OFF ; : FILL-TUB ( -- ) FAUCETS ON TILL-FULL FAUCETS OFF ; \ Wash cycles : WASH ( -- ) FILL-TUB DETERGENT ADD AGITATE DRAIN ; : RINSE ( -- ) FILL-TUB AGITATE DRAIN ; …until you reach the main application definition. \ Top-level control : WASHER ( -- ) WASH SPIN RINSE SPIN ;
En ala kuitenkaan käymään tuota läpi vaan tarjoan sen ilmaisena näytteenä, kuin huumekauppias. (koodin lähde forth.com)
Forth on pinokieli ja käyttää laskutoimituksissa käänteistä puolalaista logiikkaa. Forthissa on yleensä vähintään kaksi pinoa. Datapino, jonne menevät luvut ja osoittimet. Paluupino (return stack) jossa on sanalle paluuosoite. Noiden lisäksi on mahdollisesti liukulukupino (float stack.)
Forth on tulkattava ja käännettävä kieli. Eli ohjelmia voi kääntää ympäristössä valmiiksi ja kutsua niitä vuorovaikutteisesti.
Forth koodi on tekstiä. Koodi koostuu sanoista, joita erottaa yksi tai useampi välilyönti. Sanaa voisi verrata funktioon muissa kielissä, mutta sana on vain lyhyempi. 8 5 - koodina koostuu kolmesta sanasta. 8 tunnistetaan luvuksi ja se menee pinoon kuten myös 5. - on sana joka ottaa pinon toiseksi päälimmäisen luvun ja vähentää siitä päälimmäisen. Tämän jälkeen tulos laitetaan pinoon.
Pino on myös kaikkein tärkein asia, josta ohjelmoijan tulee pitää huolta. Sille käytetään omaa kommenttia sanan alussa. ( alimmainen_pinossa ... päällimmäinen_pinossa -- alimmainen_pinossa ... päällimmäinen_pinossa ) Jossa ... kohdassa voi olla useita lukuja, osoittimia, hakemisto ID:tä tai muita asioita. -- erottaa tilan. Sen vasemmalla puolella on pinon tila ennen sanan suoritusta ja oikealla suorituksen jälkeen. Vähennys laskua kuvaavalle sanalle pinokommentti on ( n2 n1 -- n3 )
Forthissa on kaksi kommentointitapaa. Sana ( joka tiputtaa kaiken pois seuraavaan ) merkkiin asti ja \ jolla loppu rivi muuttuu kommentiksi vt. C:n /* */ ja //
Forthin käynnistyessä ohjelmoija päätyy tulkkiin ja sen ok kehoitteeseen. Tulkin toiminta on hyvin yksinkertainen.
1. Lue syötettä välilyöntiin asti
2. Löytyikö sana (word) sanakirjasta (dictionary)
2a. Löytyi -> Laita pinoon XT (execution token) joka on jotain, mistä Forth tietää mitä sanaa tulee kutsua tai kääntää.
2b. Ei löytynyt -> Onko sana luku? -> on. laita pinoon | Ei. Virhe. suorita sana abort (pinot tyhjiksi) ja palaa kohtaan yksi.
3. tulkataanko vai käännetäänkö? -> tulkataan -> suorita | käännetään-> käännä määriteltävään sanaan. Oli kumpa hyvänsä, palaa kohtaan yksi.
Sanat päätyvät käännettäessä sanakirjaan, josta ne löydetään. Sanoja voi lisätä sanakirjaan helposti. : aloittaa sanan kääntämisen ja ; lopettaa. : jälkeen tulee sanan nimi.
Seuraavassa on Forthin käynnistys ja kehittyneemmän Hello worldin määrittely ja ajo.
$ gforth Gforth 0.7.2, Copyright (C) 1995-2008 Free Software Foundation, Inc. Gforth comes with ABSOLUTELY NO WARRANTY; for details type `license' Type `bye' to exit : heippa ( n -- ) 2 / . ." kappaletta terveisiä Ohjelmointiputkaan" cr ; ok 56 heippa 28 kappaletta terveisiä Ohjelmointiputkaan ok
: aloittaa sanan heippa käännön. Pinokommentti kertoo yhden luvun tulevan sisään ja mitään ei tule ulos. Tämä sana siis syö pinon päällimmäisen luvun.
Suoritettaessa pinoon laitetaan numero kaksi ja sen jälkeen suoritetaan jakolasku. . tulostaa pinon päältä luvun, eli tässä vaiheessa kommentin n on käytetty. Pinoon saa laittaa tavaraa, mutta se tulee ottaa pois, mikäli aikoo kunnioittaa kommenttia. Tietenkin voi mennä syvemmälle, mutta silloin pinokommentti on väärin. Mikään ei valvo sitä tietenkään, vaan se on vain kommentti. ." aloittaa merkkijonon tulostuksen. ." tulee olla yksi väli, jotta sana voidaan erottaa, mutta ennen (jälkeen pitää) sanaa " ei pidä olla tai se tulostetaan. cr tulostaa rivinvaihdon ja ; päättää kääntämisen. ok on kehote, joka kertoo koneen olevan valmis käytettäväksi.
Seuraavalla rivillä ajetaan komento. 56 ei ole sana. Se on numero joten laitetaan pinoon. Edellisellä rivillä määriteltiin sana heippa ja nyt se suoritetaan, koska tulkataan. Koneen muistissa ei tietenkään ole tekstiä vaan osoitteita muihin sanoihin jotka ajetaan. Eli heippa on käännetty valmiiksi ja sen suoritusaika on ihan reipas.
Sana heippa tulostaa 28 kappaletta..... rivinvaihdon ja forth toteaa olevansa valmis ja ilmoittaa ok.
Mikäli ajattelemme, että false on 0 niin true voisi olla sitten false invert Käännetään siis bitit ympäri. Siitä tulee -1. Tämä on hyvä tietää, ettei ylläty asiasta. If lause kuitenkin vertaa nollaan, kuten muissakin kielissä.
If-lause muodostuu pinosta tulevasta arvosta, jonka if syö, ja mikäli se oli totta, niin suoritetaan sanat then sanaan asti. if lause voidaan myös kirjoittaa if-else-then. Englannissa then sanalla kaksi merkitystä ja Forth käyttää toista sitten merkitystä. Muut kielet ensimmäistä niin. If-rakenne suomentuu jos - muuten - sitten. Ja jos tuntuu pahalle ajatukselle niin aina voi määrittää : endif then ;
Typerä muistisääntö on, että First we take Manhattan, then we take Berlin. Ja Fi on vähän saman näköinen kuin if.
: manhattan ( -- ) ." Manhattan then " ; ok : berlin ( -- ) ." Berlin" ; ok : we-take ( n -- ) if manhattan then berlin ; ok 1 we-take Manhattan then Berlin ok 0 we-take Berlin ok true . false . -1 0 ok
Tuon muistisäännön perusteella tehty if-lause ja true sekä false tulostettuna.
Helposti pinon hetkuttelu (dup, swap, rot, drop, roll, pick, nip ja tuck) tulee hankalaksi. Forth tarjoaa kuitenkin muuttujia ja vakioita. Ne ovat Forthissa globaaleja.
Vakio syntyy arvo constant nimi kaavalla ja sen arvon saa pinoon ihan nimellä.
Muuttuja taas on hieman erillainen. variable nimi riittää sen luomiseen. suorittamalla muuttujan nimen, pinoon jää muuttujan osoite. @ sana (lausutaan fetch) hakee sitten arvon osoitteesta. ! ( n addr -- ) (store) taas tallentaa sinne.
42 constant meaning-of-life ok variable putkamuuttuja ok putkamuuttuja @ . 0 ok meaning-of-life . 42 ok meaning-of-life putkamuuttuja ! ok putkamuuttuja @ . 42 ok
Tietenkin on sitten olemassa begin-while-repeat, begin-until ja begin-again loopit ja laskevat do-loop eri variaatioineen.
Toivon, että tämä onneton räpellys selkeytti hieman erilaista ohjelmointikieltä, sekä sen myyttiä hankalasta syntaksista. Myyttihän on mahdoton, koska syntaksia ei ole:)
Forthin käytöstä sen verran, että suunnittele ylhäältä alas, toteuta alahaalta ylös. Sanassa pinon päällimmäinen sana kannattaa olla se useimmiten muuttuva.
Koska olen huono kirjoittamaan ohjeita, läimin tähän perään parit linkit
Gforthin tutoriaali, joka on osa dokumentaatiota. Gforth pyörii hyvin Linuxissa.
ANS forth standardi, joka kertoo miten sanat toimivat ja mitä tarkoittavat. Raskasta kamaa.
Starting Forth Perusteos opetteluun
win32forth Forth Windowsille
Paljon asiaa
Lista eri Fortheista valitse suosikkisi.
Lopuksi toivon asiallista keskustelua. Tiedän, että tämä näyttää hölmöltä, tuntuu vaikealta, mutta on kai siksi kivaa. Ja jos on kysymyksiä niin yritän vastailla.
Niin ja tässä ei ollut todellakaan kaikki. Jätin PNO:n, CREATE DOES> yhdistelmän, RECURSE ja DEFERin kokonaan pois, sekä sanalistat, I/O:n ohjaukset ja muut. Hiukan hello worldia pidemmälle vasta päästiin. Starting forth on ystävä ja siinä on hienot kuvat.
Aihe on jo aika vanha, joten et voi enää vastata siihen.