Code Cruncher für BlitzMax

Übersicht Sonstiges Projekte

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

mpmxyz

Betreff: Code Cruncher für BlitzMax

BeitragMi, Feb 24, 2010 20:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie einige vielleicht in meinem Worklog schon gelesen haben, habe ich einen Code Cruncher geschrieben.
So etwas kann man bei einem BCC immer gebrauchen.

Gibt es das nicht schon?
Ja, aber meiner hat im Gegensatz zu diesen höhere Kompressionsraten von ca. 50%.

Wie verwende ich das Teil?
Die zu crunchenden Dateien werden auf den Cruncher gezogen.
Wenn unter den Dateien eine *.txt-Datei ist, wird diese für die so genannte "Blacklist" verwendet:
Pro Zeile steht dort ein Begriff, der nicht verändert werden soll. (z.B. überschriebene externe Methoden)
Die gecrunchten Codes werden in dem selben Ordner unter einem anderen Dateinamen wieder abgespeichert.

Was macht das Teil eigentlich alles?
Der Code Cruncher entfernt:
  • Kommentare
  • doppelte Leerzeichen (Leerzeichen sind z.B. auch Tabulatoren)
  • Leerzeichen am Anfang und am Ende der Zeile
  • Leerzeichen in Identifiern
  • Leerzeichen um Operatoren
  • leere Zeilen
  • ".."+Zeilenumbruch

Der Code Cruncher ersetzt:
  • :Int, :Float, :String und :Double-Typetags durch ihre kürzere Version
  • True und False durch ihre Werte
  • deklarierte und nicht zur Blacklist gehörende Namen durch stark komprimierte Namen (extrem selten größer als 2 Zeichen, die Namen werden in allen gleichzeitig verändeten Dateien gleich verändert)
  • Zahlenwerte durch kürzere Versionen

Außerdem werden aufeinanderfolgende Local/Global/...-Deklarationen zusammengefasst.

Der Code Cruncher folgt auch "Import" und "Include" und verändert die eingebundenen Dateien.

Man kann in *.ini-Dateien einige Daten zusammenfassen:
Diese kann alle notwendigen Informationen enthalten, sodass man nur noch eine *.ini-Datei auf den Code Cruncher ziehen muss.
Es gibt folgende Einstellungmöglichkeiten:
  • "Suffix": ändert den Suffix, der an den veränderten Dateinamen drangehängt wird
  • "Blacklist": fügt ein Wort zur Blacklist hinzu
  • "File" oder "AddFile": fügt eine Datei zum Bearbeiten hinzu

Wie lange arbeitest du schon an diesem Projekt?
Ich habe vor 7 Tagen damit angefangen. (als ich den Beitrag erstellt hatte)
Als Basis diente mein Tokenizer.

Wie viel Code hast du geschrieben?
drei Dateien mit 21 KiB Code + Tokenizer-Basis (3 Dateien 56 KiB)

Wo bekomme ich das Wunderteil her?
Hier ist der Download.

Was kommt noch?
  • weitere Optimierungen
  • Features, die das Nutzen einfacher machen (u.A. Optionen)
  • wenn ich Lust habe, genug herumzukommentieren, auch der Code


Viel Spaß damit!
mpmxyz
  • Zuletzt bearbeitet von mpmxyz am So, Mai 16, 2010 18:03, insgesamt 7-mal bearbeitet

Thunder

BeitragMi, Feb 24, 2010 21:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hört sich sehr gut an, doch es gibt noch ein Paar Fehler:
BlitzMax: [AUSKLAPPEN]
Import brl.timer

wird zu
BlitzMax: [AUSKLAPPEN]
Import brl.ea

weil ich einen Timer namens timer deklariert habe.

Außerdem gibt es Probleme, wenn ich Include verwende, wegen doppelter Funktionsdeklaration.


Aber ansonsten muss ich sagen, dass es dir sehr gut gelungen ist. Das Programm konnte meinen Tanksclone halbieren Wink .

mfg Thunder
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

mpmxyz

BeitragMi, Feb 24, 2010 21:30
Antworten mit Zitat
Benutzer-Profile anzeigen
@Thunder:
Das liegt daran, dass ich den Code nicht voll durchparse.
Gegen dieses Problem gibt es die "Blacklist".

Include-Problem?
Hast du beide Dateien zusammen gecruncht?
Wenn nein, dann zeige am Besten mal ein Beispiel.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Thunder

BeitragMi, Feb 24, 2010 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe zum Probieren den wTanksClone genommen. Download: https://www.blitzforum.de/upload/file.php?id=7735
Da sind die zwei Sourcefiles drinnen.

