 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
hitori04
Anmeldungsdatum: 21.04.2011 Beiträge: 53
|
Verfasst am: 17.02.2013, 22:53 Titel: Compilerbau: Codegenerierung |
|
|
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
Editiert durch Moderator: Ursprünglichen Thementitel "Rein aus Interesse und Neugier" ersetzt. (Sebastian) |
|
Nach oben |
|
 |
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
Verfasst am: 25.02.2013, 18:23 Titel: Compiler |
|
|
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 |
|
 |
hitori04
Anmeldungsdatum: 21.04.2011 Beiträge: 53
|
Verfasst am: 27.02.2013, 11:44 Titel: |
|
|
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  |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 01.03.2013, 01:13 Titel: |
|
|
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 |
|
 |
hitori04
Anmeldungsdatum: 21.04.2011 Beiträge: 53
|
Verfasst am: 01.03.2013, 09:52 Titel: |
|
|
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 ..  |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 01.03.2013, 15:50 Titel: |
|
|
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 |
|
 |
|
|
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.
|
|