Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

11

07.07.2014, 17:34

Und wieder ein Update: if (mit derzeit nur einer Bedingung) sowie else sind implementiert:
Test für if ohne else:
https://github.com/Dgame/Alpha/blob/master/Input/in27.txt
Resultiert in:
https://github.com/Dgame/Alpha/blob/master/Output/out27.s

Und mit else:
https://github.com/Dgame/Alpha/blob/master/Input/in28.txt
Resultiert in:
https://github.com/Dgame/Alpha/blob/master/Output/out28.s
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

12

07.07.2014, 21:50

So, nun sind vollständige If-Bedingungen implementiert. War doch mehr Arbeit und Frimel-Kram wie zunächst gedacht. Ich habe mich auch direkt mit einigen weiteren Tests gegen unerwartetes Verhalten abgedeckt.
Aber nun gehen solch schöne Dinge:

Quellcode

1
2
3
4
5
6
7
8
9
var a = 11

if a < 9 or a > 10 {
    a = a * 2
} else {
    a = a - 3
}

print a


Obiger Code wird folgendermaßen übersetzt:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
.text
.globl _prog
_prog:

pushl   %ebp
movl    %esp, %ebp
subl    $4, %esp
movl    $11, 0(%esp)
movl    0(%esp), %ebx
movl    $9, %eax
cmpl    %eax, %ebx
jl  L1
movl    0(%esp), %ebx
movl    $10, %eax
cmpl    %eax, %ebx
jg  L1
L2:
movl    0(%esp), %eax
pushl   %eax
movl    $3, %eax
subl    %eax, 0(%esp)
popl    %eax
movl    %eax, 0(%esp)
jmp L1H
L1:
movl    0(%esp), %eax
pushl   %eax
movl    $2, %eax
imull   0(%esp), %eax
addl    $4, %esp
movl    %eax, 0(%esp)
L1H:
pushl   0(%esp)
call    _println_int
addl    $4, %esp
addl    $4, %esp
popl    %ebp
ret


Laut Git besteht mein Repo nun schon größtenteils aus Assembler. 8|

edit:
So noch einige Optimierungen hinzugefügt und nun erstmal Ende. Als nächstes wird aufgeräumt.
Ich wollte euch noch meine kleine selbstgeschrieben Testumgebung vorstellen, auf die ich eig. ganz besonders stolz bin (obwohl es eig quick and dirty Code ist). Ohne diese Umgebung würde mir das Testen der Beispiele enorm schwerer fallen.

(Link)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Architekt« (07.07.2014, 23:31)


Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

13

16.07.2014, 21:18

Semesterferien und ich kann weiter machen. Und es ist ein weiterer Meilenstein so gut wie geschafft: Arrays :this:
Die Syntax lehnt sich an die von C an. Aber ein paar Beispiele:

Direktes Anlegen der Größe ohne Zuweisung:
Syntax: https://github.com/Dgame/Alpha/blob/master/Input/in36.txt
Resultiert in: https://github.com/Dgame/Alpha/blob/master/Output/out36.s
Die auskommentierten Deklarationen würden Fehler schmeißen, da im ersteren Fall keine Array Größe vorliegt und im zweiteren Fall ein Missmatch zwischen Array Größe und Zuweisung besteht.

Zuweisung mit automatischer Größen-Folgerung:
Syntax: https://github.com/Dgame/Alpha/blob/master/Input/in37.txt
Resultiert in: https://github.com/Dgame/Alpha/blob/master/Output/out37.s

Und Zuweisung mit Angabe der Größe und korrekter Zuweisung derselben Größe:
Syntax: https://github.com/Dgame/Alpha/blob/master/Input/in38.txt
Resultiert in: https://github.com/Dgame/Alpha/blob/master/Output/out38.s

Was noch fehlt sind Array Zugriffe für Zuweisungen, Ausgaben und die Verwendung innerhalb von Termen. Das ist das nächste. :)

edit:
Geschafft. Wie das aussieht sollte wohl jeder wissen. :D
Aber für jene die der Output interessiert:
Input:
https://github.com/Dgame/Alpha/blob/master/Input/in39.txt
https://github.com/Dgame/Alpha/blob/master/Input/in40.txt
Output:
https://github.com/Dgame/Alpha/blob/master/Output/out39.s
https://github.com/Dgame/Alpha/blob/master/Output/out40.s
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Architekt« (16.07.2014, 23:02)


Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

14

12.10.2014, 15:29

Da ich leider weder Zeit noch groß Lust habe, an Alpha weiter zu arbeiten, habe ich mir gedacht, ich bringe das ganze direkt als Blog-Tutorial raus. Der erste Teil ist bereits fertig und kann auf meinem Blog nachgelesen werden.
Die mangelnde Lust ist ganz einfach der Tatsache geschuldet, dass ich endlich wieder ein Spiel im Kopf habe und mir die Spieleprogrammierung doch einfach weit mehr zusagt. :)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

15

29.12.2014, 10:55

Mein erster Beitrag dazu gefiel mir schlussendlich doch nicht so gut, weswegen ich einen neuen, weit ausführlicheren Teil herausgebracht habe: http://randy-schuett.de/?p=60
Insgesamt saß ich fast drei Wochen daran (und zwar nur Blog-Eintrag schreiben) und hoffe, es ist wird für den ein oder anderen eine hilfreiche Lektüre sein.
Dieser Beitrag wird auch der erste von mehreren folgenden Teilen sein, um Alpha zu einer "waschechten" Sprache zu führen. ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

16

29.12.2014, 11:51

Wow, meine Hochachtung, dein Artikel liest sich wirklich wunderbar: Nicht sonderlich kompliziert erklärt, aber dennoch genau und zielführend. Lob an dich :)

Liebe Grüße,
~ EuadeLuxe ~

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

17

29.12.2014, 13:50

Wow, meine Hochachtung, dein Artikel liest sich wirklich wunderbar: Nicht sonderlich kompliziert erklärt, aber dennoch genau und zielführend. Lob an dich :)

Liebe Grüße,
~ EuadeLuxe ~

Danke, freut mich wirklich sehr zu hören, dass meine Mühe nicht vergeblich war. :)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

pouk_

Frischling

Beiträge: 64

Beruf: Schüler

  • Private Nachricht senden

18

29.12.2014, 19:26

Hey
Du kennst mich ja schon von deiner Seite :whistling:
Ich versuch grade den Parser in C zu schreiben, da ich C++ nicht kann und es besser verstehen will. Hab es soweit versucht, aber du schreibst in dem Artikel, wie der C++ Quellcode aufgebaut ist, aber nicht allgemein woraus der Parser besteht. Wäre cool, wenn du in den Chat #sppro kommst. :rolleyes:

C-/C++-Quelltext

1
2
#include <stdlib.h>
main(){for(;;malloc(1024));} // dead

Architekt

Community-Fossil

  • »Architekt« ist der Autor dieses Themas

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

19

29.12.2014, 21:43

Ich bin da eig. nie.
Inwiefern "woraus der Parser besteht"?
Schreib mir sonst eine PM. :)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

pouk_

Frischling

Beiträge: 64

Beruf: Schüler

  • Private Nachricht senden

20

02.01.2015, 12:05

Hat sich erledigt, lerne gerade C++ ^^
Kannst du Code Beispiele auf github stellen ? Sehe dort nur ein Helloworld und ein test.alpha.

C-/C++-Quelltext

1
2
#include <stdlib.h>
main(){for(;;malloc(1024));} // dead

Werbeanzeige