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:

Compilerbau: Codegenerierung

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
hitori04



Anmeldungsdatum: 21.04.2011
Beiträge: 53

BeitragVerfasst am: 17.02.2013, 22:53    Titel: Compilerbau: Codegenerierung Antworten mit Zitat

Hey, ich habe mir vor kurzem ein neues Buch zum thema Compilerbau besorgt und komme soweit auch ganz gut klar, jetzt ist aber eine sache doof bzw missgünstig daran und zwar ist das buch so geschrieben dass ich damit zwar einwandfrei einen interpreter (parse und co inklusive) schreiben kann mit genug übung es wird aber nicht genau behandelt wie nun der compiler eine lauffähige exe erzeugt ich meine ich möchte ja eben genau das umsetzen, anhand einer kleinen programier sprache (die erstmal nicht viel können soll variablen deklariene typen definierung, input, output und die mathematischen sachen eben (addition, subtraktion usw usw ...)) die ich mit passendem compiler zu lauffähigen programmen umwandeln kann ..vielleicht kann mir hier jemand etwas weiter helfen, mich gar aufklären ...

vielen dank wie immer im vorraus
lächeln

Editiert durch Moderator: Ursprünglichen Thementitel "Rein aus Interesse und Neugier" ersetzt. (Sebastian)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 25.02.2013, 18:23    Titel: Compiler Antworten mit Zitat

Der Teil des Compilers der lauffähige Programme bzw. eine Vorstufe davon erzeugt nennt sich Emitter. Freebasic erzeugt z.B. Assembler Code der vom Assember GAS http://de.wikipedia.org/wiki/GNU_Assembler in Maschinensprache gewandelt wird. Es können mehrere Module und/oder statische Libraries vom Linker zu einer Anwendung oder Library zusammengeführt werden.

Wenn du "fbc -r" eingibst, werden nur die asm Dateien erzeugt

Wenn du "fbc -R" zum kompilieren verwendest werden nach kompilieren und linken die asm Dateien belassen und nicht gelöscht. Guck dir mal die asm dateien an.



Kompiliert mit "fbc -R test.bas"
Code:
Dim As Integer a,b
a=10
b=20
a = a+b
Print a


wird zu test.asm
Code:

   .intel_syntax noprefix

   #test.bas' compilation started at 17:29:53 (FreeBASIC 0.25.0)

.section .text
.balign 16

.globl _main
_main:
push ebp
mov ebp, esp
and esp, 0xFFFFFFF0
sub esp, 12
mov dword ptr [ebp-4], 0
call ___main
push 0
push dword ptr [ebp+12]
push dword ptr [ebp+8]
call _fb_Init@12
.Lt_0002:
mov dword ptr [ebp-8], 0
mov dword ptr [ebp-12], 0
mov dword ptr [ebp-8], 10
mov dword ptr [ebp-12], 20
mov eax, dword ptr [ebp-12]
add dword ptr [ebp-8], eax
push 1
push dword ptr [ebp-8]
push 0
call _fb_PrintInt@12
.Lt_0003:
push 0
call _fb_End@4
mov eax, dword ptr [ebp-4]
mov esp, ebp
pop ebp
ret
   #test.bas' compilation took 0.0001573227785343079 secs



Kompiliert mit Debug Infos "fbc -g -R test.bas"
Code:

   .file "test.bas"
   .stabs "D:\\opt\\FbEdit1068\\Projects\\",100,0,0,.Lt_0002
   .stabs "test.bas",100,0,0,.Lt_0002

.section .text
.Lt_0002:
   .stabs "integer:t1=-1",128,0,0,0
   .stabs "void:t7=-11",128,0,0,0
   .stabs "byte:t2=-6",128,0,0,0
   .stabs "ubyte:t3=-5",128,0,0,0
   .stabs "char:t4=-2",128,0,0,0
   .stabs "short:t5=-3",128,0,0,0
   .stabs "ushort:t6=-7",128,0,0,0
   .stabs "uinteger:t8=-8",128,0,0,0
   .stabs "longint:t9=-31",128,0,0,0
   .stabs "ulongint:t10=-32",128,0,0,0
   .stabs "single:t11=-12",128,0,0,0
   .stabs "double:t12=-13",128,0,0,0
   .stabs "string:t13=s12data:15,0,32;len:1,32,32;size:1,64,32;;",128,0,0,0
   .stabs "fixstr:t14=-2",128,0,0,0
   .stabs "pchar:t15=*4;",128,0,0,0

   .stabs "test.bas",130,0,0,0
   .intel_syntax noprefix

   #test.bas' compilation started at 17:20:09 (FreeBASIC 0.25.0)
   .stabs "main",42,0,1,_main
   .stabd 68,0,1
   .stabs "main:F1",36,0,1,_main
   .stabs "__FB_ARGC__:p1",160,0,0,8
   .stabs "__FB_ARGV__:p16=*17=*4",160,0,0,12
.balign 16

