Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
marzec
Anmeldungsdatum: 13.10.2004 Beiträge: 267
|
Verfasst am: 04.06.2005, 13:03 Titel: c toy compiler |
|
|
hey,
für di uni muß ich zur zeit einen c toy compiler schreiben, den ersten Teil ( lexer/parser/AST/typecheking system hab ich vor einen monat in vier tagen geschrieben. letzte woche kam dann die nächste aufgabe daher: den compiler so erweitern dass er vom AST aus intermediate code generiert ( eine art vorstufe zum assembler code ). ich dachte mir das würde lang dauern aber nach zwei tagen war auch das geschafft. hier ein überschaubares beispiel:
the original c program
Code: |
void scanf( void* formatstring, void* argument );
void printf( void* formatstring, int argument );
int x,y;
int gcd(int a, int b){
int result;
if(b == 0){
result = a;
} else {
result = gcd(b, a % b);
}
return result;
}
int main(){
scanf("%d", &x);
scanf("%d", &y);
printf("%d\n", gcd(x, y));
}
|
der intermediate code dazu
Code: |
label __L3
string "%d"
label __L4
string "%d"
label __L5
string "%d\n"
global x 0
global y 1
function gcd 2
local a 0
local b 1
local result -1
local __t1 -2
local __t2 -3
local __t3 -4
local __t4 -5
__t1 = intconst 0
__t2 = b int== __t1
ifint __t2 goto __L1
param b
__t4 = a int% b
param __t4
call gcd 2
getresultint __t3
result = __t3
goto __L2
label __L1
result = a
label __L2
returnint result
function main 0
local __t1 -1
local __t2 -2
local __t3 -3
local __t4 -4
local __t5 -5
local __t6 -6
__t1 = pointerconst __L3
param __t1
__t2 = & x
param __t2
call scanf 2
__t3 = pointerconst __L4
param __t3
__t4 = & y
param __t4
call scanf 2
__t5 = pointerconst __L5
param __t5
param x
param y
call gcd 2
getresultint __t6
param __t6
call printf 2
|
zugegebenermaßen ist der intermediate code noch komplett unoptimiert, aber er funktioniert . ich wollte ursprünglich einen interpreter für den intermediate code schreiben, aus zeittechnischen geht das zur zeit aber leider nicht. wer sich also dran wagen will, einfach hier posten ich kann ein paar tipps geben und natürlich die specs zum intermediate code.
was noch ansteht ist die generierung von x86 assembly code. da der im code dem schon recht nahe ist ist dieser schritt nicht mehr wirklich schwierig. ziel ist es meine programme dann mit anderen clibs zu verlinken und so eine art kleine scriptsprache zu schaffen. wirklich nützlich ist das ding in diesem zustand aber natürlich nicht .
der compiler ist in java mit hilfe von jflex und cup geschrieben ( ein lexer, parser generator ), ich werde noch eine stand alone exe für windows kompilieren damit man sich nicht extra die jre/jdk runterladen muß
the compiler versteht ein subset von c:
+ forward declarations ( erste zwei zeilen im c code oben z.B. ) damit wir später mit clibs linken können
+ datatypes: int, float und pointer ( funktionieren wie in c )
+ functions
+ if else statement
+ for statement
+ mathematische operatoren +, -, *, / und %
+ logische operatoren || und &&
+ relationelle operatoren ==, <, > <=, >=, !=
+ pointer arithmetics ( genau das hehe )
+ stringliterals welche automatisch angelegt werden und nach außen hin wie void pointer erscheinen ( zur zeit noch keine chars daher ist das die einzige möglichkeit )
und noch ein paar dinge die ich vergessen hab
java source und class files
http://ratatoskr.dragonhill.cc/temp/cc/ass3.rar
um den compiler zu starten müßt ihr zumindest die jre 1.4.6_02 installiert haben. des weiteren muß java.exe in eurem pfad sein damit ihr von der kommando zeile aus den compiler aufrufen könnt. sind die vorraussetzungen da dann z.B. einfach
compile tests\gdc.c
im dem verzeichnis eingeben wohin ihr das rar archiv entpackt habt und das ding generiert euch den intermediate code für das c file.
um den compiler selbst zu kompilieren einfach cb_build eingeben.
EDIT:
ok hier die standalone exe
http://ratatoskr.dragonhill.cc/temp/cc/tcc.rar
einfach ins selbe verzeichnis wie das sourcepackage entpacken dann könnt ihr die test files im tests verzeichnis verwenden
tcc tests\gdc.c
spuckt obiges zeugs aus _________________ Yagl - yet another gameprogramming library |
|
Nach oben |
|
 |
marzec
Anmeldungsdatum: 13.10.2004 Beiträge: 267
|
|
Nach oben |
|
 |
Kraftraum
Anmeldungsdatum: 02.09.2005 Beiträge: 2 Wohnort: Kiel
|
Verfasst am: 15.11.2005, 23:34 Titel: |
|
|
Hallo Mario,
habe mir den Compiler runtergeladen und angesehen da ich an einem eigenen Compilerprojekt arbeite. Schöne Arbeit.
Entwickelst Du noch weiter?
Gruß Jörg _________________ Ich kaufe mir ein E
 |
|
Nach oben |
|
 |
marzec
Anmeldungsdatum: 13.10.2004 Beiträge: 267
|
Verfasst am: 16.11.2005, 04:31 Titel: |
|
|
nope schon sehr lang nicht mehr war für einen uni kurs und is auch irgendwie recht sinnbefreit hehe. gcc hat alles was ich brauch. aber als beispiel implementierung sollte das ding ganz gut sein.
an was genau arbeitest du? _________________ Yagl - yet another gameprogramming library |
|
Nach oben |
|
 |
Kraftraum
Anmeldungsdatum: 02.09.2005 Beiträge: 2 Wohnort: Kiel
|
Verfasst am: 17.11.2005, 00:39 Titel: |
|
|
Nach Deiner Uhrzeit scheinst Du einer der Fühaufsteher oder der Spätgeher zu sein
Ich habe meine etwas alten Projekte (upps .. bereits 9 Jahre alt) mal wieder zum Leben erweckt um zu sehen, was sich damit alles mit Freebasic treiben lässt.
Das eine Projekt ist ein Basic-Interpreter in Java mit dem Ziel, das Ding kleiner 20K zu halten ... klappt bis jetzt ganz gut (nett, aber ruht mal wieder); dass andere eine Umsetzung meiner (damaligen) Lieblingssprache Amiga E.
Der Compiler ist (noch) GammaGamma, kann aber bereits alle Befehle und Typen verarbeiten. OO ist noch out, aber wenn ich mal wieder ein bischen Zeit habe ...
Zielplattform für den Compiler war übrigens eine eigene virtuelle Stackmaschine bzw. in der zweiten Stufe ein eigener virtueller Prozessor der ebenfalls fertig ist. Deshalb fand ich es ganz amüsant das Du auch an einem Zwischencode gearbeitet hast.
Wenn Du was zu E suchst schau mal auf http://wouter.fov120.com/e/ nach.
Viele Grüsse Jörg _________________ Ich kaufe mir ein E
 |
|
Nach oben |
|
 |
marzec
Anmeldungsdatum: 13.10.2004 Beiträge: 267
|
Verfasst am: 17.11.2005, 05:08 Titel: |
|
|
e is lustig hehe
jo zwischencode is voll funktionsfähig drinnen, was fehlte war in interpreter. der wäre recht einfach zu basteln gewesen ich hab mich dann aber doch für im code -> asm code entschieden. _________________ Yagl - yet another gameprogramming library |
|
Nach oben |
|
 |
|