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

1

30.06.2014, 19:36

Compilerbau: Wie Typinformationen von Variablen speichern?

Hallo!
Da es hier ja grad 'in' ist, seine eigene Scriptsprache zu programmieren, hab ich das auch mal versucht :D
Den Parser hab ich schon und wollte nun mit dem Interpreter beginnen. Aber wie speichere ich am besten Datentypinformationen über Variablen/Funktionen?
Das einfachste wär ja, wenn ich speichere, ob es sich um einen int, float, string oder so handelt. Wie mache ich das dann aber bei komplexeren Datentypen oder
strukturen, sodass auch eine entsprechende Info angezeigt werden kann, die z.B beim zuweisen unterschiedlicher Typen warnt?
Hat da jemand ne Idee? :hmm:

JustSid

Frischling

Beiträge: 54

Beruf: Lead Idiot

  • Private Nachricht senden

2

30.06.2014, 20:25

Compiler oder interpreter, was ist es denn jetzt?
Jabberwock is killing user

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

3

30.06.2014, 20:28

Ich würde komplexe Datentypen erstmal weit außen vor lassen... ;)
Aber der Vollständigkeit halber: Mir hat es sehr geholfen, den Quellcode des D Compilers zu studieren (war u.a. nützlich für meine BA). Die Typen in der Runtime: https://github.com/D-Programming-Languag…r/src/object.di sowie die Repräsentation im Backend: https://github.com/D-Programming-Languag…ter/src/mtype.h
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

4

30.06.2014, 20:30

Falsche Frage. Compiler und Interpreter haben nichts miteinander zu tun. Die Frage ist eher, ob das Typ-System statisch oder dynamisch ist, also ob jede Variable einen Typen explizit bekommt und behält oder Werte jedes Typen zugleich annehmen kann. Bei statischer Typisierung brauchste bloß 'ne Wegwerf-Tabelle beim Kompillieren, die Typinfos mapped, bei dynamischer Typ-Flags oder TypeInfo-Pointer in deinen Objekt-Handles.

C-/C++-Quelltext

1
2
3
4
int main(int _argc, char** _argv) noexcept {
  asm volatile("lock cmpxchg8b %eax");
  return 0;
} // ::main
(Dieses kleine Biest vermochte einst x86-Prozessoren lahm zu legen.)

=> Und er blogt unter Hackish.Codes D:

5

30.06.2014, 21:13

Ja gut es wird ein Compiler ;)
Erstmal danke für die Antworten, ich werd mir mal was zusammendenken und den D Compiler auseinander nehmen.

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

6

30.06.2014, 22:43

Meine Fresse was hab ich (bzw. wir?) da nur los getreten...

In welcher Sprache überhaupt? Was soll die Sprache selbst bieten (warum feste Typen)?

Ich habe gerade dynamische Datentypen die aktuell Ints, Floats, Strings oder Booleans sein können.
Das ganze soll sehr tolerant sein, daher habe ich die Operatoren überladen und handle in diesen dann möglichst sinnvoll. Man kann z.B. einen String durch ein Int teilen:

Quellcode

1
2
3
4
_a = "Das ist ein String"
_b = 22 # int

_c = _a/_c # ergibt "Das ist ein String22"


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
void Var::div(Var* v){
    if(type != STR){
        if(type == INT || type == BOL){
            value.i /= v->getInt();
        }
        else if(type == FLT){
            value.f /= v->getFloat();
        }
    }
    else{
        value.str->append(v->toString());
    }
}


Ob das jetzt wirklich sinnvoll ist sei mal dahin gestellt, aber es ist eben einfacher, da so alles erlaubt ist und das Ergebnis trotzdem festgelegt ist.
Alle Arithmetischen Operatoren hängen an den String den Wert als neuen String an (bzw. setzen ihn davor).

Du kannst dir die ganze Klasse hier ansehen.

Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

7

30.06.2014, 23:30

Bitte nicht. D: Ich kann es verstehen, dass boost den operator/ für Pfade verwendet, aber Strings und Zeugs...? In Onyx gibt es die Stream-Operatoren <~, ~, ~>, wobei <~ und ~> wie operator<< und operator>> in den STL-Streams arbeiten und ~ wie das Analogon in D. So ist wenigstens unmissverständlich, was zu tun ist. Aber string / int könnte für mein Denken alles Mögliche bedeuten. Und je doppeldeutiger ein Ausdruck in einer Sprache ist, desto fehleranfälliger sind die Codes.

C-/C++-Quelltext

1
2
3
4
int main(int _argc, char** _argv) noexcept {
  asm volatile("lock cmpxchg8b %eax");
  return 0;
} // ::main
(Dieses kleine Biest vermochte einst x86-Prozessoren lahm zu legen.)

=> Und er blogt unter Hackish.Codes D:

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

8

01.07.2014, 00:43

Meine Fresse was hab ich (bzw. wir?) da nur los getreten...

Ja, ich sollte vllt. auch noch einen Thread aufmachen... :D
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

9

01.07.2014, 01:04

Ja Evrey, das ist im moment nur Faulheit da ich mir noch nicht sicher bin was ich in solchen Fällen machen soll.
Dann funktioniert der Operator eben, na und? Ich kann ja warnings oder so einbauen... später mal sehen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

01.07.2014, 06:47

Man kann z.B. einen String durch ein Int teilen:
Das klingt für mich nach JavaScript. Dort kann man auch viele sinnlose Operationen mit verschiedenen Datentypen machen. :rolleyes:
Array(16).join("wat" - 1) + " Batman";
WATMAN
(http://vimeo.com/94881698)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »BlueCobold« (01.07.2014, 06:55)


Werbeanzeige