.globl _main
_main:
   push ebp
   mov ebp, esp
   and esp, 0xFFFFFFF0
   sub esp, 12
   .stabn 68,0,1,_main-_main
   mov dword ptr [ebp-4], 0
   call ___main
   push 0
   push dword ptr [ebp+12]
   push dword ptr [ebp+8]
   call _fb_Init@12
.Lt_0003:
.Lt_0005:
##Dim As Integer a,b
   mov dword ptr [ebp-8], 0
   mov dword ptr [ebp-12], 0
.stabn 68,0,1,.Lt_0005-_main
.Lt_0006:
##a=10
   mov dword ptr [ebp-8], 10
.stabn 68,0,2,.Lt_0006-_main
.Lt_0007:
##b=20
   mov dword ptr [ebp-12], 20
.stabn 68,0,3,.Lt_0007-_main
.Lt_0008:
##a = a+b
   mov eax, dword ptr [ebp-12]
   add dword ptr [ebp-8], eax
.stabn 68,0,4,.Lt_0008-_main
.Lt_0009:
##Print a
   push 1
   push dword ptr [ebp-8]
   push 0
   call _fb_PrintInt@12
.stabn 68,0,5,.Lt_0009-_main
.Lt_0004:
   push 0
   call _fb_End@4
   mov eax, dword ptr [ebp-4]
   mov esp, ebp
   pop ebp
   ret
   .stabn 68,0,6,.Lt_0004-_main
   .stabs "A:1",128,0,0,-8
   .stabs "B:1",128,0,0,-12
   .stabn 192,0,0,.Lt_0003-_main
   .stabn 224,0,0,.Lt_0004-_main
.Lt_000A:
   .stabs "",36,0,0,.Lt_000A-_main
   #test.bas' compilation took 0.0001814982059045178 secs
   .stabs "",100,0,0,.Lt_000B
.Lt_000B:
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
hitori04



Anmeldungsdatum: 21.04.2011
Beiträge: 53

BeitragVerfasst am: 27.02.2013, 11:44    Titel: Antworten mit Zitat

sorry für die späte antwort habe erst jetzt bemerkt dass mein topic umbenannt wurde, nun das sieht doch schon einmal sehr viel versprechend aus. Danke nochmal dafür, werd mich damit mal weiter auseinander setzen lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 01.03.2013, 01:13    Titel: Antworten mit Zitat

Was vielleicht mehr Lerneffekt (bzw. einfacher erreichbar ist) wäre LLVM-IR zu erzeugen. Das hat u.a. auch den Vorteil, dass die ganze Sache portabel ausfällt und LLVM (mMn) viel besser dokumentiert is als GCC/GAS.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
hitori04



Anmeldungsdatum: 21.04.2011
Beiträge: 53

BeitragVerfasst am: 01.03.2013, 09:52    Titel: Antworten mit Zitat

Nachdem ich mir jetzt mal ein wenig über LLVM durchgelesen habe, sind mir einpaar fragen aufgekommen die ich mir nicht selbst beantworten kann, die erste und wohl wichtigste ist, ich habe noch nicht zu einhundert prozent verstanden wofür LLVM genau sein soll bzw was es denn tut. Damit komme ich dann auch gleich zu meiner zweiten frage selbst wenn ich jetzt eine anwtrot auf frage eins bekomme wie sieht es damit aus kann ich auch LLVM in freebasic umsetzen ?

Man merkt vielleicht dass ich noch ziemlich weit am anfang der ganze sache stehe aber ich möchte auch erst einmal alles was ich an information bekomme so gut wie möglich verstehen damit ich ein gewisses basis wissen für dieses thema auf bauen kann .. zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 01.03.2013, 15:50    Titel: Antworten mit Zitat

LLVM ist erstmal ein Projekt, was sich mit Compilern beschäftigt.

Der für dich interessante Teil des Projekts ist die LLVM(-IR), die aus folgenden Komponenten besteht:
-Eine Art High-Level Assembler (eben jene LLVM-IR) und ihre kompilierte Form, der Bitcode
-Eine virtuelle Maschine zum Ausführen dieses Bitcodes (ähnlich wie die JVM)
-Ein optimierender Compiler von Bitcode zu Maschinencode (x86, x86_64 und ARM)
-Diverse Analyse und Debuggingtools

Der interessante Part hier ist, dass du die LLVM-IR recht einfach erzeugen kannst in deinem Compiler, diese Sprache sogar noch halbwegs menschenlesbar ist und du dich um die Erzeugung von richtigem Maschinencode nicht kümmern brauchst.
Außerdem hast du dadurch direkt Zugriff auf die weiteren Teile der Infrastruktur, wie Debugger z.B.

Die Umsetzung in deinem Projekte sähe so aus, dass du erstmal nur Code erzeugst, der sich an diese Spezifikation hält: http://llvm.org/docs/LangRef.html
Die kompiliernug der erzeugten IR zu Bitcode und weiter zu einer eigenständigen Binary (.exe) kann LLVM dann selber machen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. 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