CleanScript - verkleinert au3 und Exe deutlich ohne Funktionsverlust

    • Offizieller Beitrag

    Hallo!

    An alle, die gerne kleine Skripte und vor allem kleine Exe-Dateien haben, an die 56k-Modem-Nutzer und 20-GB-Festplatten-Besitzer ;) (Ich liebe euch alle :D)

    Zusammen mit Markus habe ich ein Programm in C++ geschrieben, das AutoIt-Skript vor dem Kompilieren selbst parst.

    Dabei werden zunächst die Includes eingebaut. Dann werden je nach Einstellung in der zugehörigen AutoIt-GUI (GUIS in C++ sind einfach nur pain) Kommentare und/oder ungenutzte Funktionen entfernt. Das Entfernen von Kommentaren beherrscht auch Tidy.exe aus dem SciTE-Lieferumfang. Leider wird das aber in AutoIt gemacht, sodass die Performance bescheiden ist. "CleanScript" erledigt die Kommentarentfernung bei Galenda in weniger als einer halben Sekunde, wobei die meiste Zeit durch Ausgaben auf der Konsole verloren geht. Tidy braucht (zugegeben inklusive Einrücken) 45 Sekunden.
    Das Highlight in unserem Programm ist aber zweifellos die Möglichkeit, ungenutzte Funktionen entfernen zu können. Dazu wird der gesamte Quelltext inklusive Include-Dateien auf Funktionen und deren Aufrufe hin untersucht. Funktionen, die definiert, aber nie aufgerufen werden (i.d.R. die große Mehrheit derer, die aus den Includes kommen), werden entfernt.
    Zu guter Letzt werden auch die leeren Zeilen noch entfernt.

    Mal ein Beispiel anhand der aktuellen Galenda-Version:
    Ursprungsgröße Skript (mit Includes): 575 KB
    Nach Behandlung mit CleanScript: 217 KB - bei gleicher Funktionalität...
    Ursprungsgröße kompiliertes Skript: 310 KB
    Nach Behandlung mit CleanScript: 235 KB (knapp 25% Einsparung)

    Das kann sich schon sehen lassen, denke ich.

    Was man beachten muss:
    - Bei #includes, darf nur ein Leerzeichen in der Zeile stehen und zwar zwischen "#include" und < oder ".
    - Bei Strichpunkten, die keine Kommentare anzeigen (z.B. in MsgBoxen oder Strings) kann es zu unerwünschten Resultaten führen, wenn man die Kommentare entfernen lässt. Dazu müsste man den Dev-C++ 4.9.9.2-Quelltext leicht anpassen.
    - Call und Execute können bei der Funktionsenternung Probleme machen, da Aufrufe der Funktionen dann nicht erkannt werden. Abhilfe kann ein Aufruf an beliebiger anderer Stelle schaffen.

    Bitte ausführlich testen und vielleicht auch die ein oder andere Einsparungszahl posten...

    peethebee & Markus

  • Zitat

    Original von peethebee
    Zusammen mit Markus habe ich ein Programm in C++ geschrieben, das AutoIt-Skript vor dem Kompilieren selbst parst.

    peethebee & Markus

    So so, ein bisschen fremd gegangen. ;)

  • Hi,

    Klasse Tool :klatschen: - ... Ich habe es mal getesten - Prüfung bestanden :musik1:

    So etwas ähnliches wolte ich eigendlich auch mal mit Autoit bauen.

  • peethebee Wenn du mir das Skript schickst dann kann ich es mir mal anschauen und entscheiden ob ich das Programm in AutoIT nachprogrammier oder nicht

  • Hi!

    Wie ihr vlt auch im englischen Forum sehen konntet, habe ich inzwischen einige Verbesserungen eingebaut:

    - sicheres Finden der #include lines (alle Varianten erlaubt (#inClUdE) und Leerzeichen/Tabs machen auch keine Probleme mehr, nur zwischen den Klammern ("";<>), dürfen keine Leerzeichen vorkommen, also bitte eure Pfade so anpassen, dass keine drin sind^^)
    - comments werden jetzt auch 99% sicher entfernt, also auch kein Problem mehr, wenn ihr z.B. Semikolons wegen SQL oder so in eurem Skript habt, die werden dann nicht entfernt
    - darüber hinaus habe ich jetzt auch das Variablen feature eingebaut, dass alle deklarierten Variablen (z.B. aus GUI-Constants), die nicht benutzt werden, aus dem Skript gelöscht werden
    - mehrfach includes sind jetzt auch möglich,d.h., dass ein file, dass von einem includeten file includet wird, jetzt auch mit in die fertige Datei geschrieben wird
    - dabei kann es allerdings zu keinen doppelten includes kommen (also dass eine datei 2mal includet wird), da überprüft wird, ob das file schon includet ist
    - die Gui ist auch weiterentwickelt:
    - um Variablen sicher suchen zu können, habe ich es zur Pflicht gemacht, dass Comments entfernt werden
    - jetzt natürlich die Option Variablen entfernen zu lassen
    - und die Option, wie oft nach unnützen Funktionen gesucht werden soll

    Viel Spaß damit

    Markus

  • Ich finde das programm super.

    EDIT: Momentan habe ich das Problem, das CleanScript die Include-Dateien liest und das geschlagene 3 Stunden ohne ein Muckser. An was kann das liegen

    Einmal editiert, zuletzt von DJMANU (28. September 2006 um 17:22)

    • Offizieller Beitrag

    Hol dir mal die aktuelle Version aus dem englischen Forum. Die hat schon wesentliche Verbesserungen durch Markus erfahren. So gehen jetzt auch mehrfache Inlcudes und Include-once (?). Außerdem säuft es insgesamt schneller und ist objektorientiert.

    peethebee

  • Ich hätte noch eine Idee für das CleanScript, und zwar ich habe mir das CleanScript mal heruntergeladen und ausprobiert. Was mich gestört hat, das CleanScript alle Includes in das Skript eingefügt hst. Und dazu hätte ich eine Idee. Man könnte es so machen, das der Benutzer die AU3-Datei auswählt danach erstellt CleanScript einen neuen Ordner und dort kopiert CS alle Skripte rein, die in dem Skript verlinkt sind.

    • Offizieller Beitrag

    Hi Sammy!

    Das ist eines der Top-Features von CleanScript. Nur so können auch in Includes Kommentare entfernt werden. Vor allem aber kann man so ungenutzte Funktionen in den Inludes wegmachen, was dort in den allermeisten Fällen vorkommt, da man selten alle Funktionen aus einem Include nutzt. Auch die Entfernung von ungenutzten Variablen geht nur, wenn die Includes vorher eingefügt werden.
    Nachdem dieses Verfahren nur ein Output-Skript erzeugt und auch wesentlich zur Größenersparnis beiträgt, bin ich Markus sehr dankbar dafür, dass er das eingebaut hat (was wahrlich nicht einfach war!).

    peethebee

  • Hallo ich habe ein problem wenn ich das CleanScript benutz habe dann funtzen meine scripte nicht mehr.

    Woran kann das liegen?

    Einmal editiert, zuletzt von König Mickey (27. Oktober 2007 um 10:42)

  • Es ist der Code von dir hier und irgendwie bekomme ich das hier net rein

    [autoit]

    Case $button_close
    Exit

    Case $GUI_EVENT_CLOSE
    Exit

    [/autoit]

    Immer kommt dann ein fehler könntes du das reintuen, Markus?

    Und hier der Code wie er momentan bei mir aussieht

    Spoiler anzeigen
    [autoit]

    #NoTrayIcon

    [/autoit] [autoit][/autoit] [autoit]

    $gui = GUICreate("CleanScript - by peethebee & Markus, 2006", 500, 340)
    GUISetOnEvent(-3, "quit")
    GUICtrlCreateLabel("Quelldatei Pfad:", 20, 20, 150, 20)
    $input_src = GUICtrlCreateInput("", 20, 35, 340, 20)
    $button_src = GUICtrlCreateButton("Durchsuchen...", 380, 35, 100, 20)
    GUICtrlSetOnEvent(-1, "src")
    GUICtrlCreateLabel("Zieldatei Pfad:", 20, 80, 150, 20)
    $input_dest = GUICtrlCreateInput("", 20, 95, 340, 20)
    $button_dest = GUICtrlCreateButton("Durchsuchen...", 380, 95, 100, 20)
    GUICtrlSetOnEvent(-1, "dest")
    GUICtrlCreateGroup("Optionen", 20, 150, 340, 180)
    $opt1 = GUICtrlCreateCheckbox("Kommentare entfernen", 40, 170, 250, 20)
    GUICtrlSetState(-1, 1)
    GUICtrlSetState(-1, 128)
    $opt2 = GUICtrlCreateCheckbox("Ungenutzte Funktionen entfernen Runs:", 40, 190, 255, 20)
    GUICtrlSetState(-1, 1)
    $input_nr=GUICtrlCreateInput ( "1", 300, 190, 40 , 20 , 8192)
    GUICtrlCreateUpdown ( -1 )
    GUICtrlSetLimit ( -1, 9 , 1 )
    $opt3 = GUICtrlCreateCheckbox("Ungenutzte Konstanten und Variablen entfernen", 40, 210, 250, 20)
    GUICtrlSetState(-1, 1)
    $opt_incl = GUICtrlCreateCheckbox("use beta includes", 40, 250, 250, 20)
    GUICtrlSetState(-1, 1)
    $opt_cout = GUICtrlCreateCheckbox("show full output", 40, 290, 250, 20)
    GUICtrlSetState(-1, 1)
    $button_close = GUICtrlCreateButton("&Programm beenden", 380, 250, 100, 25, 0x0001)
    $button_start = GUICtrlCreateButton("&Script Reinigen", 380, 225, 100, 25, 0x0001)
    GUICtrlSetOnEvent(-1, "start")
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func quit()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func src()
    $path = FileOpenDialog("Quelldatei auswählen", @ScriptDir, "AutoIt Script (*.au3)", 1+2)
    If not @error Then
    GUICtrlSetData($input_src, $path)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func dest()
    $path = FileOpenDialog("Zieldatei auswählen", @ScriptDir, "AutoIt Script (*.au3)|All files (*.*)")
    If not @error Then
    GUICtrlSetData($input_dest, $path)
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func start()
    GUICtrlSetState($button_start, 128)

    [/autoit] [autoit][/autoit] [autoit]

    If GUICtrlRead($input_src) <> "" Then
    $input_src_str = '"' & GUICtrlRead($input_src) & '"'

    [/autoit] [autoit][/autoit] [autoit]

    Else
    MsgBox(16+8192, "Fehler", "Keine Quelldatei ausgewählt...")
    GUICtrlSetState($button_start, 64)
    Return -1
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If GUICtrlRead($input_dest) <> "" Then
    $input_dest_str = FileGetShortName(GUICtrlRead($input_dest))
    Else
    $input_dest_str = '"' & StringTrimRight(GUICtrlRead($input_src), 4) & '_clean.au3"'

    [/autoit] [autoit][/autoit] [autoit]

    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $param_str = ""
    If GUICtrlRead($opt1) = 1 Then
    $param_str &= "C"
    Else
    $param_str &= "-"
    EndIf
    If GUICtrlRead($opt2) = 1 Then
    $param_str &= "F"
    Else
    $param_str &= "-"
    EndIf
    If GUICtrlRead($opt3) = 1 Then
    $param_str &= "G"
    Else
    $param_str &= "-"
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    If GUICtrlRead($opt_incl) = 1 Then
    $incl_dir_str = FileGetShortName(RegRead("HKLM\Software\AutoIt v3\AutoIt", "betaInstallDir") & "\Include")
    Else
    $incl_dir_str = FileGetShortName(RegRead("HKLM\Software\AutoIt v3\AutoIt", "InstallDir") & "\Include")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $parts = StringSplit($input_src_str, "\")
    $script_path = ""
    For $i = 1 to $parts[0] -1
    $script_path = $script_path & $parts[$i] & "\"
    Next
    $script_path = StringTrimRight($script_path, 1) & '"'

    If GUICtrlRead($opt_cout) = 1 Then
    $do_cout = "C"
    Else
    $do_cout = "-"
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    RunWait('"' & @ScriptDir & '\CleanScript.exe" ' & $input_src_str & " " & $param_str & " " & $input_dest_str & " " & $incl_dir_str & " " & $script_path & " " & GUICtrlRead($input_nr) & " " & $do_cout)
    GUICtrlSetState($button_start, 64)
    EndFunc

    [/autoit]

    Ich habe nur das Aussehen geändert nichts an denn Funcs geändert aba Markus könntes du das reintuen

    [autoit]

    Case $button_close
    Exit

    Case $GUI_EVENT_CLOSE
    Exit

    [/autoit]


    ???

    Schonmal Danke

  • Kannst du mal ganze Sätze schreiben,
    dir merken dass ein Fragezeiche (1, ? ) reicht,
    nicht 20x in einem Post das selbe bitten,
    aba = aber ,
    dich genauer ausdrücken,
    original Scripts nicht verändern?

  • OK aber ich setzte die veränderten Original Scripte doch nicht ins web?

    Aber kann jemand dort helfen?

    Danke im Voraus an alle die Helfen