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

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

41

26.01.2014, 23:37

(Ich bin gerade erst vom Global Game Jam wieder daheim angekommen und zwischenzeitlich war ich ein wenig beschäftigt, daher erst jetzt die Antwort.)
Am besten wäre es, wenn man aus einer etwas abstrakteren Sicht herangeht, wie sie bspw. beim Modellieren einer Softwarearchitektur (bspw bei UML-Klassendiagrammen) verwendet wird:
Klassen besitzen jeweils eine bestimmte Aufgabe und untereinander sind häufig Beziehungen erforderlich damit diese Aufgaben erfüllt werden können. Es ist nun durchaus relevant zu betrachten, ob zwischen 2 Klassen (A und B) eine 1 zu 1 Beziehung oder eine 0..1 zu 1 Beziehung besteht (oder anders: ob ein Objekt der Klasse A zwingend mit einem Objekt der Klasse B in Beziehung stehen muss, also eine entsprechende Referenz speichern muss, oder ob die Beziehung zwischenzeitlich auch mal nicht vorhanden sein darf, also auch keine Referenz (sodnern null) gespeichert werden kann).

In gewissem Maße kann man es auch mit Exception und der throws-Angabe bei Methoden vergleichen. Grundsätzlich muss man in bspw. Java und C# angeben, welche Exceptions von einer Methode geworfen werden können (bspw. IOException oder FileNotFoundException), wodurch man an der aufrufenden Stelle dazu gezwungen ist, entweder darauf einzugehen oder die aufrufende Stelle mit einer solchen Angabe zu versehen. Dadurch weiß man, dass man auf diese Ausnahmefälle auch eingehen sollte (ob nun direkt in der aufrufenden Methode oder in einer, die diese aufruft ist relativ egal).
Eine Methode, deren Rückgabe nicht Nullable (im Sinne meines Vorschlags) ist, würde mit Sicherheit eine gültige Rückgabe haben, auf die man ohne NullPointerException zugreifen kann, oder ggf. eine Exception werfen, die per throws-Angabe bereits bekannt ist.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

42

08.02.2014, 18:53

Ich habe gerade wieder einige neuen Ideen für meine Sprache - wird leider schwer alle davon umzusetzen.
Aber bei dieser hier würde mich noch mal eure Meinung dazu interessieren:

Für rein funktionale Prozeduren (also z.B. mathematische Funktionen wie "Distance(Vector A, Vector B)") will ich eine kurzschreibweise einbauen:

C-/C++-Quelltext

1
2
3
4
5
6
// XieXie
proc f(x) := x*x + 2

proc Sq(x) := x*x

proc Distance(a, b) := Math.Sqrt(Sq(a.x - b.x) + Sq(a.y - b.y) + Sq(a.z - b.z))

Und das soll übersetzt werden zu:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// C++
template <typename __XX__X> __XX__X f(const __XX__X& x)
{
    return x*x + 2;
}

template <typename __XX__X> __XX__X Sq(const __XX__X& x)
{
    return x*x;
}

template <typename __XX__R, typename __XX__A, typename __XX__B> __XX__R Distance(const __XX__A& a, const __XX__B& b)
{
    return Math::Sqrt(Sq(a.x - b.x) + Sq(a.y - b.y) + Sq(a.z - b.z));
}

Wird nur schwer, dass der Context-Analyzer herausfindet, ob ein der Rückgabe-Typ templateisiert werden muss oder nicht.
Wär blöd, wenn man im obigen Beispiel zu "f" und "Sq" immer noch den Typ angeben muss, der ja durch den Eingabe Parameter impliziert werden soll.

In C++ kann man solche Kurzschreibweisen durch Makros machen, aber die Nachteile davon sind ja allgemein bekannt ;-)

Was haltet ihr von so einer Kurzform?

43

08.02.2014, 19:10

Wird nur schwer, dass der Context-Analyzer herausfindet, ob ein der Rückgabe-Typ templateisiert werden muss oder nicht.
Wär blöd, wenn man im obigen Beispiel zu "f" und "Sq" immer noch den Typ angeben muss, der ja durch den Eingabe Parameter impliziert werden soll.