Und, wie ist das genau mit der Blacklist - extern scheint sie ja nicht zu sein, was aber eine schöne Erweiterung wäre.

mfg Thunder

Edit: Das Include-Problem ist nur aufgetreten, weil ich den String, den ich Include übergebe nicht verändert habe, aber es kommt trotzdem eine EXCEPTION_ACCESS_VIOLATION Error.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Xeres

Moderator

BeitragMi, Feb 24, 2010 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Mh, bei mir kommt "Unhandled Exception:Expecting a closing quotation Mark!" bei zwei Codes...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

mpmxyz

BeitragMi, Feb 24, 2010 21:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Thunder:
Die Blacklist ist eine Textdatei, die mitgezogen wird.
Bei mir sieht sie z.B. so aus:
Code: [AUSKLAPPEN]
Create
NextLink
Replace

Dort muss bei dir dann "Timer" stehen.
Ich habe übrigens keine Probleme mit dem Code...
Xeres:
Wie ist die entsprechende Stelle aufgebaut?
Das ist nämlich ein Fehler, der vom Tokenizer selbst kommt.
Es ist gut möglich, dass ich eine der Regeln für BlitzMax-Code nicht kenne.
Ohne Code nichts los... Wink
mfG
mpmxyz
P.S.: Ich sollte bei der Fehlermeldung auch eine Positionsangabe machen...
Edit: Ist das ein einzelnes Anführungszeichen in einem Rem/EndRem-Kommentar? Ich merke gerade, dass ich an so etwas nicht gedacht habe...
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Xeres

Moderator

BeitragMi, Feb 24, 2010 22:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Keine Ahnung welche Stelle gemeint ist - Eine Positionsangabe wäre dabei hilfreich.
BlitzMax: [AUSKLAPPEN]
SuperStrict
AppTitle = "Xeres - BCC #31 - Preview"
Graphics(256, 256, 0, 60)
SeedRnd MilliSecs()
AutoMidHandle(True)
HideMouse()
Local timer:TTimer = TTimer.Create(60)

Global mx:Int, my:Int, mh1:Int, md1:Int, ms:Float

'* Überbleibsel aus der "Vollversion":
Const GAME_STATE_MENU:Int = 0, GAME_STATE_PLAY:Int = 1
Global Game_State:Int = GAME_STATE_MENU

'* Bilder Laden (und in der Exe mitliefern)
Incbin "Data\cur.png"
Global cursor:TImage = LoadImage("incbin::Data\cur.png")
cursor.handle_x = 0
cursor.handle_y = 0

Incbin "Data\bg.png"
Global bg:TImage = LoadImage("incbin::Data\bg.png")

Incbin "Data\mmenu.png"
Local menu_img:TImage = LoadAnimImage("incbin::Data\mmenu.png", 192, 32, 0, 6)
Global Menu_Neu:T_Button = T_Button.Create(menu_img, 0, 1, NewGame)
Global Menu_laden:T_Button = T_Button.Create(menu_img, 2, 3, LoadGame)
Global Menu_Ende:T_Button = T_Button.Create(menu_img, 4, 5, MyEnd)

Incbin "Data\Chicken.png"
T_Chicken.img:TImage = LoadAnimImage("incbin::Data\Chicken.png", 96, 96, 0, 9)

Global Menu_chicken:T_Button = T_Button.Create(T_Chicken.img, 1, 4, Gack)



SetClsColor(255, 255, 255)
SetBlend(ALPHABLEND)

Repeat
ms = MilliSecs()
mx = MouseX()
my = MouseY()
mh1 = MouseHit(1)
md1 = MouseDown(1)

Select Game_State
Case GAME_STATE_MENU
Run_Menu()
Case GAME_STATE_PLAY
Run_Play()
End Select

DrawImage(cursor, mx, my)
Flip(0)
timer.Wait()
Cls
If KeyHit(KEY_ESCAPE) Or AppTerminate() Then End
Forever
End

Type T_Chicken
Global img:TImage
End Type

Type T_Button
Field img:TImage
Field norm:Int, hover:Int
Field func()

rem
Jedem Button kann eine Funktion übergeben werden, die beim
klicken ausgelöst wird.
endrem

Function Create:T_Button(_img:TImage, _norm:Int, _hover:Int, _func() = Null)
Local b:T_Button = New T_Button
b.img = _img
b.norm = _norm
b.hover = _hover
b.func = _func
Return b
End Function

Method Draw(_x:Float, _y:Float)
If MouseInRect(_x, _y, Self.img.Width, Self.img.Height) Then
DrawImage(Self.img, _x, _y, Self.hover)
If mh1 Then If Self.func Then Self.func()
Else
DrawImage(Self.img, _x, _y, Self.norm)
End If
End Method
End Type

