C: Zeiger auf einen beliebigen Typ?

8

Ich habe gehört, dass C nicht so sicher ist, und ich denke, dass ich das als Vorteil für mein aktuelles Projekt nutzen könnte.

Ich entwerfe einen Interpreter mit dem Ziel, dass die VM extrem schnell ist, viel schneller als zum Beispiel Ruby und Python.

Jetzt weiß ich, dass vorzeitige Optimierung "die Wurzel allen Übels" ist, aber das ist eher ein konzeptionelles Problem.

  • Ich muss eine Art Struktur verwenden, um alle Werte in meiner Sprache darzustellen (von der Nummer über die Zeichenfolge bis zur Liste und der Karte)

Wäre Folgendes möglich?

%Vor%
  • Ich würde die tatsächlichen Werte an anderer Stelle speichern, z. B. ein separates Array für Strings und Ganzzahlen, Wert * würde dann auf ein Element in dieser Tabelle zeigen.

  • Ich würde immer den Typ des Werts über die Typvariable kennen, so dass es keine Probleme mit Typfehlern geben würde.

Jetzt:

Ist das überhaupt möglich in Bezug auf Syntax und Typisierung?

    
dragme 29.05.2010, 17:22
quelle

7 Antworten

7

Ja, Sie können ein void* verwenden, um auf etwas zu verweisen und es dann bei Bedarf in den richtigen Typ zu konvertieren (so kann malloc und so funktionieren).

void* ist im Grunde "Zeiger auf einen beliebigen Speicherblock".

    
Amber 29.05.2010 17:25
quelle
7

Wenn Sie den Bereich der Typen kennen, die Sie unterstützen möchten, könnte dies leicht mit union durchgeführt werden, um Umwandlungen überall zu vermeiden:

%Vor%     
Nikolai Fetissov 29.05.2010 17:29
quelle
2

Sicher ist es. Sie benötigen nur einen großen Schalter auf type , um den Typ eines bestimmten Werts zu unterscheiden. Der beste Typ, der für Ihr Feld type verwendet wird, ist wahrscheinlich eine Enum mit einer Konstante für jeden Typ Ihrer Sprache, zB:

%Vor%

Denken Sie auch daran, dass Sie den void* Zeiger auf einen bestimmten Typ anwenden müssen, bevor Sie ihn verwenden.

    
Michał Trybus 29.05.2010 17:31
quelle
0

Es gibt verschiedene Grade der Typsicherheit, aber da C eine stark typisierte Sprache ist, ist es tatsächlich am sichereren Ende des Spektrums. Das wird dich nicht davon abhalten, das zu tun, was du vorschlägst. Das von Ihnen angegebene Beispiel ist syntaktisch gültig und könnte zur Implementierung des von Ihnen beschriebenen Systems verwendet werden. Denken Sie jedoch daran, dass es sehr unwahrscheinlich ist, dass Sie die Leistung bestehender Sprachen wie Ruby und Java übertreffen, wenn Sie das Rad neu erfinden, indem Sie eine eigene VM erstellen.

    
warrenm 29.05.2010 17:26
quelle
0

Die gute Nachricht: jemand anderes hat daran gedacht. Siehe Variante. (zum Beispiel Ссылка und Ссылка .) Die schlechte Nachricht: Diejenigen von uns, die mit ihnen gearbeitet haben, kamen im Allgemeinen dazu, sie zu hassen.

    
Kate Gregory 29.05.2010 17:28
quelle
0

Es ist okay, diesen Code zu schreiben, aber vielleicht müssen Sie Ihre "Sprache" (ok, Interpreter :)) vor anderen Dingen entwerfen.

Übrigens, ich empfehle Ihnen, die objektorientierte Programmierung im C-Buch zu lesen. Wenn Sie die wichtigsten Konzepte verstanden haben, können Sie sich die Implementierung von Python-Objekten ansehen , damit Sie darüber nachdenken können, wie Methoden mit Objekten interagieren und wie sie gespeichert werden und so weiter.

Tschüss!

    
Markon 29.05.2010 18:09
quelle
0

Sehen Sie sich sichere Rückrufe vom Typ CCAN für Makros an, mit denen Sie schlechte Casts vermeiden können. Ich weiß, dass Sie nicht einen Rückruf schreiben, aber viele Rückrufe sehen wie folgt aus:

%Vor%

Und mehrere Typen können in (void *) umgewandelt und an context übergeben werden. Casting innerhalb dieser Funktion wird schwierig, besonders wenn der Callback einen Thread startet, der ein einzelnes (void *) Argument benötigt.

Wie auch immer, Sie könnten einige nützliche Bits finden, wenn Sie dem Link folgen.

    
Tim Post 29.05.2010 18:22
quelle

Tags und Links