decltype
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

44

15.03.2014, 22:01

Heute habe ich nach längerer Pause mal wieder was für meinen Compiler gemacht, oder besser gesagt ein weiteres kleines Sub-Projekt:
XEnvironment, die XièXiè IDE.

Könnt ihr euch hier auf sourceforge runterladen.

Anbei auch ein Bild zur IDE (Version 0.1 Alpha).

Anmerkung zur IDE und dem Compiler:
Das Projekt steckt noch immer in den Kinderschuhen und daher solltet ihr vom Compiler bis jetzt noch nicht so viel erwarten.
Eigentlich ist der Compiler ja primär als Trans-Compiler zu C++ gedacht, aber in diesem kleinen Teaser, kann man einfach mal ein bisschen mit der Virtuellen Maschine rumspielen.
Ein kleines Beispiel Programm ist dabei.

Folgende Intrinsics werden derzeit unterstützt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
package Intr {
void* AllocMem(uint size)
void FreeMem(void* ptr)

void SysCall(string arg)
void ClearTerm()
void PrintTerm(string text)
void PrintTermI(int value)
void PrintTermF(float value)
}

Im Grunde kann die Virtuelle Maschine und der XASM Compiler bis lang nur mit Integern arbeiten.
Etwas anderes als "int" solltet man also nicht als Datentyp verwenden, wenn man die Virtuelle Maschine benutzt ;-)

Hier ein kleines Code Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int Faculty(int n) {
    if n = 0 {
        ret 1
    }
    ret n*Faculty(n - 1)
}

void PrintFaculty(int n) {
    int result := Faculty(n)
    
    Intr.PrintTermI(n)
    Intr.PrintTerm("! = ")
    Intr.PrintTermI(result)
    Intr.PrintTerm("\n")
}

void Main() {
    int x := 3, y := -2
    PrintFaculty(x*2-y)
}

// Letzte Zeile muss leer sein!


Naja, weitere Einschränkungen wird euch der Compiler schon um die Ohren hauen ^^
Wer Lust hat, kann damit mal ein wenig herumexperimentieren, aber ihr solltet nicht mehr als 1000 Zeilen schreiben, sonst ärgert ihr euch, wenn es um sonst war :D
»LukasBanana« hat folgendes Bild angehängt:
  • 01 - First IDE Release.png

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

45

11.06.2014, 21:25

Ich habe gerade mal wieder ein bisschen mit meiner Programmiersprache zumgespielt, und in der Virtual Machine gesehen,
was für ein enormer Unterschied die Implementierung der Fibonacci Reihe ausmacht,
wenn sie statt rekursiv, iterativ ist:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
// --- XieXie code: ---
// Compute fibonacci series recursive
int Fibonacci(int n) {
    if n <= 0 {
        return 0
    } else if n = 1 {
        return 1
    }
    return Fibonacci(n - 1) + Fibonacci(n - 2)
}
// VM Output: "Program terminated successful after 15751288 cycles and 234 ms."


C-/C++-Quelltext

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
// --- XieXie code: ---
// Compute fibonacci series iterative
int FibonacciIt(int n) {
    if n <= 0 {
        return 0
    } else if n = 1 {
        return 1
    }
    
    int a := 0
    int b := 1
    int i := 2
    int aa, bb
    
    while i <= n {
        aa := b
        bb := a + b
        a := aa
        b := bb
        i += 1
    }
    
    return b
}
// VM Output: "Program terminated successful after 13012 cycles and 31 ms."

Die 'Cycles' geben hier die Anzahl ausgeführter Instruktionen wieder, da meine VM keine Pipeline hat, wie ne richtige CPU.

Ein paar Sachen an der Syntax habe ich jetzt den doch den üblichen Programmiersprachen angepasst:
"return" statt "ret",
"else if" statt "elif".

Für Interessenten hier mal das ganze Programm:

C-/C++-Quelltext

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
// XieXie Test for XEnvironment
// 15/03/2014 by Lukas Hermanns

// Compute faculty (n!)
int Faculty(int n) {
    if n = 0 {
        return 1
    }
    return n*Faculty(n - 1)
}

