Fixed-width types
-
Ich frage nur aus Neugier, die Plattformen hab ich noch gar nicht genau festgelegt.
Und es geht mir nicht um die Menge an Zahlen, die da reinpassen; nur um die Bitgröße.
Ich arbeite aktuell an einer Scriptsprache. Die wird offline in virtuellen, von mir designten Assemblercode compiliert und dann (evtl. auf einer anderen Plattform) in ei.er von mir entwickelten VM ausgeführt.
Adressen von Variablen werden einfach als Offset auf drm Stack angegeben und da ist das Problem: wenn mein uint32_t beim Compiler 32 Bit groß ist und beim Ausführer nicht mehr, sind alle Adrrssen falsch.
Ich kann da rum workarounden, indem der Compiler Zwischencode generiert, der keine Offsets verwendet u.d die dann beim Laden berechnet, aber das find ich nicht schön.
Deshalb frage ich, ob es irgendwelche relevanten Architekturen gibt, die das nicht anbieten.
-
Nathan schrieb:
Gibt es irgendwelche relevanten Architekturen, bei denen die fixed Typedefs nicht verfügbar sind?
Und darüber hinaus: Gibt es irgendwelche relevanten Architekturen, bei denen floats nicht 32Bit groß sind bzw. double 64?Was (zum Teufel) sind die für Dich relevanten Architekturen!?
-
Die Adresse muessen doch nicht absolut angegeben werden. Die lokalen Variablen koennen einfach mit Stackspitze - offset angegeben werden und da koennte man sich z.B. im Bytecode auf 16 bit beschraenken und kann dann halt nur maximal soundsoviele Variablen in einer Funktion addressieren (lua ist z.B. auf 200 lokale Variablen gecapped).
-
Swordfish schrieb:
Nathan schrieb:
Gibt es irgendwelche relevanten Architekturen, bei denen die fixed Typedefs nicht verfügbar sind?
Und darüber hinaus: Gibt es irgendwelche relevanten Architekturen, bei denen floats nicht 32Bit groß sind bzw. double 64?Was (zum Teufel) sind die für Dich relevanten Architekturen!?
Architekturen, die von einer größeren Menge an Menschen verwendet werden und ausreichend Power bieten, dass Scripting in Frage kommt.*
Darüber hinaus bin ich auch neugierig.@Marthog:
Aber mit dem offset hab ich doch wieder das Problem der Größe!?*Also nicht SeppJ's wasserbetriebener Bambusrechner.
-
Nathan schrieb:
Ich arbeite aktuell an einer Scriptsprache. Die wird offline in virtuellen, von mir designten Assemblercode compiliert und dann (evtl. auf einer anderen Plattform) in ei.er von mir entwickelten VM ausgeführt.
Adressen von Variablen werden einfach als Offset auf drm Stack angegeben und da ist das Problem: wenn mein uint32_t beim Compiler 32 Bit groß ist und beim Ausführer nicht mehr, sind alle Adrrssen falsch.
Ich kann da rum workarounden, indem der Compiler Zwischencode generiert, der keine Offsets verwendet u.d die dann beim Laden berechnet, aber das find ich nicht schön.Du musst konkreter werden. Ich habe keine Ahnung, was du damit meinst, dass uint32_t plötzlich nicht mehr 32 Bit haben könnte. Oder warum du unbedingt uint32_t verwenden willst, wenn du es eigentlich doch nicht willst wegen der Portabilität.
Poste einfach den Link zu deinem Code und stelle dann konkrete Fragen.
-
Also nicht SeppJ's wasserbetriebener Bambusrechner.
Kein Wort gegen SeppJ's wasserbetriebenen Bambusrechner.
-
Nathan schrieb:
Swordfish schrieb:
Nathan schrieb:
Gibt es irgendwelche relevanten Architekturen, bei denen die fixed Typedefs nicht verfügbar sind?
Und darüber hinaus: Gibt es irgendwelche relevanten Architekturen, bei denen floats nicht 32Bit groß sind bzw. double 64?Was (zum Teufel) sind die für Dich relevanten Architekturen!?
Architekturen, die von einer größeren Menge an Menschen verwendet werden und ausreichend Power bieten, dass Scripting in Frage kommt.
Gut. Dann sind wir bei x86, x86-64 und ARM ...
-
Arcoth schrieb:
Also nicht SeppJ's wasserbetriebener Bambusrechner.
Kein Wort gegen SeppJ's wasserbetriebenen Bambusrechner.
Die Idee kommt übrigens ursprünglich von volkard.
-
TyRoXx schrieb:
Nathan schrieb:
Ich arbeite aktuell an einer Scriptsprache. Die wird offline in virtuellen, von mir designten Assemblercode compiliert und dann (evtl. auf einer anderen Plattform) in ei.er von mir entwickelten VM ausgeführt.
Adressen von Variablen werden einfach als Offset auf drm Stack angegeben und da ist das Problem: wenn mein uint32_t beim Compiler 32 Bit groß ist und beim Ausführer nicht mehr, sind alle Adrrssen falsch.
Ich kann da rum workarounden, indem der Compiler Zwischencode generiert, der keine Offsets verwendet u.d die dann beim Laden berechnet, aber das find ich nicht schön.Du musst konkreter werden. Ich habe keine Ahnung, was du damit meinst, dass uint32_t plötzlich nicht mehr 32 Bit haben könnte. Oder warum du unbedingt uint32_t verwenden willst, wenn du es eigentlich doch nicht willst wegen der Portabilität.
Poste einfach den Link zu deinem Code und stelle dann konkrete Fragen.
Gut, das scheint dann doch mehr XY-Problem zu sein als ich dachte.
Also nehmen wir mal an ich unterstütze zwei Architekturen A und B. B bietet intxx_t nicht an, weswegen ich int_leastxx_t verwende.
Nun erzeuge ich auf Architektur A folgenden virtuellen Assemblercode:push int32 1 // erzeuge ein int32 mit Wert 1; Offset 0, da Stack aligned. push int32 2 // " mit Wert 2; offset 32 add int32 0 32 // addiere die beiden int32, einer an Adresse 0, der andere an Offset 32Wenn ich diese Script nun auf B ausführe, wird höchstwahrscheinlich der zweite Offset falsch sein und das Programm nicht laufen.
Um das zu vermeiden, könnte ich im virtuellen Assemblercode die Typen bspw. indexieren, müsste dann aber beim Laden manuell die Offsets berechnen,
und das würd ich nur ungern machen.@Swordfish:
Das heißt also ja, die sind verfügbar? Gut, danke.@Arcoth/SeppJ:
Entschuldigung, nichts gegen volkards wasserbetriebenen Bambusrechner.
-
SeppJ schrieb:
Arcoth schrieb:
Also nicht SeppJ's wasserbetriebener Bambusrechner.
Kein Wort gegen SeppJ's wasserbetriebenen Bambusrechner.
Die Idee kommt übrigens ursprünglich von volkard.
Du hast nen wasserbetriebenen Bambusrechner? Zeig Bilder!
-
Nathan schrieb:
Nun erzeuge ich auf Architektur A folgenden virtuellen Assemblercode:
push int32 1 // erzeuge ein int32 mit Wert 1; Offset 0, da Stack aligned. push int32 2 // " mit Wert 2; offset 32 add int32 0 32 // addiere die beiden int32, einer an Adresse 0, der andere an Offset 32Offset in bit angeben ist albern. Normalerweise verwendet man in richtigem Assembler byte und in Interpretern gibt man nur die Speicherzelle an und der Inhalt ist egal.
-
SeppJ schrieb:
Arcoth schrieb:
Also nicht SeppJ's wasserbetriebener Bambusrechner.
Kein Wort gegen SeppJ's wasserbetriebenen Bambusrechner.
Die Idee kommt übrigens ursprünglich von volkard.
Ich glaube eher, die Idee kommt von Bashar.