Juu u, elikkäs itseäni alkoi kiinostamaan tämä asia. Olen jo kauan suunitellut oman pikku ohjelmointikielen tekoa. Suurin ongelma on vain ollut että miten luoda oma kääntäjä joka luo puhtaan konekielisen .exe, mutta olen nytten saanut hieman vihiä, että täysin omaa kääntäjää ei tarvitse tehä. Esimerkiksi Suomalainen CoolBasic:in .exe sisältää käsitykseni mukaan sisäisen tulkin eli koodia ei suoraan kääneetä puhtaaksi konekieleksi.
Elikkäs olisiko tuon oma kääntäjän teko miten vaikeaa ja miten se teoriassa tulisi tehdä? Eli miten koodista saadaan käänettyä tuo konekielinen .exe?
Eli kieli toteutettaisiin C/C++:lla.
Ei hän tässä mitään järkeä ole mutta olisi kiva kokeilla tehdä jonkinlainen oma ohjelmointikieli, vaikkapa sellanen jonka avulla nytten voisi luoda vaan alkukantaisen "Hello World":in. :D
Minä lähtisin tekemään hommaa niin, että kääntäjäni kääntäisi oman koodin Assemblyksi, joka sitten käännettäisiin konekielelle valmiilla assemblerilla. Näinhän toimii esimerkiksi gcc.
Tietty jos ei ole aivan pakko saada tehdä kääntäjää voi tehdä tulkin, mikä onkin huomattavasti helpompaa.
Yksi vaihtoehto voisi olla tehdä oma skriptikieli ja sille sitten tulkki. Kun saat tämän aikaiseksi, siitä on varmasti helppo suunnitella coolbasicin tapainen toteutus ja tämän jälkeen voisi sitten harkita hardcore ohjelmointikielen tekemistä.
Vielä yksi vaihtoehto on se että kääntäjäsi muuttaa ohjelmointikielesi koodin vaikka c:ksi ja tämän jälkeen erillinen kääntäjä kääntää c:n exe:ksi. Ns. muuttaja voisi toimia tähän tapaan:
Oma ohjelmointi kielesi:
print "Hello World"
Muunto-ohjelmasi muuttaa sen muotoon:
#include <stdio.h> int main(void) { printf("Hello World"); return 0; }
Lopuksi se käännetään exeksi esim gcc tai muun kääntäjän avulla.
petrinm kirjoitti:
Vielä yksi vaihtoehto on se että kääntäjäsi muuttaa ohjelmointikielesi koodin vaikka c:ksi ja tämän jälkeen erillinen kääntäjä kääntää c:n exe:ksi. Ns. muuttaja voisi toimia tähän tapaan:
...tuota itsekkin ole miettinyt, mutta sittenhän pitäisi löytyä koneelta jokin C/C++ kääntäjä kuten gcc. En usko tämän kuitenkaan haittaavan jos teen kielen vaan omaan käyttöön.
Alankin työstämään kieltäni tällä tekniikalla.
Edit1: Minua vielä kiinostaisi tuo CoolBasicin tekniikka, eli miten CB exen kääntäminen toimii?
Kannattaa tutustua myös flex ja bison (tai lex ja yacc) ohjelmiin. Näitä käyttämällä saat tehtyä tulkin tai kääntäjän suht. helposti.
Tätä asiaa on minullakin itseäni, jo kiinnostannut myös pidemmän aikaa, mutta itelläni ongelma on ainoastaan siinä, että tulkkini ei osaa hakea ulkoisesta tidostosta komentoja ja kääntää se sisäisesti isessää suoritettavaksi ohjelmaksi.
Osaan tehdä tulkin, joka kääntää itsessään sisäisiä komentoja, jotka ovat jo itseensä koodattuja, mutta haluaisin tehdä sellaisen, tulkin es. Jos kirjoitan erillisen txt -tiedoston jossa olisi tämän tulkin komennot ja es. avaisin ton tulkin ja antaisin tämän tiedoston nimen niin se osaisi lukea tämän tiedoston ja suorittaisi tästä tiedostossa olevat komennot itsessään.
Oman kielen teko ei ole mitään helppoa hommaa. Silti se onnistuu (itselläni on kokemusta). Tässäpä pieni tehtävälista, jota kannattaa käydä katsomaan.
Valmistelut:
- päätä kielen syntaksi (Basic-tyylinen syntaksi voi olla aloittelijalle helpoin toteuttaa)
- aseta kielelle tavoitteet (grafiikan piirtäminen? konsolin käyttö?)
- mieti kielen ominaisuudet (Integer, Float, If, For, Function...)
- dokumentoi ajatuksesi!
- ole realitinen omien taitojesi suhteen!
Itse kääntäjän toiminta:
1) avaa tiedosto
2) lue rivi
3) pilko rivi osiin (tokeneihin)
4) tee rivistä järjestelmällinen rakenne (esim. pino tai jono) kts. http://en.wikipedia.org/wiki/
5) tee tämän rakenteen pohjalta tavukoodi
6) siirry seuraavaan riviin
Aihe on jo aika vanha, joten et voi enää vastata siihen.