// Compute GCD (Greatest Common Divisor)
int GCD(int a, int b) {
    if b = 0 {
        return a
    }
    return GCD(b, a % b)
}

// Compute fibonacci series recursive
int Fibonacci(int n) {
    if n <= 0 {
        return 0
    } else if n = 1 {
        return 1
    }
    return Fibonacci(n - 1) + Fibonacci(n - 2)
}

// Compute fibonacci series iterative
int FibonacciIt(int n) {
    if n <= 0 {
        return 0
    } else if n = 1 {
        return 1
    }
    
    int a := 0
    int b := 1
    int i := 2
    int aa, bb
    
    while i <= n {
        aa := b
        bb := a + b
        a := aa
        b := bb
        i += 1
    }
    
    return b
}

void PrintFaculty(int n) {
    int result := Faculty(n)
    
    Intr.PrintInt(n)
    Intr.Print("! = ")
    Intr.PrintInt(result)
    Intr.PrintLn("")
}

void PrintGCD(int a, int b) {
    int result := GCD(a, b)
    
    Intr.Print("gcd(")
    Intr.PrintInt(a)
    Intr.Print(", ")
    Intr.PrintInt(b)
    Intr.Print(") = ")
    Intr.PrintInt(result)
    Intr.PrintLn("")
}

void PrintFibonacci(int n) {
    int result := FibonacciIt(n)
    
    Intr.Print("fib(")
    Intr.PrintInt(n)
    Intr.Print(") = ")
    Intr.PrintInt(result)
    Intr.PrintLn("")
}

/**
Main function.
This is always required!
*/
void Main() {
    
    /*Intr.PrintLn("")
    Intr.PrintLn("Faculties:")
    
    for i : 0 .. 5 {
        PrintFaculty(i)
    }
    
    Intr.PrintLn("")
    Intr.PrintLn("Greatest Common Divisors:")
    
    for a : 1 .. 100 -> 17 {
        for b : 1 .. 100 -> 23 {
            PrintGCD(a*3, b*4)
        }
    }*/
    
    Intr.PrintLn("")
    Intr.PrintLn("Fibonacci Series:")
    
    for i : 1 .. 25 {
        PrintFibonacci(i)
    }
    
    Intr.PrintLn("\n")
    
}

Und hier der Assembler Code (XASM), der in praktisch keinster Weise Optimiert wurde:

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
; ./clipboard - Test1.xx.xasm
; XieXie generated source file
; Wed Jun 11 21:22:21 2014

call Main
stop
; --- Procedure Definition "Faculty"  ---
Faculty:
    ; If Statement
    ldw i0, (lb) -4
    xor i1, i1
    push i1
    push i0
    call Intr.CmpE
    pop i0
    xor i1, i1
    cmp i0, i1
    je .else_0
        push 1
        ret (1) 1
    jmp .endif_0
    .else_0:
    .endif_0:
    
    ldw i0, (lb) -4
    push i0
    ldw i0, (lb) -4
    mov i1, 1
    sub i0, i1
    push i0
    call Faculty
    pop i1
    pop i0
    mul i0, i1
    push i0
    ret (1) 1

; --- Procedure Definition "GCD"  ---
GCD:
    ; If Statement
    ldw i0, (lb) -8
    xor i1, i1
    push i1
    push i0
    call Intr.CmpE
    pop i0
    xor i1, i1
    cmp i0, i1
    je .else_1
        ldw i0, (lb) -4
        push i0
        ret (1) 2
    jmp .endif_1
    .else_1:
    .endif_1:
    
    ldw i0, (lb) -4
    push i0
    ldw i1, (lb) -8
    pop i0
    mod i0, i1
    push i0
    ldw i0, (lb) -8
    push i0
    call GCD
    ret (1) 2

