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

11

01.01.2014, 12:57

Ein Weitere vorteil von C ist meiner Meinung nach, dass durch das fehlende Klassenkonzept die Codegeneratoren sogar noch einfacher sein sollten.

Naja, aber man ist doch auch in C++ nicht gezwungen, Klassen zu benutzen? Wenn man besser Code generieren kann, der die nicht benutzt, dann kann man das doch trotzdem tun.
Ich meine, dass man mit C auch alle highlevel Features abbilden kann ist ja klar. Und zu Blue Cobolds bemerkung: Ich habe nie wirklich C programmiert, kann mir aber durchaus vorstellen dass es nicht wirklich eine exakte Teilmenge ist, sondern vielleicht in ein paar Details wirklich abweicht. Die Frage ist, ob diese Details für die Übersetzung entscheidend wären, beziehungsweise einen Vorteil bei der Codegeneration bieten.

Das man einen C-Compiler möglicherweise einfacher bundlen kann, weil er vermutlich kleiner ist, weil er weniger können muss, sehe ich ein. Ich kann da aber nicht den Aufwand abschätzen, den ein C++ Compiler wirklich zusätzlich bedeuten würde.
Genauso wie ich nicht verstehen kann wie heute irgendjemand noch freiwillig C programmiert, wo C++ doch das selbe auch kann, das meiste aber schlichtweg besser, sehe ich halt noch keinen triftigen Grund sich künstlich auf etwas zu beschränken, wo man doch genauso gut viel mehr haben könnte.
Lieber dumm fragen, als dumm bleiben!

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

12

01.01.2014, 13:38

C++ hat bei der Entwicklung klare Vorteile gegenüber C. Aber ebend meiner Meinung nach nur bei der Entwicklung. Tatsächlich würde ich aber auch C++ gut finden, wenn nicht das klassenkonzept verwendet wird. Mein Problem damit ist halt, dass ich da viele Einschränkungen im Detail sehe, die man vielleicht in der eigenen Sprache definieren möchte, aber in C++ einfach nicht gut umsetzbar ist. Bestes Beispiel wäre für mich andere Konstruktoren innerhalb derselben Klasse aufrufen. Ich weiß, es ist im Standard, aber ich bin der Meinung der Microsoft-Compiler kann das nicht. Was muss man tun, wenn dieses Feature durch die "Zielsprache" nicht 1:1 abbildbar ist? Man muss einen Workaround schreiben und das ist an der stelle doch total blöd. Man müsste jegliche Konstruktorinhalte in private Methoden auslagern, keine Initialisierungslisten nutzen, damit man solchen funktionalen Code bekommt. Und das ist doch doof. In C ohne Klassen oder auch C++ ohne Klassen wäre das mit einem einheitlichen Konzept ziemlich simpel umzusetzen. Ich bin der Meinung da ist dann auch der Generator einfacher, weil man weniger Sonderfälle hat. Und die nerven richtig, egal was man generiert :)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

13

01.01.2014, 14:08

Für mich an seiner Stelle wäre C++ kein Mehrwert. Das fällt dadurch schon auf, dass man sich anscheinend auf Templates versteifen muss und keine Generics implementieren kann - ich wüsste zumindest nicht wie.

Was genau meinst du damit? Niemand zwingt dich, Templates zu benutzen und Templates sind zwar nicht wirklich direkt mit Generics vergleichbar, Generics gehen in C++ aber überhaupt nicht ab, da C++ mit Templates sowieso bereits wesentlich mächtiger ist als jede mir bekannte Implementierung von Generics (Java Generics sind nichtmal richtige Generics; C# Generics eignen sich zwar für generische Container, das war's dann aber auch relativ bald schon).

Ein Weitere vorteil von C ist meiner Meinung nach, dass durch das fehlende Klassenkonzept die Codegeneratoren sogar noch einfacher sein sollten.

Ist das nicht eher ein Nachteil? Zumindest wenn meine Sprache so etwas wie Klassen kennen soll, bedeutet das doch, dass ich das alles in C manuell implementieren müsste? Auch kann ein C++ Compiler, da er unter der Sprache sitzt, sicherlich gewisse Optimierungen machen, die einer Approximation in C verwehrt bleiben...

Aber rein aus Codetransformationssicht halte ich für C++ so ziemlich das schwierigste Ziel, was man sich an Land ziehen kann. Wie gesagt, es wird schon gutee Gründe geben, die ich vielleicht auch gar nicht sehe, warum nach C und nicht C++ generiert wird.

Was ist an C++ so schwierig? Wenn du mich fragst, ist es wohl eher einfacher, weil die Sprache mächtiger ist!? Ein paar wenige Gründe, die ich mir so vorstellen könnte, wären Portabilität und Geschwindigkeit...

Bestes Beispiel wäre für mich andere Konstruktoren innerhalb derselben Klasse aufrufen. Ich weiß, es ist im Standard, aber ich bin der Meinung der Microsoft-Compiler kann das nicht.

Mittlerweile schon ;)

Was muss man tun, wenn dieses Feature durch die "Zielsprache" nicht 1:1 abbildbar ist? Man muss einen Workaround schreiben und das ist an der stelle doch total blöd. Man müsste jegliche Konstruktorinhalte in private Methoden auslagern, keine Initialisierungslisten nutzen, damit man solchen funktionalen Code bekommt. Und das ist doch doof. In C ohne Klassen oder auch C++ ohne Klassen wäre das mit einem einheitlichen Konzept ziemlich simpel umzusetzen. Ich bin der Meinung da ist dann auch der Generator einfacher, weil man weniger Sonderfälle hat. Und die nerven richtig, egal was man generiert :)