Function MyEnd()
Local c:Int = Confirm("Wirklich beenden?", True)
If c Then End
End Function

Function LoadGame()
Notify("Das geht in dieser Demo noch nicht.")
End Function

Function NewGame()
Notify("Der Spielinhalt wird zu einem späteren Zeitpunkt zur Verfügung stehen.~n(Vielleicht)")
End Function

Function Gack()
Notify("Gaaack!")
End Function

Function Run_Menu()

'DrawImage(T_Chicken.img,, 1)
Menu_chicken.Draw(128, 195)
DrawImage(bg, 128, 128)
Menu_Neu.Draw(128, 32)
Menu_laden.Draw(128, 96)
Menu_Ende.Draw(128, 232)

End Function

Function Run_Play()

End Function

Function MouseInRect:Int(_x:Float, _y:Float, _b:Float, _h:Float)
If mx < (_x - _b / 2) Then Return False
If mx > (_x + _b / 2) Then Return False
If my < (_y - _h / 2) Then Return False
If my > (_y + _h / 2) Then Return False
Return True
End Function


Edit: Kopiert, eingefügt und hat funktioniert... womöglich Blide Steuerzeichen?!
Edit2: Des Rätsels Lösung: Blide benutzt Unicode Rolling Eyes
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Thunder

BeitragMi, Feb 24, 2010 22:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei mir gibt es keine Textdatei. (Der Downloadlink verweist auf eine Exe)
Falls die Exe die TXT Datei erstellt - wo speichert sie diese?

mfg Thunder


Edit: Ok, danke!
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
  • Zuletzt bearbeitet von Thunder am Mi, Feb 24, 2010 22:26, insgesamt einmal bearbeitet

mpmxyz

BeitragMi, Feb 24, 2010 22:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, ich habe mich wohl nicht ganz verständlich ausgedrückt.

DU erstellst eine Textdatei, die du mit den Codedateien mitziehst.

Mit dieser Textdatei schließt du Begriffe von der Komprimierung aus.
Der häufig verwendete Begriff "Create" sollte z.B. ausgeschlossen werden, wenn man eine Type-Funktion(oder andere deklarierte Sachen) mit eben diesem Namen nutzt.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

mpmxyz

BeitragFr, Feb 26, 2010 17:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hoffe, dass es genug Änderungen gab, diesen Doppelpost zu rechtfertigen:

Die wichtigste Neuerung:
Der Code Cruncher folgt auch Includes und Imports.
Das heißt, dass er die angegebenen Dateien auch modifiziert und die Dateiangaben ändert.

Die neuste Version unterstützt jetzt auch Unicode und es sollte bei Rem/EndRem-Blöcken mit alleine stehenden Anführungszeichen keine Fehlermeldungen mehr geben.

Alle aufgetretenen Probleme und einige weitere sollten jetzt behoben sein.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Firstdeathmaker

BeitragSa, Feb 27, 2010 2:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Kleiner Tipp: Du kannst ":Byte" auch noch in "%" Int umwandeln um noch etwas mehr rauszuholen.
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Thunder

BeitragSa, Feb 27, 2010 13:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube nicht, dass das eine gute Idee ist, da Byte nur positive Werte von 0...255 erlaubt, jedoch int von
-(256^4/2) ... (256^4/2)-1. Wenn man also folgenden Code hat:

BlitzMax: [AUSKLAPPEN]
Local i:Byte=255
i:+66 ' bei Int wäre es jetzt 321 - bei Byte ist es 65
Print i


wird das Ergebnis verändert.

mfg Thunder


Edit: Die Idee mit dem @ ist aber gut - ich wusste gar nicht, dass das geht.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
  • Zuletzt bearbeitet von Thunder am Sa, Feb 27, 2010 13:50, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragSa, Feb 27, 2010 13:46
Antworten mit Zitat
Benutzer-Profile anzeigen
:Byte = @

Funktioniert jetzt auch mit Blide Problemlos: Du könntest noch Zeilenumbrüche mit ";" ersetzen und für Konstanten deren Werte einsetzen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Geeecko

BeitragSa, Feb 27, 2010 13:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Xeres hat Folgendes geschrieben:
:Byte = @

Funktioniert jetzt auch mit Blide Problemlos: Du könntest noch Zeilenumbrüche mit ";" ersetzen und für Konstanten deren Werte einsetzen.


