BiteCode
Übersicht

![]() |
Silver_KneeBetreff: BiteCode |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es ist vollbracht: Ein weiteres "Wollte ich schon immer mal Proggen".
Nein, hier wird kein Code gefressen, es wird Bytecode geschrieben. Und das so wie du willst. Um sich einen Kurzen überblick zu verschaffen wie das ding aussieht, hier ein Screen. Das Programm verwandelt nach einem Muster dass man ihm vorgibt Code in Bytes und schreibt diese in die Ausgabedatei. Das geschieht mit Hilfe von 2 Befehlen:
STRING ist eine Zeichenkette ohne Leerzeichen und gibt den Befehl an den man später im Code schreibt AUSDRUCK besteht aus folgenden Einzelteilen, die beliebig hintereinander geschrieben werden:
Bei EXTENDEDAUSDRUCK kann man auch die Ausdrücke <LEN>, der die Länge zwischen STRING1 und STRING2 zurückgibt, und <BETWEEN> Der die Zeichenkette zwischen STRING1 und STRING2 zurückibt verwenden. Anmerkung: Man darf bei verschiedenen defbetween den gleichen STRING2 verwenden, wie zB. punkte( ) ... leben( ) ... name( ) aber bei gleichem STRING1 gilt der nur erst definierte. Ein Beispiel: Code: [AUSKLAPPEN] deffixed Cool b1b i1000i h-33h
deffixed string s5sHallob0b defbetween < > i<LEN>is<LEN>s<BETWEEN> endcompilerdef cool string < ein Text, der alles außer das ENTER-Zeichen enthält > Die Erste Zeile definiert für Cool eine Kette aus dem Byte 1 und Int 1000 und erzeugt den Fehler dass ein HalfInt nicht -33 sein kann. Das wird allerdings dann einfach ignoriert. Die zweite Zeile definiert für string einen C-Typischen String der das 5 Buchstaben lange Hallo enthält und mit einem Byte 0 abschließt. Die 3. Zeile emuliert Blitz-Strings: Was zwischen < und > steht, wird umgewandelt in ein Int, dass die länge zwischen < und > besitzt und lässt darauf den String selbst folgen. mit endcompilerdef Schließt die Definition ab und der eigentliche script beginnt. Der Befehl Cool wird ausgeführt (groß/klein wird nicht beachtet). Der Befehl String wird ausgeführt. und die Zeichenkette "ein Text, der alles außer das ENTER-Zeichen enthält" wird entsprechend der Definition umgewandelt. Man beachte hier die Leerzeichen nach < und vor >, die gesetzt werden müssen. das ganze sieht dann so aus: Code: [AUSKLAPPEN] è Hallo 3 ein Text, der alles außer das ENTER-Zeichen enthält
und ein Hexeditor zeigt. Das ist das gesuchte! Ein kleines Dessert gibt es noch: compile INCLUDE kompiliert die Datei, die ihrerseits Definitionen und Script enthalten kann. Known Bugs -endcompilerdef muss vorher und nacher ein ENTER-Zeichen haben -Funktioniert nur mit Windows-ENTER -Multifilemanagement für die IDE ist in Planung. Kommentare zur IDE negativer Art am besten nach /dev/null... wenn nicht dann halt doch hier. Dann braucht ihr noch eins: Download (*.exe 796KB) EDIT: Ach ja der Sinn: Es lassen sich Highscore-Files Testweise manipulieren, man kann seine RPG Scripte schnell über Bytecode Programmieren und wer lust hat kann auch einen Assembler draus proggen... Viel spaß dabei =) |
||
- Zuletzt bearbeitet von Silver_Knee am Di, Okt 07, 2008 23:11, insgesamt einmal bearbeitet
![]() |
maximilian |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also soweit ich es verstanden habe, ist es eine Art Makro-Replacer!? Leider ist das für das Umwandeln von Scripts zu Bytecode/Maschinencode vollkommen ungeeignet, das ist die Aufgabe eines 'Compilers' und um längen komplizierter.
Und das mit der High-Score Liste verstehe ich garnicht (High-Score Liste ist doch eigentlich ne Minisache), wär nett wenn du das nochmal genauer erläuterst. ![]() |
||
Variety is the spice of life. One day ignore people, next day annoy them. |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja im Prinzip ist es ein Compiler, nur dass du ihm praktisch vorher die Programmiersprache sagst. Vielseitig einsetztbar. Gemacht hab ich ihn eigendlich für Game-Scripte: Du machst deinen Script-Interpreter für dein game und damit der nicht die 300 Zeilen ingame Parsen muss, machst du ihn einfach mit ReadByte und ReadInt. Das macht ihn schneller und die Dateien kleiner. Zum Schreiben benötigst du dann alerdings entsprechend Werkzeug also Hex-Editor oder eigener Script-Editor, der eine eigene Sprache compeilt (<--Eingedeutscht o.O). Diese Arbeit nimmt dir BiteCode zum Teil ab: Du sagst ihm deine Definitionen und kannst anfangen. zB
Code: [AUSKLAPPEN] deffixed Karl b1b
deffixed Maria b2b deffixed Mirco b3b defbetween " " i<LEN>i s<LEN>s<BETWEEN> endcompilerdef Karl " Hallo, Maria, wie geht's? " Maria " Ganz gut und dir? " Karl " Auch. Guck mal, da kommt Mirco! " Mirco " Hallo, Ihr zwei. " Den Code der da rauskommt lässt sich in Blitz einfach lesen: Code: [AUSKLAPPEN] Select ReadByte(file)
Case 1 Color 255,0,0 person$="Karl" Case 2 Color 0,255,0 person$="Maria" Case 3 Color 0,0,255 person$="Mirco" End Select Print person+">"+ReadString(file) Die farben könnte man auch jeweils an das Namens-Byte anbinden oder den Namen in 2 andere Begrenzer zB ! ! einbinden und den String samt Farbe, Position, Waffen, ka abspeichern. Was man will kommt in die neue Datei, nur man erspart sich Arbeit. Außerdem hat man ein Prog für alle Projekte. Man kann zB die Definitionen der Personen in eine Datei schreiben und Verschiedene Levels machen... man könnte man könnte man könnte. Highscores: Du machst deine Highscore-Datei so: INT PUNKTE STRING NAME Nun willste testen ob dein Reader erkennt dass man zB negative punkte net in den Highscore schreibt. Notepad versagt... Hexeditor ok, aber wenn du dich mit BiteCode beschäftigst, kannst du auch leicht den Namen verändern ohne mühsam die Länge zu bedenken o.ä. |
||
![]() |
maximilian |
![]() Antworten mit Zitat ![]() |
---|---|---|
"Bytecode" ist ja eigentlich quasi nur ein Synonym für Binärcode-für-virtuelle-Maschine. Das Problem ist, das Ausdrücke in Bytecode halt etwas komplexer sind, als das es so ein Tool sie ändern kann.
Programm: Code: [AUSKLAPPEN] print 50*(6+6), a
Möglicher Bytecode (ausgeschrieben): Code: [AUSKLAPPEN] PUSH a PUSH 6 PUSH 6 ADD PUSH 50 MUL CALL print (zumindest solltest du so deine Scriptsprache aufbauen. Ansonsten stell ich mir Dinge wie Punkt-vor-Strichrechnung und If-Blöcke etc. ziemlich schwierig vor o_O Mit deinem Tool könnte ich eher sowas machen: Code: [AUSKLAPPEN] CALL print PUSH 50 MUL PUSH 6 ADD PUSH 6 PUSH a Hier stellt sich die Frage: Wie soll Print aufgerufen werden wenn die Parameter unbekannt sind? Mit welcher Zahl soll 50 multipliziert werden? Wie kann ich die Punkt-vor-Strichrechnung realisieren? Man müsste zur Laufzeit (laaaaaangsam) wild im Code rumsuchen. --- Und bei den Highscores muss ich auch sagen, das ein "If score > 0 Alert()" vor dem Entrag wesentlich schneller arbeitet. |
||
Variety is the spice of life. One day ignore people, next day annoy them. |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
Stopstopstop ich glaube du Verstehst das tool nicht.
Sein Ziel ist es nicht Mathematische Konstrukte oder geschachtelte funktionen auseinander zu nehmen. Ein Sinn ist es dein PUSH ADD MUL un CALL in Zahlen und Zeichen zu verwandeln, dass ein Scriptinterpreter, sei er selbst geproggt oder gar der Prozessor, es lesen kann. Deshalb schrieb ich ja ihr könnt euch einen Assembler draus Basteln: Code: [AUSKLAPPEN] deffixed WINHEADER s2sMZ Blablaexedateiheader
defbetween push( ) b1b i<BETWEEN>i deffixed add b2b deffixed mul b3b defbetween call( ) b4b s<LEN>s<BETWEEN> b0b endcompilerdef WINHEADER PUSH( a ) PUSH( 6 ) PUSH( 6 ) ADD PUSH( 50 ) MUL CALL( print ) Das Tool erzeugt die entgültige Datei aus deinem Script "PUSH a..." mit Hilfe der darüber stehenden Definitionen heraus. Ich hab halt jetzt push so definiert dass zuerst das byte 1 dann die zahl als integer in die datei geschrieben wird. Wenn man die ganzen Codes der Prozessorkommandos kennt und den Windows-Exe-Header im Kopf hat, kann man daraus nen Assembler basteln. Man kann's auch lassen und einfach nur seine Ingame-Script-Engine verschnellen indem man ihr das Parsen abnimmt und nur ByteCode liest. Hamzta könnte seinen Scriptinterpreter, welcher ja auch Bytecode liest ,damit testen ohne seinen compiler anzupassen... zugegeben, wäre da etwas komisch, allerdings möglich. |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sorry, aber ich seh dahinter keinen wirklichen Nutzen oder Sinn. Du verkomplizierst nur eine relativ einfach selbst regelbare Sache. | ||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich finde ich vereinfache sie: Man macht aus verschiedenen Bytes die man zusammen suchen muss einen ausdruck, den man sogar relativ variabel gestalten kann mit defbetween, und so Vorgänge verkürzt, vor allem bei Wiederholung , die man in 'nem Hexeditor vllt nur mühsam machen kann. | ||
- Zuletzt bearbeitet von Silver_Knee am Do, Okt 09, 2008 22:36, insgesamt einmal bearbeitet
![]() |
maximilian |
![]() Antworten mit Zitat ![]() |
---|---|---|
Aha! Du hast also einen Lexer geschrieben! | ||
Variety is the spice of life. One day ignore people, next day annoy them. |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jo kommt hin. Außerdem kannst dudeine Keywords hier definieren, und musst dich an keine vorgegebenen halten.. aberr im prinzip das genannte danke =)
EDIT: Grade fällt mir noch auf: Maps lassen sich damit wunderbar generieren... grade von einem Tileset. Man Definiert WASSER b1b, GRASS b2b etc und kann sich seine Karte schreiben ohne sich nen Editor zu basteln. |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ist auch üüüüberhaupt nicht umständlich so, nein... ![]() |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Geeecko |
![]() Antworten mit Zitat ![]() |
---|---|---|
^
| Sinnloser Beitrag... ![]() ![]() ![]() ![]() ![]() Ich habs mir nicht angeschaut. Aber ich denke auch das es sich nicht lohnt sowas zu benutzen, da es besser wäre sich so etwas selber zu schreiben, das man Kontrolle drüber hat. Wenn man später noch mehr definieren kann, wäre es vllt gar nicht mal so schlecht, und eher zu gebrauchen ![]() lg MD |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Was ich da ironisch zum Audruck bringen wollte war dass es keinen Sinn macht eine Tilekarte per solcher Befehlsverhunzung zu realisieren, da es ja noch komplizierter als normal wird. Soviel zum Thema kein Editor mehr nötig.
Doch nicht so sinnlos, der Beitrag, Gaia. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Geeecko |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da kann ich BladeRunner nur zustimmen.
Dann lieber schnell einen Editor schreiben anstatt die Befehle per Define zu definieren... lg MD |
||
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jetz' aber ma Ruhe hier! Das ist keine Kritik mehr das ist ja garnix... Ich geh doch auch nicht in die Spielethreads rein und frag, ob es Sinn macht irgendwelche Spiele zu spielen! Worin besteht denn das Ziel dieses "Ist voll Sinnlos!". Soll ich das Projekt zurückziehen? Ich hab das programmiert um mir das Skripten von verschiedenen Spielen, an denen ich hin und wieder was mache zu erleichtern. Es erleichtert ungemein die Arbeit, wie ich finde, da ich nicht für jedes Spiel einen eigenen Editor schreiben muss, sondern mal flott eintrage: Hierhin ein Byte, dahin 'nen String. Und das ohne Hochsprachen-Skripteditor+Compiler mit gottweißwie komplexem parsen... Einfach nur Befehle in ne Datei Flott mit Readbyte ausgelesen und umgesetzt. Schneller geht's nurnoch über direkten Assembler... | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group