Olen alkanut suunnitella oman ohjelmointikielen toiteuttamista, kielen tavoite olisi näytönsäästäjät (2 - 3D, aluksi vain 2D) Syntaksi on hieman kesken, eli hieomista löytyy vielä. Elikkäs mites syntaksin hieomisten jälkeen tulisi toimia että saisin siitä toimivan kielen?
Helpointa on kääntää koodi jollekin yleiselle kielelle (esimerkiksi C++:ksi) ja käyttää sitten lopulliseen käännökseen valmista kääntäjää (lainata esimerkiksi GCC:stä). (Kokonaisen Win32-ohjelmia tuottavan kääntäjän teko ei varmaan ole vielä sopiva homma, jos joudut tuollaisen kysymyksen esittämään.)
Kiitos vinkisä.
Onko mahdollista käyttää grafiikan piirtämiseen jotakin valmista kirjastoa, esim. OpenGL:ää?
Jos tavoitteena on pelkästään helpottaa näytönsäästäjien koodaamista, kannattaa miettiä, voisiko sen toteuttaa kirjastona jollekin olemassa olevalle kielelle. Kokonaan uuden kielen suunnittelu ja toteutus on aika iso projekti.
Koodia voi myös tulkata kääntämisen sijaan. Tulkki on yleisesti ottaen kääntäjää helpompi toteuttaa, mutta hitaampi kuin käännetty ohjelma.
Wikipediasta ja googlella löytyy helposti lisätietoa (tulkki on englanniksi interpreter ja kääntäjä compiler).
Grafiikkakirjastojen käyttö on totta kai mahdollista.
Tuo pelkän kirjaston luominen vaikuttaa aika paljon helpommalta toteuttaa...
Millä kielellä sellainen kannattaa toteuttaa, itse olen käyttänyt Mikkisoftia: Vb.net, C++, C#.
Ja vielä toinen kysymys onnistuuko omaan kirjastoon "sotkemaan" OpenGL:ää?
Miten niin "sotkemaan"? OpenGL:llää voi siis käyttää grafiikan piirtämiseen ihan normaalisti myös "kirjastoissa".
Aattelin kirjottaa pienen pätkän tänne kääntäjistä, kun tänne varmaankin joku jossain vaiheessa eksyy etsiessään suomeksi tietoa ohjelmointikielten toteutuksesta.
<lyhyt ja monesta paikkaa rankasti pelkistetty selostus>
Kääntäjähän koostuu kahdesta osasta, front-endistä ja back-endistä. Front-end muuttaa lähdekielisen ohjelman intermediate representationiksi, ja back-end muuttaa intermediate-representationin kohdekieleksi, joka voi olla suorituskelpoinen ohjelma/objektikoodia, assemblyä, tai jotain korkean tason kieltä. Näin voidaan kirjoittaa vain yksi back-end ja sille useita front-endejä tai toisin päin, eikä joka kombinaatiolle tarvita kokonaan uutta kääntäjää.
Front-endissä ensimmäisenä on skanneri (scanner, lexical analyzer, tokeniser). Skanneri lukee lähdekoodia ja jakaa sen pienemmiksi osiksi, "tokeneiksi", kuten (if), (id, "foo") tai (integer, 55). Yleinen tapa on suunnitella homma säännöllisillä lausekkeilla ja muuttaa regexit DFA:ksi suoraan tai NFA:n kautta.
Skannerin jälkeen on jäsennin (parser, syntactic analyzer). Se tarkistaa onko käännettävä ohjelma syntaksiltansa lähdekielen mukainen. Parserialgoritmit jaetaan top-down parsereihin (LL, recursive descent) ja bottom-up parsereihin (LR, LALR ja kumppanit). Top-down parserit ovat helpommin toteutettavissa kuin bottom-up parserit, mutta bottom-up parsereilla pystyy jäsentämään useamman tyyppisiä kielioppeja. Kun käännettävä ohjelma on todettu syntaksiltaan oikeelliseksi, tarkistetaan sen semanttinen oikeellisuus, kuten tietotyyppien vastaavuus, ettei esimerkiksi liukulukumuuttujaan yritetä sijoittaa merkkijonoa.
Semanttisen analyysin jälkeen tuotetaan intermediate representation, kuten three-address code tai static single assignment form.
Back-endin tehtävänä on optimoida ohjelmaa ja tuottaa kohdekielinen ohjelma. Koodin optimointi kääntäjän vaikein osa. Yksinkertaisen kohdeohjelmaa optimoivattoman kääntäjän kirjoittaminen ei ole kovin iso homma, hauska vaihe tulee siinä, kun kirjoitetaan code optimizeria.
</lyhyt ja monesta paikkaa rankasti pelkistetty selostus>
Kääntäjistä on kirjoitettu aika paljon kirjallisuutta. Suosittelisin lukemaan Keith Cooperin ja Linda Torczonin Engineering a Compiler. Ehdoton klassikko, johon varmana jokainen kääntäjiin perehtyvä jossakin vaiheessa törmää on Compilers: Principles, Techniques, and Tools, aka Dragon book.
Aihe on jo aika vanha, joten et voi enää vastata siihen.