Bei den Konstanten würde ich dann aber gucken, ob sich das lohnt.
Zum Beispiel: Const s:string = "hallo ich bin ein ganz langerw satz"
Würde eher... negativ sein.
....

mpmxyz

BeitragSa, Feb 27, 2010 17:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Schön, dass es endlich hier eine Diskusion gibt! Smile

"@"=":Byte":
Danke für den Tipp!
Da das allerdings nicht dokumentiert zu sein scheint, habe ich die Ini-Option "CrunchByte" mit dem Startwert 1(=aktiviert) hinzugefügt.
Außerdem musste ich darauf achten, dass man das nicht nach Zahlen schreiben darf. ("123:Byte"->"123@" geht nicht.)

Zeilenumbruch zu ";":
Das geht leider nicht immer.
Aber man spart trotzdem genau so viele Prozente - ca. 3% macht diese Funktion aus - , wenn man statt "~r~n"/Chr(13)+Chr(10) nur "~n"/Chr(10) nutzt.
Falls es damit Probleme gibt, kann man es mit der Ini-Option "CrunchLine" um-/ausschalten. (0-aus,1/13 - normal,2/10 - Ersetzen mit "~r" statt mit "~n")

Konstanten ersetzen:
Das wäre ziemlich kompliziert.
Denn ich müsste nicht nur die Werte ersetzen, sondern auch die Deklaration löschen.
Vorher muss aber abgewägt werden, ob es sich lohnt. (Unterm Strich lässt sich nur bei der Deklaration richtig sparen.)
Dazu muss ich aber auch die anderen Konstanten beachten.
("Const a...,b...,c..." Wenn nur a weg ist, könnte es sich möglicherweise nicht lohnen; wenn aber alle Konstanten weg sind, könnte es sich doch lohnen, da das 'Const' auch weg kann.)
Das letzte Gegenargument gegen Konstantenersetzungen ist die Tatsache, dass man in der einen Funktion die Konstante "a" haben kann und in jenem Type eine Globale "a" existiert.
Da ich den Code aber eben nicht voll durchparse, kann ich den Unterschied nicht erkennen.
Daher lasse ich es mit den Konstanten sein.

mfG
mpmxyz
Edit: Die neue Version ist jetzt hochgeladen.
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Xeres

Moderator

BeitragMi, Apr 28, 2010 19:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest Zahlen noch Zahlen wie "0.23" zu ".23" Kürzen. Nicht das es dringend wäre - nur der Vollständigkeit halber.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

das wurgel

BeitragSo, Mai 16, 2010 2:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist zwar nicht der Rede wert, aber da wo früher die Thens von mehrzeilgen Ifs waren sind bei mir jetzt überflüssige Leerzeichen.
1 ist ungefähr 3
 

MasterK

BeitragSo, Mai 16, 2010 12:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich als unwissender hätte da mal ne frage:
Wozu soll so ein programm gut sein? Ich kanns bei java und co ja noch verstehen (da macht sowas teilweise wirklich sinn), aber bmax wird doch eh compiliert?
+++ www.masterk.de.vu +++
Lila FTW!

Thunder

BeitragSo, Mai 16, 2010 12:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei Java macht es genausowenig Sinn. Java wird auch kompiliert. Nicht in Maschinencode, aber Bytecode und überflüssige Leerzeichen... werden sowieso nicht in diesem gespeichert.
Es ist nützlich, wenn es bei Wettbewerben (zB: BlitzCodeCompo - wird regelmäßig im Projekte-Subforum veranstaltet), ein Codelimit gibt.

Edit: Gut - es kann Sinn machen bei Java, allerdings nur bei wahnsinniglangen Variablen-/Funktionsnamen oder wahnsinnigvielen Variablen/Funktionen oder wenn man nur Lochstreifen zur Verfügung hat.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
  • Zuletzt bearbeitet von Thunder am So, Mai 16, 2010 12:25, insgesamt einmal bearbeitet
 

MasterK

BeitragSo, Mai 16, 2010 12:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Es macht bei java sehr wohl sinn. Denn im bytecode werden durchaus die bezeichner gespeichert. Ein obfuscator ersetzt diese durch nichtssagende kurze bezeichner. Wenn speicherplatz wichtig ist, kann man da einiges sparen. Nicht zu vergessen, dass so ein obfuscator natürlich auch zu nem gewissen grad gegen reverse engineering schützt.

@Wettbewerbe: Naja, dazu hatte ich vor längerer zeit eh schonmal gesagt, dass ne bytegrössenbeschränkung quark ist. Besser wäre eine token-beschränkung.
+++ www.masterk.de.vu +++
Lila FTW!

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht Sonstiges Projekte

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group