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

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

61

15.03.2015, 10:31

Sieht gut aus. Man merkt, dass du mit vollem Herzen dabei bist! :)

Den Namen "forever-Loop" finde ich irreführend, denn die Schleife läuft ja nicht für immer. Man kann ja mit break herausspringen.

Gibt es assoziative Arrays?

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

62

16.03.2015, 12:30

An assoziative Arrays habe ich erst mal noch gar nicht gedacht.
Die eingebauten Arrays bilden vorerst den einzigen generischen Container, ähnlich dem std::vector in C++.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

63

22.03.2015, 21:01

In den Vorlesungen Compiler 1 und 2 an der TU Darmstadt, wurde uns leider nicht beigebracht, wie man aus einem Abstract-Syntax-Tree (AST) einen Control-Flow-Graph (CFG) generiert.
Allerdings versuche ich mich gerade selbst daran und komme endlich ganz gut voran :-)

Zur Zeit bin ich mit den Expressions und dem IF-Statement zugange.
Hier mal ein kleines Beispiel, an dem ich meinen CFG Generator teste:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
// XieXie Code Sample
int x := 3, y := -7*x
if x > 5 and x < 10 and x != 2 {
    if x = 3 {
        y := 1
    }
} else {
    y := 2
}
y++


Anbei der (mit graphviz visuallisierte) CFG zu diesem Code Schnipsel.
Hier schon eine geringe Optimierung vorgenommen: Constant Propagation
»LukasBanana« hat folgendes Bild angehängt:
  • classtree.2.Pmain.vg.png

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

64

03.04.2015, 21:58

Den Namen "forever-Loop" finde ich irreführend, denn die Schleife läuft ja nicht für immer. Man kann ja mit break herausspringen.

Darüber habe ich noch mal nachgedacht und "forever" jetzt einfach mit "repeat" ersetzt. Sieht finde ich nun schöner aus :-)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
// Unbedingte Schleife
// (Intern eine "ForEver"-Loop)
repeat {
    if magicFunction() {
        break
    }
}

// Schleife mit 10 Iterationen und unsichtbarem Iterator
// (Intern eine "ForRange"-Loop)
repeat 10 {
    doSomething()
}


Das Schlüsselwort for wird in XieXie jetzt nur noch verwendet, wenn der darauf folgende Code-Block für eine Iterations-Variable ausgeführt wird.
repeat beschreibt einfach, dass irgendetwas wiederholt ausgeführt werden soll, ohne es mit einer Iterations-Variablen in Verbindung zu bringen.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

65

14.04.2015, 23:24

Hab heute in den Compiler wieder (wie bei der ersten Variante) Named Parameters implementiert.
Jetzt habe ich das ganze noch so erweitert, dass das Überladen von Funktionen noch umfassender funktioniert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Person {
    init(int age) {
        this.age := age
    }
    init(int year) {
        age := 2015 - year
    }
    
    private int age
}

class NamedParameterTest {
    static void main() {
        var personA := new Person(age: 25) // 1. Constructor
        var personB := new Person(year: 1990) // 2. Constructor
    }
}

In diesem Fall ist man zur Nutzung des Named Parameters gewzungen, denn ohne kann der Compiler nicht mehr wissen, welche Funktion gemeint ist.
Das kann man natürlich auch zu weit treiben, aber in obigem Beispiel finde ich das sehr praktisch, vor allem weil ich ähnliche Situationen schon mal in C++ hatte.

Das Name-Mangling baut dann folgende Label im Assembler zusammen:

Quellcode

1
2
CPerson.Pinit,I?age
CPerson.Pinit,I?year

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

66

19.04.2015, 22:27

Automatisches Function Inlining funktioniert jetzt auch schon :D
Zwar etwas eingeschränkt, aber besonders für kleine Funktionen wie setter/getter sehr nützlich.

Aus diesem Code hier ...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
class Test {
    static int f(int x) {
        return x*x
    }
    static int main() {
        return Test.f(3) + Test.f(-5)
    }
}

... macht mein Compiler jetzt das hier (3*3 + -5*-5 = 34):

Quellcode

1
2
3
CTest.Pmain:
    MOV $ar, 34 ; Return Value = 34
    RET 1


Bedingung, damit eine Prozedur 'ge-inlined' wird sind:
- Funktion darf die Obergrenze an Instruktionen nicht überschreiten (im Moment 10),
- Funktion darf keinen Kontrollfluß enthalten (wäre sonst zu kompliziert),
- Es darf nur ein 'Return' Instruktion enthalten,
- Die letzte Instruktion muss eine 'Return' Instruktion sein.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

67

19.04.2015, 22:43

Wie viel mal darf es rekursiv sein? :)

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

68

20.04.2015, 00:09

Es gibt eine Bestimmte Reihenfolge der Optimierungs Passes.
Diese Reihenfolgen wird so lange wieder holt, bis nichts mehr optimiert wurde.
Zusätzliche Abbruchbedingung ist dabei eine vorgegebene Anzahl an maximalen Iterationen, und die liegt im Moment nur bei 5.

Rekursion wird dabei nicht automatisch aufgelöst.
Aber interessant, diese Optimierung mal an rekursieven Funktionen zu testen.

Wobei das mit den oben genannten Einschränkungen nicht viel bringt,
da eine Abbruchbedingung für rekursive Funktionen Kontrollfluß beinhaltet,
und damit von meinem Optimierer nicht 'ge-inlined' wird.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

69

22.04.2015, 23:16

String Interpolation in Swift ist ziemlich cool, und jetzt gibt es sie auch in meiner Sprache :D

C-/C++-Quelltext

1
2
3
"x = \(x)!"
// wird zu ...
"x = ".append(x).append("!")

Ich habe mich bewusst gegen folgende Java Syntax entschieden:

C-/C++-Quelltext

1
"x = " + x + "!"

Erstens finde ich die Syntax aus Swift noch angenehmer, weil der String nicht wirklich unterbrochen wird, und Zweitens ist die Syntax in Java etwas irreführend, z.B. in folgendem Beispiel:

C-/C++-Quelltext

1
2
// Java Bsp:
System.out.println(3 + 4 + "test" + 3 + 4);

Das ist gültiges Java und das Resultat ist "7test34"!
In Swift (und bald auch in meiner Sprache ^^) sieht das dann so aus:

C-/C++-Quelltext

1
2
3
4
// XieXie Bsp:
System.out.writeLine("\(3+4)test\(3+4)") // Ausgabe ist "7test7"
System.out.writeLine("\(3+4)test\(3)\(4)") // Ausgabe ist "7test34"
// etc...

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

70

23.04.2015, 07:32

String Interpolation gibt es aber auch in anderen Sprachen, wie in PHP
Und die Konkatenierung mit + wird von sehr vielen Sprachen verwendet, neben Java wären C#, JavaScript oder Python weitere Beispiele (und ich würde vermuten, std::string aus C++ sollte danke Operatorenüberladung auch dazu gehören).

Ich finde deine Gründe gegen eine Konkatenierung mit + aber dennoch nachvollziehbar, zumal so ein bisschen offensichtlicher wird, dass mehrere Operationen nacheinander ausgeführt werden, die jeweils einen neuen String erzeugen.
In der Hinsicht wäre es vielleicht sogar ganz gut, wenn für den Zusammenbau des Strings etwas anderes als die reguläre Konkatenierung verwendet werden würde. Ideal wäre es, wenn anhand der vorhandenen Informationen nur 1 neuer Strings zusammengebaut werden muss.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Werbeanzeige