; --- Procedure Definition "Fibonacci"  ---
Fibonacci:
    ; If Statement
    ldw i0, (lb) -4
    xor i1, i1
    push i1
    push i0
    call Intr.CmpLE
    pop i0
    xor i1, i1
    cmp i0, i1
    je .else_2
        push 0
        ret (1) 1
    jmp .endif_2
    .else_2:
    
    ; If Statement
    ldw i0, (lb) -4
    mov i1, 1
    push i1
    push i0
    call Intr.CmpE
    pop i0
    xor i1, i1
    cmp i0, i1
    je .else_3
        push 1
        ret (1) 1
    jmp .endif_2
    .else_3:
    .endif_2:
    
    ldw i0, (lb) -4
    mov i1, 1
    sub i0, i1
    push i0
    call Fibonacci
    ldw i0, (lb) -4
    mov i1, 2
    sub i0, i1
    push i0
    call Fibonacci
    pop i1
    pop i0
    add i0, i1
    push i0
    ret (1) 1

; --- Procedure Definition "FibonacciIt"  ---
FibonacciIt:
    ; If Statement
    ldw i0, (lb) -4
    xor i1, i1
    push i1
    push i0
    call Intr.CmpLE
    pop i0
    xor i1, i1
    cmp i0, i1
    je .else_4
        push 0
        ret (1) 1
    jmp .endif_3
    .else_4:
    
    ; If Statement
    ldw i0, (lb) -4
    mov i1, 1
    push i1
    push i0
    call Intr.CmpE
    pop i0
    xor i1, i1
    cmp i0, i1
    je .else_5
        push 1
        ret (1) 1
    jmp .endif_3
    .else_5:
    .endif_3:
    
    ; Variable Initialization "a"
    inc sp
    xor i0, i0
    stw i0, (lb) 8
    
    ; Variable Initialization "b"
    inc sp
    mov i0, 1
    stw i0, (lb) 12
    
    ; Variable Initialization "i"
    inc sp
    mov i0, 2
    stw i0, (lb) 16
    
    ; Variable Initialization "aa"
    inc sp
    xor i0, i0
    stw i0, (lb) 20
    
    ; Variable Initialization "bb"
    inc sp
    xor i0, i0
    stw i0, (lb) 24
    
    ; While Loop
    .while_loop_0:
    ldw i0, (lb) 16
    push i0
    ldw i1, (lb) -4
    pop i0
    push i1
    push i0
    call Intr.CmpLE
    pop i0
    xor i1, i1
    cmp i0, i1
    je .while_loop_0_end
        ; Variable Assignment "aa"
        ldw i1, (lb) 12
        ldw i0, (lb) 20
        mov i0, i1
        stw i0, (lb) 20
        
        ; Variable Assignment "bb"
        ldw i0, (lb) 8
        push i0
        ldw i1, (lb) 12
        pop i0
        add i0, i1
        mov i1, i0
        ldw i0, (lb) 24
        mov i0, i1
        stw i0, (lb) 24
        
        ; Variable Assignment "a"
        ldw i1, (lb) 20
        ldw i0, (lb) 8
        mov i0, i1
        stw i0, (lb) 8
        
        ; Variable Assignment "b"
        ldw i1, (lb) 24
        ldw i0, (lb) 12
        mov i0, i1
        stw i0, (lb) 12
        
        ; Variable Assignment "i"
        mov i1, 1
        ldw i0, (lb) 16
        add i0, i1
        stw i0, (lb) 16
        
    jmp .while_loop_0
    .while_loop_0_end:
    
    ldw i0, (lb) 12
    push i0
    ret (1) 1
    sub sp, 5

; --- Procedure Definition "PrintFaculty"  ---
PrintFaculty:
    ; Variable Initialization "result"
    inc sp
    ldw i0, (lb) -4
    push i0
    call Faculty
    pop i0
    stw i0, (lb) 8
    
    ldw i0, (lb) -4
    push i0
    call Intr.PrintInt
    push str_lit_0
    call Intr.Print
    ldw i0, (lb) 8
    push i0
    call Intr.PrintInt
    push str_lit_1
    call Intr.PrintLn
    dec sp
    ret (0) 1

