Eli miten C kääntäjä tehdään. Ei varmaan sillain, että kovakoodataan komennot, nimittäin siihen en ala. Dev-cpp 5beta kin on tehty Delphillä. Tosin siinä ei oel kuin käyttöliittymä.
Mutta miten ihka oman kääntäjän voi tehdä? Optimoinnista on vielä turha edes puhua. Ainiin, miten voi tehdä edes C kielellä käynnistettävä ohje?
Virtuaali kone on tietenkin yks tapa, mutta aika "köyhä" ja siltikkihän tarvitaan EXE jonka virtuaali kone kaappaa(kai) ja suorittaa komennot. Tai sitten exe lähettää komennot virtuaali koneelle. Mutta silloinhan virtuaali kone olis ISO?
EDIT: ei jollain kielellä vaan C kielellä :P
EDIT2: "Tai sitten exe lähettää komennot virtuaali koneelle."
ZcMander kirjoitti:
Ei varmaan sillain, että kovakoodataan komennot, nimittäin siihen en ala.
En nyt ole varma mitä tolla tarkoitat mutta vähän sinne päin se on. Jos nyt kerran winukalle teet niin opettele eka miten exe-filut toimii. Se osoittautuu varmana sen verran vaikeaksi että et siihen ala :) Voisit tutkia myös jotain open source-c-compileria.
ZcMander kirjoitti:
Tosin siinä ei oel kuin käyttöliittymä.
Niin juuri. Ei lähelläkään kääntäjää. Mitä sitten mainitset dev-c++:n?
sooda kirjoitti:
ZcMander kirjoitti:
Ei varmaan sillain, että kovakoodataan komennot, nimittäin siihen en ala.
En nyt ole varma mitä tolla tarkoitat mutta vähän sinne päin se on. Jos nyt kerran winukalle teet niin opettele eka miten exe-filut toimii. Se osoittautuu varmana sen verran vaikeaksi että et siihen ala :) Voisit tutkia myös jotain open source-c-compileria.
Vois sitä, mutta veikkaan, että överiksi menee kuten sanoit.
"Ei varmaan sillain, että kovakoodataan komennot, nimittäin siihen en ala." Tolla tarkotin, että ei tehdä tyyliin
if (komento == "print") {
printtaa_teksti(komento(2)); //2 = 2 parametri
}lainaus:
Niin juuri. Ei lähelläkään kääntäjää. Mitä sitten mainitset dev-c++:n?
Koska se on hyvä esimerkki IDE:stä. Vaikkei ole oma tekemä kääntäjä. :P
Kaivele jostakin GCC:n (DJGPP:n tai MingW:n) lähdekoodi ja tutki siitä.
Veikkaisin, että aika moni C-kääntäjä kääntää koodin ensin Assemblyksi ja siitä sitten binääriksi. Assembly-kielen ja binäärin välillä on varmaankin jokin looginen yhteys (siis muutenkin kuin niin, että jokainen assembly-rivi on yksi konekielinen käsky) niin, että jokaista käskyä ei tarvitse laittaa if- tai case-lauseella vaan voidaan laskea binääriin kirjoitettava asia jotenkin algoritmisesti. Muuten kaikki eri operaatio-lähde-kohde-yhdistelmät veisivät varmaan aika paljon tilaa.
Nonih, ja voihan kääntäjään sisällyttää jonkun Assebly kääntäjän. Ongelmahan tulee miten saat C kielestä Asseblyn? Iffeillä :P No, ei vaiskaan. Entä sitten STL miten yleensä nuo voi toimia omassa kääntäjässä? Vai onko ne Tavallista C kieltä?
Eikös STL-jutut ole C++:aa? Jos STL nyt on se, miksi sitä kuvittelen.
Tutustupa kuitenkin ensin vaikka stdio.c -tiedostoon. C ei ole mikään QB, jossa kääntäjä tunnistaa suoraan komennon print. C-kääntäjä itse asiassa tunnistaa melkoisen vähän komentoja. printf-funktio on määritelty jossakin, ja se taas sisältää jotakin muuta, ja kaikki lopulta päätyy ihan perusasioihin, eli luetaan jostakin kohti muistia, suoritetaan matemaattisia operaatioita (jos muutetaan vaikka tekstiä luvuksi) ja laitetaan muistiin siihen kohti, mistä näyttömuisti löytyy.
http://www.cs.hut.fi/Opinnot/T-106.550/Luennot/index.html
Siitä vaan lukemaan, oli ihan hyvä kurssi :)
Lyhyesti kääntäjän tekeminen:
1. Kirjoitetaan kielen syntaksi jonkin lekserin ymmärtämään muotoon.
2. Tuotetaan lekserillä automaattisesti syntaksipuun käpikäyjä.
3. Luodaan symbolitaulut ja tehdään tyyppi- ja semantiikkatarkistukset käyttäen syntaksipuunläpikäyjää pohjana.
4. Muunnetaan koodi jollekin yksinkertaiselle välikielelle, jota on helpompi käsitellä ja optimoida kuin hankalan syntaksin omaavaa ohjelmointikieltä.
5a. Käytetään jotain valmista välikieli -> konekielikääntäjää.
5b. Optimoidaan välikieli ja tehdään alustava muunnos konekielelle käyttäen pseudorekistereitä.
6b. Tehdään lopullinen rekisteriallokaatio ja mahdollisti jotain pieniä muutoksia.
Mulki on ollu tavotteena tehä oma (pieni) kieli, mut en tiiä vielkää et mistä alottaa :P
Mitä niiq tarkottaa "lekseri"?
ZcMander kirjoitti:
Iffeillä :P No, ei vaiskaan.
Itse olen ihan kokeilumielessä tehnyt noin :). Kieltämättä huono tapa, mutta jotain yksinkertaista (tyyliin kertotaulu) olen saanut tällä "kielelläni" tehtyä. Pointtini on siis se, että jos ei ihan vakavissaan ole tekemässä, niin IF:llä voi ainakin kokeilla.
Lekseri on ohjelma, joka tekee sulle alustavan ohjelman, joka osaa erotella käännettävästä koodista eri osat kuten muuttujat, funktiot, vakiot, sijoituslauseet ja muut rakenteet.
Tähän pohjaohjelmaan pitää kuitenkin lisätä kaikenlaisia ominaisuuksia (tyyppitarkastus jne.) ennen kuin kääntäjä on valmis.
Tuolla on esitelty pari tunnettua lekseriä ja muutakin kääntäjäasiaa:
http://dinosaur.compilertools.net/
ZcMander kirjoitti:
Eli miten C kääntäjä tehdään.
ei kannata edes yrittää, yksin et saa ikinä valmiiksi. Sitä tehdään muuten assemblyllä
aWW kirjoitti:
ZcMander kirjoitti:
Eli miten C kääntäjä tehdään.
ei kannata edes yrittää, yksin et saa ikinä valmiiksi. Sitä tehdään muuten assemblyllä
Kyllä gcc ja monet muutkin C-kääntäjät on kyllä kirjoitettu ihan C:llä (ja ne on jopa käännetty itsellään :). C-kieli ei lisäksi ole kovin monimutkainen kieli, joten yksinkertaisen kääntäjän tekeminen, joka ei tuota kovin optimoitua koodia on varsin helppoa. Aikaa hommaan saa kuitenkin palamaan varsin paljon, jos ei ole tutustunut kääntäjien tekoon entuudestaa.
Kannattaa kuitenkin ehkä aloittaa tekemällä, jonkin pienen itsemääritellyn kielen tulkki ennen kuin aloittaa tekemään oikean ohjelmointikielen kääntäjää.
pitää olla järkevä, yksin kukaan ei saa valmiiksi tällaista projektia valmiksi
Aihe on jo aika vanha, joten et voi enää vastata siihen.