Tulipa tässä vain mieleen päivänä eräänä, että ovatko Ohjelmointiputkan käyttäjät kehitelleet paljonkin omia ohjelmointikieliä ja niille kääntäjiä tahi tulkkeja. Olisi mielenkiintoista kuulla, jos jollakulla on tarjota jokin maailmaravisuttava idea.
Itse en ole mitään suunnitellut/koodannut, mutta viime aikoina aihe on alkanut kiinnostaa. Nyt minua kuitenkin huvittaisi suunnitella jonkinlainen pienimuotoinen kieli ja toteuttaa sille tulkki. Ei minulla mitään uusia ideoita ole, mutta haluan kokeilla tätäkin. Vinkkejä ja linkkejä aiheeseen liittyen otetaan vastaan.
Tästä juontuu mieleen eräs ikuisuusprojektini, jonka on tarkoitus helpottaa fysiikan työselostusten tekoa. Ohjelman olisi tarkoitus ottaa syötteenä muuttujia arvoineen ja laskukaavoja. Tämän jälkeen ohjelma sijoittaisi kaavoihin muuttujien arvot ja tulostelisi laskut LaTeX-muodossa. Lisäksi muuttujien pohjalta tehtäisiin epävarmuuslaskut automaagisesti (säästäisi paljon vaivaa!). Nyt olen ajatellut laatia tälle oman kuvauskielen. Sen syntaksi on samanlainen kuin Lispissä, eli käyttää sexpejä, koska niitä on helppo parsia (tosin ajattelin käyttää sulkujen sijasta aaltosulkeita, joita minä tarvitsen fysiikan laskuissa paljon harvemmin).
Kohta viznut tai joku muu ehdottaa, että minun pitäisi vain suoraan tehdä ohjelma, joka laskee suoraan LaTeX-muotoisia kaavoja. En kuitenkaan tykkää kaavojen kirjoittamisesta siinä muodossa, joten ei.
Ja niin, tämän toteuttaminen vaatii paljon enemmän vaivaa, kuin se, että vain kirjoittelisin kaavat käsin ja laskisin laskut laskimella.
Muutamaan kertaan olen QB:llä kokeillut tehdä jonkinlaista skriptilaajennusta omille ohjelmilleni. Ikävä kyllä ongelmia tulee aina silmukoissa. Tämä siis on nimeltään LateScript. Olen aloittanut sen ~15 kertaa uusiksi ja aina olen jämähtänyt samaan paikkaan.
Ajattelin kerran tehdä symbolisen laskimen koneelleni. Sitten huomasin, että yliopiston mikroluokassa on Maple, joten jäi se projekti siihen.
Olen kyllä monta kertaa miettinyt oman ohjelmointikielen tekemistä, mutta en ole toistaiseksi saanut oikein mitään aikaan.
Joskus suunnittelin omaa Casion laskimen Basic-kielen tulkkia, jonka avulla laskinohjelmia voisi tehdä ensin tietokoneella. Ohjelman kirjoittaminen suoraan laskimeen on nimittäin raivostuttavaa, kun avainsanoja ei voi kirjoittaa suoraan, vaan ne pitää hakea erillisistä valikoista. Laskimen (Casio FX 1.0) suuren muistimäärän ansiosta melko laajojenkin ohjelmien tekeminen olisi mahdollista, jos ne vain jaksaisi toteuttaa vaatimattomalla Basic-kielellä.
Kerran myös aloittelin nettiselaimessa toimivaa QBasic-tulkkia, josta kerroin myös Ohjelmointiputkassa silloin, kun sivusto oli juuri aloittanut. Kunnianhimoisena tavoitteena oli luoda jonkinlainen automaattinen QBasic-koodivinkkien esikatselu. Projekti jäi kyllä kesken ennen kuin pääsin edes itse koodin tulkitsemiseen. QBI:n nimellä kulkenut viritys muistetaan lähinnä monista ponnahdusikkunoistaan, jotka pahimmillaan jumiuttivat käyttäjän selaimen.
Haaveenani olisi kyllä kehittää ohjelmointikieli, joka säästäisi ohjelmoijaa konemaiselta koodin kirjoittamiselta. Siirtäisin koneelle mieluusti sellaisen ohjelmointityön, jossa koodia täytyy vain naputella ilman, että joutuu todellisuudessa pohtimaan juuri mitään. Tämä muodostaa suuren osan ainakin minun ohjelmoimisestani. Tällaisen ohjelmointikielen tekeminen ei vain taida olla helppo tehtävä. Muuten kukaan tuskin ohjelmoisi nykyisellä tavalla.
Kyselin tästä puolisentoista vuotta sitten (lukaisin kyseisen aiheen juuri läpi), eikä silloin kovin ihmeitä vastauksia saanut. Pääsin silloin omassani siihen asti, että koodista karsittiin turhat välit ja kommentit pois. Joskus olisi kuitenkin tarkoitus saada todellista tulostakin aikaiseksi, jos peliprojektini taas jonain päivänä nytkähtää eteenpäin. Skriptikieli siis olisi kyseessä.
Varmaankin lähtisin liikkeelle siitä, että loisin yleispätevän muuttujatyypin, jonkinlaisen tyypin funktiolle ja tyypin, jota voisi linkittää peräkkäin ja joka muodostaisi koodin rakenteen. Sitten parsisin tavalla tai toisella koodista muuttujat (ja vakiot) ja katkoisin koodin lyhyemmiksi pätkiksi, joista jokaiseen liittäisin merkinnän, mihin siitä hypätään. Lopuksi linkittäisin funktiokutsut vastaaviin oikeisiin funktioihin.
Kaikkiaan siis helpoin mieleeni tuleva ratkaisu on juuri karsia koodi hieman assemblyn tyyppiseksi (konekielimäiseksi) palikkakoodiksi, eli suoritetaan aina tietty funktio tietyillä parametreilla, ja jos funktio sattuu olemaan ehto- ja hyppyfunktio, hypätään haluttuun kohti koodissa.
Itse olen tehnyt harjoitustyönä pienen kääntäjän, joka kääntää yksinkertaistettua java-koodia mips-arkkitehtuurille. Kurssilla tuli huomattua, että kääntäjän tekeminen ei oikeastaan ole lainkaan niin vaikeaa kuin aluksi kuvittelin. Apuna kannattaa käyttää valmiita ohjelmia, jotka automaattisesti muodostavat kielen kieliopista parserin ja syntaksipuunläpikäyjän. Pienen perehtymisen jälkeen yksinkertaisen tulkin pitäisi pystyä tekemään parissa päivässä. Toki ilman kunnon työkalujakin saa yksinkertaisen tulkin aika helposti aikaiseksi, mutta vähänkin isonpaa ja monimutkaisempaa kielioppia varten suosittelen jonkilaista apuohjelmaa.
Erilaisia compiler compiler -ohjelmia
http://dinosaur.compilertools.net/
https://javacc.dev.java.net/
Google löytänee lisää...
Joskus kirjoittelin pienen basic-tyylisen kielen, mutta ongelmaksi tuli sitten se, että kuinka voi käyttäjä kysellä käyttäjiltä asioita ja vastata ja tehdä toimintoja sen mukaan.
Olen myös kirjoitellut pienen "nettiselaimen", joka osaa tulkita html:ää, ainakin osittain. Projektista löytyy varmasti "nettiselain" hakusanalla jotain juttua vieläkin täältä foorumeilta (tai oikeastaan QB/VB -puolelta.)
Aihe on jo aika vanha, joten et voi enää vastata siihen.