; --- Procedure Definition "PrintGCD"  ---
PrintGCD:
    ; Variable Initialization "result"
    inc sp
    ldw i0, (lb) -8
    push i0
    ldw i0, (lb) -4
    push i0
    call GCD
    pop i0
    stw i0, (lb) 8
    
    push str_lit_2
    call Intr.Print
    ldw i0, (lb) -4
    push i0
    call Intr.PrintInt
    push str_lit_3
    call Intr.Print
    ldw i0, (lb) -8
    push i0
    call Intr.PrintInt
    push str_lit_4
    call Intr.Print
    ldw i0, (lb) 8
    push i0
    call Intr.PrintInt
    push str_lit_1
    call Intr.PrintLn
    dec sp
    ret (0) 2

; --- Procedure Definition "PrintFibonacci"  ---
PrintFibonacci:
    ; Variable Initialization "result"
    inc sp
    ldw i0, (lb) -4
    push i0
    call FibonacciIt
    pop i0
    stw i0, (lb) 8
    
    push str_lit_5
    call Intr.Print
    ldw i0, (lb) -4
    push i0
    call Intr.PrintInt
    push str_lit_4
    call Intr.Print
    ldw i0, (lb) 8
    push i0
    call Intr.PrintInt
    push str_lit_1
    call Intr.PrintLn
    dec sp
    ret (0) 1

; --- Procedure Definition "Main"  ---
Main:
    push str_lit_1
    call Intr.PrintLn
    push str_lit_6
    call Intr.PrintLn
    ; Range-Based For Loop
    inc sp
    mov i0, 1
    .for_loop_0:
    ; Loop Condition
    mov i1, 25
    cmp i0, i1
    jg .for_loop_0_end
    stw i0, (lb) 8
        ldw i0, (lb) 8
        push i0
        call PrintFibonacci
    ldw i0, (lb) 8
    inc i0
    jmp .for_loop_0
    .for_loop_0_end:
    
    dec sp
    push str_lit_7
    call Intr.PrintLn
    ret (0) 0

; --- Data Field Section ---
str_lit_1:
DATA.string ""
str_lit_0:
DATA.string "! = "
str_lit_4:
DATA.string ") = "
str_lit_3:
DATA.string ", "
str_lit_6:
DATA.string "Fibonacci Series:"
str_lit_7:
DATA.string "\n"
str_lit_5:
DATA.string "fib("
str_lit_2:
DATA.string "gcd("
; ================

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

46

28.06.2014, 19:17

Ich habe heute endlich mal Arrays in den XASM Code Generator eingebaut und jetzt kann man auch endlich mal was halbwegs sinnvolles mit meinem Compiler anfangen ^^
Leider ist der Code, den der Compiler Erzeugt, noch extrem schlecht in der Performanz. Jede Menge Redundanz usw.

Nichts destotrotz möchte ich euch heute mal mein erstes kleines Spiel präsentieren, dass in meiner eigenen VirtualMachine läuft:
"ConnectFour", bzw. "Vier gewinnt".
Kann hier heruntergeladen werden (inkl. Compiler und Virtual Machine).

Wie gesagt: wundert euch nicht über den Spaghetti Code. Der Compiler hat noch viele Mankos ;-)

FSA

Community-Fossil

  • Private Nachricht senden

47

28.06.2014, 20:13

Bekomme diesen Fehler.
»FSA« hat folgendes Bild angehängt:
  • Fehler.PNG

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

48

28.06.2014, 20:23

Genau das hatte ich auch, aber nur wenn ich es über eine Batch Datei gestartet habe.
Hast du das in der CMD selbst eingetippt?
Hast du mal die PowerShell probiert?

FSA

Community-Fossil

  • Private Nachricht senden

49

28.06.2014, 23:08

Ja, selber eingetippt. PowerShell:
»FSA« hat folgendes Bild angehängt:
  • Fehler.PNG

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

50

28.06.2014, 23:54

Mh seltsam ?( Erstelle halt zur Not mal das Verzeichnis, nach dem er verlangt; also "ConnectFour.xx/".
( Diesmal hast du außerdem "-file" statt "-run" eingegeben. Bei "-file" kompiliert er nur.
Mit "-run" wird kompiliert von XieXie nach XASM (XieXie Assembly), dann von XASM nach XBC (XieXie ByteCode) und dann wird der ByteCode ausgeführt. )

Werbeanzeige