In C ohne Klassen müsstest du nicht nur bei der Generierung von Konstruktoren gewisse Spezialfälle beachten, da gibt's so etwas wie Konstruktoren nichtmal, ohne dass du das alles selbst machst...

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (01.01.2014, 14:14)


Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

14

01.01.2014, 14:35

Ich sehe denn Sinn nicht ganz C(++) als Zwischencode zu erzeugen wenn es doch Zwischencodes wie LLVM IR gibt die optimal dafür geeignet sind und nur Vorteile bieten. C(++) als Zwischencode hat einen ganzen C(++)-Compiler als Abhänigkeit daher verstehe ich das Argument mit den Abhänigkeiten schonmal nicht wirklich.
Ich weiß dann jedenfalls keinen Grund mehr für diese Entscheidung.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

15

01.01.2014, 16:42

Das mit dem LLVM IR Zwischencode wusste ich noch nicht. Aber das sieht wirklich interessant aus.
Erst mal will ich meine eigene Virutal-Machine bauen - zu Lernzwecken. Aber für später ist der LLVM Unterbau wahrscheinlich wirklich die bessere Lösung.
Danke für den Tipp :)

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

16

02.01.2014, 19:52

Das "flags" Keyword gefällt mir bis jetzt am besten ^^

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// === XieXie code: ===

    flags Flags {
        Flag0
        Flag1
        Flag2
    }
    
    flags TestFlags {
        Foo
        Bar
        Blub
    }
    
    flags LetterFlags inherit Flags, TestFlags {
        A
        B
        C
    }


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
// === Generierter C++ code: ===

    //! Flags flags enumeration.
    struct Flags
    {
        // --- Auto-generated flags --- //
        typedef unsigned char DataType;
        static const DataType None  = 0;
        static const DataType All   = ~0;
        // --- Custom flags --- //
        static const DataType Flag0 = (1 << 0);
        static const DataType Flag1 = (1 << 1);
        static const DataType Flag2 = (1 << 2);
    };
    
    //! TestFlags flags enumeration.
    struct TestFlags
    {
        // --- Auto-generated flags --- //
        typedef unsigned char DataType;
        static const DataType None = 0;
        static const DataType All  = ~0;
        // --- Custom flags --- //
        static const DataType Foo  = (1 << 0);
        static const DataType Bar  = (1 << 1);
        static const DataType Blub = (1 << 2);
    };
    
    //! LetterFlags flags enumeration.
    struct LetterFlags
    {
        // --- Auto-generated flags --- //
        typedef unsigned short int DataType;
        static const DataType None  = 0;
        static const DataType All   = ~0;
        // --- Custom flags --- //
        static const DataType Flag0 = (1 << 0);
        static const DataType Flag1 = (1 << 1);
        static const DataType Flag2 = (1 << 2);
        static const DataType Foo   = (1 << 3);
        static const DataType Bar   = (1 << 4);
        static const DataType Blub  = (1 << 5);
        static const DataType A     = (1 << 6);
        static const DataType B     = (1 << 7);
        static const DataType C     = (1 << 8);
    };

17

03.01.2014, 14:55

Hier als Idee vielleicht auch den == Operator ueberladen, da du u.U. >1 (naemlich bits(datatype)-defined_bits+1) Repräsentationen fuer "All" hast. Einmal, dass alle bits auf 1 gesetzt sind (~0) und einmal, dass alle benannten, definierten bits auf 1 gesetzt sind. Bei "Flags" waeren das die bits 1 bis 3. Der Rest kann 0 sein und doch sind alle Flags gesetzt.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »poitroae« (03.01.2014, 15:33)


LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

18

03.01.2014, 23:05

Heute habe ich mal schnell einen kleinen GUI-basierten Taschenrechner programmiert, der den XièXiè Compiler benutzt, um die arithmetischen Ausdrücke auszuwerten.

Hier gibt's den Download (1.326 KB):
XièXiè Calculator

Die meisten Standard Taschenrechner Anwendungen (egal ob Windows Taschenrechner oder Apps für Android/ iOS) bieten immer nur die Möglichkeit,
einen Sub-Ausdruck zu schreiben, aber nicht am ganzen Stück, so wie die Casio Taschenrechner das z.B. haben.
Solche Taschenrechner Anwendungen habe ich früher schon geschrieben, aber die haben überhaupt nicht funktioniert, weil das Parsen von Expressions eben nicht ganz einfach ist ^^.
Aber mit dem Compiler geht das schon ganz gut.

Viel Spaß mit :-)
»LukasBanana« hat folgendes Bild angehängt:
  • Screenshot 01.png

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

19

15.01.2014, 23:59

Hi,

was haltet ihr von meiner Idee zu diesem 'copy' Keyword? :-)

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

20

16.01.2014, 08:26

Woher soll das Schlüsselwort wissen, auf welche Art die Objekte zu kopieren sind? Wenn man einen Stream (hier als Beispiel ein Inputstream zu einer Datei im Dateisystem) kopiert, sollte dieser dann die gleiche offene Verbindung halten (in welcher Reihenfolge würden dann die Ausgaben im Ausgabestrom landen?) oder sollte versucht werden, die Verbindung neu aufgebaut zu werden (2 parallele, schreibende Zugriffe auf die gleiche Datei)?
Wenn du ein solches Schlüsselwort in deiner Sprache einführen möchtest, dann muss klar definiert sein, was es wann macht und dieses Verhalten muss für bestimmte Klassen überschrieben werden können.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Sacaldur« (16.01.2014, 08:34)


Werbeanzeige