Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

c toy compiler

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Off-Topic-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
marzec



Anmeldungsdatum: 13.10.2004
Beiträge: 267

BeitragVerfasst am: 04.06.2005, 13:03    Titel: c toy compiler Antworten mit Zitat

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 lächeln ). 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 lächeln. 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 lächeln.

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 lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
marzec



Anmeldungsdatum: 13.10.2004
Beiträge: 267

BeitragVerfasst am: 12.06.2005, 00:20    Titel: Antworten mit Zitat

in den letzten paar tagen einiges weiter gebracht. hier das komplette package mit standalone exe. windows und linux version + source

http://ratatoskr.dragonhill.cc/temp/cc/tcc-win32-linux-0.02.rar

für 12 tage arbeit ganz ok. das package enthält eine ausführliche readme plus einige example programme. einfach mal reingucken.
_________________
Yagl - yet another gameprogramming library
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Kraftraum



Anmeldungsdatum: 02.09.2005
Beiträge: 2
Wohnort: Kiel

BeitragVerfasst am: 15.11.2005, 23:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
marzec



Anmeldungsdatum: 13.10.2004
Beiträge: 267

BeitragVerfasst am: 16.11.2005, 04:31    Titel: Antworten mit Zitat

nope schon sehr lang nicht mehr Zunge rausstrecken 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
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Kraftraum



Anmeldungsdatum: 02.09.2005
Beiträge: 2
Wohnort: Kiel

BeitragVerfasst am: 17.11.2005, 00:39    Titel: Antworten mit Zitat

Nach Deiner Uhrzeit scheinst Du einer der Fühaufsteher oder der Spätgeher zu sein happy

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. lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
marzec



Anmeldungsdatum: 13.10.2004
Beiträge: 267

BeitragVerfasst am: 17.11.2005, 05:08    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Off-Topic-Forum Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz