Lyhyt ja ytimekäs kysymys: Millä tavoin ohjelmointikieli tehdään? Asia on kiinostanut minua paljon, mutta en ole löytänyt minkäänlaista tekstiä aiheesta. Esim. miten voi luoda sen syntaksin juuri sellaiseksi, kuin itse haluaa ja miten tulkin saa toimimaan itsenäisesti, niin ettei sen toiminta vaadi sen ohjelmointikielen tulkkia millä tuo oma tehtiin...
Ohjelmointikieli itsessään on ihan abstrakti asia, eli kieli on periaatteessa "luotu", kun se on tarkasti määritelty. Syntaksin voi luonnollisesti määritellä ihan sellaiseksi kuin haluaa, ja tulkkia tai kääntäjää koodatessa on sitten vain varmistettava, että se noudattaa kielen sääntöjä.
lainaus:
miten tulkin saa toimimaan itsenäisesti, niin ettei sen toiminta vaadi sen ohjelmointikielen tulkkia millä tuo oma tehtiin...
Yleensä tulkit käännetään konekielelle eli itsenäisiksi ohjelmiksi eikä niitä ajeta toisella tulkilla.
Jos kiinnostaan enemmän niin, kannattaa tutustua lex, yacc, yms. muihin työkaluihin, joilla kääntäjiä voi tehdä melko helposti kunhan kirjoittaa kielen kieliopin.
http://dinosaur.compilertools.net/
Syntaksihan on juuri sellainen, kuin tulkkisi tai kääntäjäsi vaatii. Sitä ei tarvitse erikseen "tehdä", vaan jos kääntäjä vaatii tiettyyn kohti välin, niin syntaksi menee silloin niin, että siihen kohti pitää laittaa väli. ;)
Itse koodailin tuossa taannoin C:llä Brainfuckille yksinkertaisen kääntäjän, joka kääntää ohjelman C:ksi. Samalla se optimoi ja tiivistää koodia esimerkiksi yhdistelemällä BF:n peruskomentoja ja käyttämällä silmukoita. Työ ei ollut valtava, ei tosin kielikään. (Paranneltavaakin tietysti riittää vielä paljon.)
Metabolix kirjoitti:
Syntaksihan on juuri sellainen, kuin tulkkisi tai kääntäjäsi vaatii. Sitä ei tarvitse erikseen "tehdä", vaan jos kääntäjä vaatii tiettyyn kohti välin, niin syntaksi menee silloin niin, että siihen kohti pitää laittaa väli. ;)
Jaa-a. Onkohan syntaksin suunnittelusta ennen kääntäjän ohjelmointia sitten mitään apua? Ehkä pitää vain koodata kääntäjä ja katsoa sitten jälkikäteen, mihin se vaatii ne välilyönnit. ;)
Toki syntaksin suunnittelu ja dokumentointi auttavat asioissa kovasti. Tarkoitin vain sanoa, että mitään erityistä syntaksieditoria hommaan ei tarvita. Jos tarvitaan, kyseessä onkin jo jokin valmis kielenteko-ohjelma, jolloin voi taas kysyä itseltään, kannattaako sitä kieltä tehdä ensinkään, jos se on tällaisen ohjelman rajoitusten alainen ja siis samanlainen kuin kaikki muutkin sillä tehdyt kielet.
Aina on ilahduttavaa, kun on mahdollisuus oppia uusia asioita. Metabolix sallinee pari kysymystä ja toivottavasti selventää ajatteluaan.
Ensinnäkin, mitä ovat "syntaksieditorit" ja "valmiit kielenteko-ohjelmat"? Termit eivät ole minulle tuttuja.
Toiseksi, mistä rajoituksista on kyse? Teorian mukaan minkä tahansa Turing-täydellisen systeemin avulla voi simuloida toisen Turing-täydellisen ohjelmointikielen toimintaa kaiken paitsi suoritustehokkuuden suhteen. Eikö se tarkoita sitä, että jos haluaisi esim. jostakin kumman syystä käyttää logiikkaohjelmointikieli Prologin tapaisia rakenteita, voi Prolog-kääntäjän hankkimisen sijasta harkita myös laajentavansa jo olemassaolevaa kieltä lisäämällä siihen tarvittavia operaatiota?
Vai eikö tämä käytännössä onnistu? Mikä estää?
FooBat kirjoitti:
Jos kiinnostaan enemmän niin, kannattaa tutustua lex, yacc, yms. muihin työkaluihin, joilla kääntäjiä voi tehdä melko helposti kunhan kirjoittaa kielen kieliopin.
http://dinosaur.compilertools.net/
Jotenkin musta vaan tuntuu, että noi helpottaa sen kääntäjän/tulkin tekemistä liikaa. Haluun yrittää tehdä mahdollisimman paljon itse.
Metabolix kirjoitti:
Itse koodailin tuossa taannoin C:llä Brainfuckille yksinkertaisen kääntäjän, joka kääntää ohjelman C:ksi. Samalla se optimoi ja tiivistää koodia esimerkiksi yhdistelemällä BF:n peruskomentoja ja käyttämällä silmukoita. Työ ei ollut valtava, ei tosin kielikään. (Paranneltavaakin tietysti riittää vielä paljon.)
Saako kielestä tai kääntäjästä tehokkaan, jos se käännetään siksi kieleksi millä se on tehty? Jotenkin se tuntuu, että se ole oma ohjelmointikieli enää silloin. Tavallaanhan se kieli on jonkinlainen moodi tai välikappale tälläisessä tapauksessa... Toisaalta en sitten tiedä onko kääntäjän tekoon olemassa muitakaan vaihtoehtoja.
Triton kirjoitti:
Saako kielestä tai kääntäjästä tehokkaan, jos se käännetään siksi kieleksi millä se on tehty? Jotenkin se tuntuu, että se ole oma ohjelmointikieli enää silloin.
No joka tapauksessahan kääntäjät tekee siitä jotain toista kieltä, jos ei muuta niin konekieltä. Sananakin kääntäminen viittaisi tapahtumaan, jossa muutetaan jotain kielestä toiseen.
Pekka Karjalainen kirjoitti:
Ensinnäkin, mitä ovat "syntaksieditorit" ja "valmiit kielenteko-ohjelmat"?
Samanlaisia kuvitteellisia aiheeseen liittyviä työkaluja kuin 3D-räiskintäpelintekokeskusteluissa toisinaan esiintyvät Quake 5 -editorit. Jokin alkuperäisen kysymyksen sanamuodossa toi mieleeni kysymyksen "miten teen 3d-pelin jossa on X, Y ja Z joita kukaan ei ole ennen keksinyt", ja siksi päädyin tässäkin mainitsemaan, ettei tuollaisia taikakaluja ole oikein tarjolla. Ei nyt jäädä tästä puhumaan, kun on luultavaa, ettei aiheen aloittaja tällaisia kaipaa. Ajattelin vain varmistaa, että asia on selvä. :) Rajoituksilla tarkoitan rajoituksia, joita monet tällaiset helppokäyttöiset valmiit välineet asettavat. Vai onko olemassa jokin ohjelma, jolle voi kuvailla näppärästi mielivaltaisen ohjelmointikielen syntaksin ja joka sitten tekee tälle syntaksille parserin ja tulkin? Kyllä siinä yleensä joutuu itsekin hommiin, jos haluaa oikeasti vaikuttaa ominaisuuksiin eikä vain pilkkujen paikkoihin.
Muihin kysymyksiin en sano mitään, koska en käsitä, mitä tekemistä niillä on keskustelun pääjuonen kanssa.
Triton kirjoitti:
Saako kielestä tai kääntäjästä tehokkaan, jos se käännetään siksi kieleksi millä se on tehty?
Tällä ei ole merkitystä. Luultavasti kuitenkin kääntäjästä tulee tehokkaampi, jos koodin kääntää C:ksi ja käyttää sitten valmista hyvää C-kääntäjää sen kääntämiseksi loppuun, verrattuna tilanteeseen, jossa aloittelija yrittää itse optimoida koodin suoraan konekieliseksi koodiksi. Lisäksi esimerkiksi C on siitä käytännöllinen välikieli, että valmiit kääntäjät osaavat kääntää sitä hyvin moneen eri ympäristöön, jolloin omassa kääntäjässä voi keskittyä tehokkaan C-koodin tuottamiseen miettimättä erilaisia laitteistoja ja konekieliä.
Metabolix kirjoitti:
Ajattelin vain varmistaa, että asia on selvä. :)
Pahoittelen, että en aina tunnista viesteistäsi milloinka olet tietämätön ja milloinka vitsailet.
Tuossa ~vuosi sitten väsäsin kääntäjä/emulaattorin tietotekniikan kurssilla esitetylle yksinkertaiselle konekielelle. Kokemuksesta voi sanoa että se (kielen tekeminen) ei välttämättä ole liian hankalaa jos syntaksi ja rakenne rajoituksineen on täysin selvillä alusta alkaen.
Ja onhan tuolla koodivinkeissä yksi omakielinen viritys.
Tuli vielä mieleen, että miten sitten se tehdää, jos nyt vaikka tehtävänä olisi luoda kirjoituskomento, joka olisi syntaksi muota esim write "sisältö", niin miten se sisältö saadaan jatkokäsittelyyn?
Aihe on jo aika vanha, joten et voi enää vastata siihen.