Jep! Onkohan mulla liikaa aikaa näin kesäisin, mutta ;) onkohan missään esimerkkiä (c/c kääntäjän lähdekoodia), joka kääntää c/c syntaksin x86 konekielelle (tai vaikka tavukoodiksi!??).
Olis mielenkiintoista kokeilla oman kielen tekoa, joka olis c/c kaltainen, jossa olis ominaisuuksia javasta ja Object Pascal kielestä, lopputulos käänntyis tavukoodiksi vähän javan tapaan, mutta ei moneksi class tiedostoiksi vaan yhdeksi tiedostoksi, exe tiedoston tapaan.
Myöhemmin lopullisen tavukoodin vois erillisellä kääntäjällä kääntää natiiviksi konekieliseksi tiedostoksi eri ympäristöille.
Mitään graafisia härpäkkeitä ei aluksi tarttis olla, vaan kääntäminen ja ohjelmien ajo tapahtuis konsolissa.
Käännösprosessin kun sais vielä yhtä nopeeksi kuin Delphissä ;)
Tässä olis äkkiseltään kuviteltu syntaksi:)
//============================
join system, utils;
int g_muuttuja = 0;
class CLuokka
{
private // yksityisiä jäsenmuuttujia
int x, y;
float f;
string t;
public // julkiset metodit
CLuokka() {}
CLuokka(const string s);
void tulosta(int m);
void muuta(int& m);
property string teksti = { read = t, write = t };
};
// with lohkon sisään vois kirjottaa itse metodit
with CLuokka {
CLuokka(const string s) {
this.t = s;
}
void tulosta() {
System.out.printf( "teksti = %s\n", this.t );
}
void tulosta(int m) {
System.out.printf( "luku = %d\n", m );
}
// vastaava kuin pascalin (var m: Integer)
void muuta(int& m) {
int apu = ( m * 2 );
m = apu;
}
}
void main()
{
CLuokka olio;
CLuokka& oliot = new CLuokka[ 100 ];
for( int i=0; i
Olis mielenkiintoista kokeilla oman kielen tekoa, joka olis c/c kaltainen, jossa olis ominaisuuksia javasta ja Object Pascal kielestä, lopputulos käänntyis tavukoodiksi vähän javan tapaan, mutta ei moneksi class tiedostoiksi vaan yhdeksi tiedostoksi, exe tiedoston tapaan.
Myöhemmin lopullisen tavukoodin vois erillisellä kääntäjällä kääntää natiiviksi konekieliseksi tiedostoksi eri ympäristöille.
Mitään graafisia härpäkkeitä ei aluksi tarttis olla, vaan kääntäminen ja ohjelmien ajo tapahtuis konsolissa.
Käännösprosessin kun sais vielä yhtä nopeeksi kuin Delphissä ;)
Tässä olis äkkiseltään kuviteltu syntaksi:)
//============================
join system, utils;
int g_muuttuja = 0;
class CLuokka
{
private // yksityisiä jäsenmuuttujia
int x, y;
float f;
string t;
public // julkiset metodit
CLuokka() {}
CLuokka(const string s);
void tulosta(int m);
void muuta(int& m);
property string teksti = { read = t, write = t };
};
// with lohkon sisään vois kirjottaa itse metodit
with CLuokka {
CLuokka(const string s) {
this.t = s;
}
void tulosta() {
System.out.printf( "teksti = %s\n", this.t );
}
void tulosta(int m) {
System.out.printf( "luku = %d\n", m );
}
// vastaava kuin pascalin (var m: Integer)
void muuta(int& m) {
int apu = ( m * 2 );
m = apu;
}
}
void main()
{
CLuokka olio;
CLuokka& oliot = new CLuokka[ 100 ];
for( int i=0; i
Vastaukset 6
Vanhimmat
http://www.angelfire.com/dragon/letstry/tutorials/compiler/
http://www.realworldtech.com/page.cfm?ArticleID=RWT041902173146
http://catalog.compilertools.net/java.html
Löytyhän niitä linkkejä :)
90-luvun puolivälissä tuli väännettyä osittain toimiva Basic tulkki (dosissa toimiva), joka käänsi koodista (itse keksimäni) assemblerin mukaista koodia, jota tulkki sitten suoritti...ns. tavukoodia.
Jotenki muistu mieleen tämä ja c/c , object pascal ja java ovat hyviä kieliä, saameri kun ne hyvät ominaisuudet kustakin kielestä vois yhdistää :)
Vieläkö sais yhdistettyä OpenGL rajapinnan tähän kieleen, jonkin sortin "pelinteko-ohjelmointikieli", jolla vois tehdä kokoruututilassa toimivia pelejä ;)
joo..
Ihan kiva idea että saman tavukoodin vois sitten vielä kääntää eri käyttiksille ja suoritinarkkitehtuureille (x86,PPC,ARM...). Microsoftin .NET:in idea on juuri se että koodi käännetään tavukoodiksi ja tulkataan suoritusvaiheessa... mutta ei oikein hyödytä kun ohjelmat toimii vain MS:n omilla käyttiksillä (WinCE, PocketPC...).
Siinä vaiheessa kun tavukoodi muutetaan natiiviksi koodiksi kannattaa varmaankin tehdä suurin osa optimoinneista... esim käyttää MMX, SSE, 3DNow! ja muita härveleitä :)
Itse yritin tehdä omaa kääntäjää joka sisältäisi ominaisuuksia pascalista ja assemblerista niin että siinä yhdistyisi assyn teho ja helppo koodattavuus syntaksi oli jotakuinkin tällaista:
eax := i 12;//kääntyisi "mov eax,[i]; add eax,12
foo(eax edx);//add eax,edx; push eax; call @foo
mutta en koskaan päässyt DOSsin .com ohjelmia pidemmälle kun en tajunnut miten suorittimen saa "kytkettyä" 32-bittiseen tilaan DOSissa :)
Siitä on aikaa kun jotain pieniä "Hello World" ohjelmia teki assylla DOSille, joskus vuonna 1998 ja kivikaus sitten ;) Myös Atari ST:llä tuli kokeiltua Motorolan MC68000 assempler koodausta kokeilumielessä aikoinaan.
Mutta tuo oman tavukoodin (assy) vaihe olis semmonen helppo välivaihe ja jos tulkkiohjelman tekee Windowssille ja linuxille, niin sama tavukoodin käännös/suoritus onnistuis helposti eri ympäristöille.
Mutta kiinnostas myös tosissaan ihan oikeen Assemplerin (x86) opiskelu ja kertaus ihan kunnolla, se kait se on lähtökohta jos omaa kääntäjää lähtis tekemään, mut tuolla tavukoodilla pääsis ns. välivaiheeseen.
Toisaalta aika nopeeksi ovat saaneet tuon javan tavukoodi systeemin myös kehitettyä, kokeilin OpenGL grafiikan ohjelmointia javalla ja ei se paljoo hävinnyt aidolle c :lla käännetylle versiolle, tosin isojen 3D-mallien latailut kesti kauemmin, mitä c käännetyllä softalla.
>Ihan kiva idea että saman tavukoodin vois sitten vielä kääntää eri käyttiksille ja suoritinarkkitehtuureille (x86,PPC,ARM...). Microsoftin .NET:in idea on juuri se että koodi käännetään tavukoodiksi ja tulkataan suoritusvaiheessa... mutta ei oikein hyödytä kun ohjelmat toimii vain MS:n omilla käyttiksillä (WinCE, PocketPC...).
Kyllä sekä Javan että .NETin tavukoodia voi kääntää Linuxille. (Käyttöjärjestelmäriippuvat tms. jutut ei sitten kyllä käänny.)
http://www.go-mono.com/
>Itse yritin tehdä omaa kääntäjää joka sisältäisi ominaisuuksia pascalista ja assemblerista niin että siinä yhdistyisi assyn teho ja helppo koodattavuus
Ei kannata ympätä optimoivan kääntäjän ominaisuuksia kieleen liian suoraan. Kääntäjän optimointia voi toki avittaa pragmoilla sun muilla, mutta yleensä ei se teho ole pullon kaula vaan koodin toimivuus. Laajemmissa ohjelmissa homman pitäminen hanskassa on pullonkaula.
Koodauksen helpottaminen on myös syvältä. Olkoon koodaus miten vaikeaa tahansa, kunhan koodi on mahdollista ja käännöksen jälkeen tekee sen mitä minä haluan eikä omiaan.
Microsofthan on kulkenut umpikujaan käytön "helppoudella". Jos tekee jotain yksinkertaista niin se on pari riviä. Jos tekee jotain monimutkaisempaa niin sitten se ei toimi kunnolla tai sitä on mahdotonta tehdä.
Ohjelmointikielten merkittävin kehitys onkin tapahtunut viimeksi ohjelmointikielten ulkopuolella: spesifikaatiokieli UML ja design patterns.
FreePascal (niinkuin jotkut c-kääntäjätkin)
on saatavissa useille prosessoreille (x86,PPC,ARM...) ja kääntävät natiivikoodiksi.
FreePascalin lähdekoodit ovat myös saatavissa
( http://www.freepascal.org/ )
FreePascalin päälle on tehty myös graafinen ohjelmankehitysympäristö Lazarus (senkin koodi on avointa.
( http://www.lazarus.freepascal.org/ )