kompilierte Datei unterschiedlich groß

  • Sagt mal, kann mir jemand erklären warum ein kompiliertes Script mit einer älternen Aut2Exe kleiner wird als mit einer aktuellen?

    Das gleiche Script:

    • AutoIT 3.3.6.1 ... 458.230 kb
    • AutoIT 3.3.16.1 ... 664.576 kb

    Dabei habe ich höchste kompression mit UPX Compress ausgewählt.

  • Weil die "kompilierte" Datei im Prinzip eine Kombination aus "Interpreter + Skript" ist.

    Der Interpreter (die AutoIt.exe) wird mit jeder Version ein wenig größer. Das hat mehrere Gründe (spekulativ, da ich es natürlich nicht wissen kann, aber ich kann einen educated guess anstellen):

    - Es wird selten/nie alter Code entfernt/ersetzt, sondern nur neuer hinzugefügt (kein Refactoring, sondern immer nur hinzufügen/instandhalten)

    - Es werden werden Lookuptables für einige Funktionen hinzugefügt (damit sie grundsätzlich dasselbe Ergebnis liefern, egal auf welcher Hardware das Skript läuft)

    - Es werden Features hinzugefügt/Bugs gefixt die neue #includes erfordern, sodass vielleicht nur 500 Byte neuer Code im Interpreter gelandet ist der aber eine 50 KB Vergrößerung verursacht.

    - usw.

    lg

    M

  • Das Problem interessiert mich schon lange.

    (Zitat): "Weil die "kompilierte" Datei im Prinzip eine Kombination aus "Interpreter + Skript" ist." - kann ich nicht so recht nachvollziehen.
    Demnach müßte eine dementsprechende exe-Datei immer größer als die Interpreter-Datei "AutoIt3.exe" sein.

    Dem ist aber nicht so! -

    Aus meinen ersten Versuchen mit AutoIt habe ich hier einen "Test Inputbox" - da ist die exe 296kB groß, bei einem Skript von 4kB und dem verwendeten AutoIt3.exe von 715kB (3.3.4.0). Das ist doch schon merkwürdig ...
    Leider ist (mir) von der interen Funktionalität des sog. "Interpreters" nichts bekannt. So, wie bei BASIC kann es aber nicht sein - dort werden wirklich die Laufzeitbibliotheken und das Skript zur exe-Datei "zusammengebunden". Deshalb sind die in der Regel auch so groß und sooo langsam ...

    Bei AutoIt hatte ich immer vermutet - d.h. bisher noch nicht bestätigt bekommen, daß hier die Grundlage die konsequente Umsetzung der WinAPI auf leicht handhabbare Skript-Sprache ist ...

    Gibt es irgendwo eine Erklärung zu den "Interna" von AutoIt?

    Ansonsten ist AutoIt eine tolle Sache! - Als letztes Ergebnis habe ich eine Bedienoberfläche für die Mediathek des https://www.industriesalon.de/ programmiert -> http://www.ps-blnkd.de/Mediathek.htm.

    Grüsse aus Berlin

    PSblnkd

  • Ob du das nachvollziehen kannst, oder nicht. In der kompilierten exe steckt "der Interpeter" & "das Skript". Das habe ich mir nicht ausgedacht, das war schon immer so und wird auch immer so bleiben. Wenn dein Skript eine konstante größe hat, dann ist der Interpreter der Teil der immer größer wird.

    Nachlesen kannst du das hier: https://www.autoitscript.com/autoit3/docs/intro/running.htm (im Unteren Teil: Run a script using another compiled script, irgendwo gibts dazu auch noch eine bessere Beschreibung, das ist die erste die ich auf die Schnelle gefunden habe)

    Wie das mit den verschiedenen Größen aussieht kann ich auch nur mutmaßen.

    lg

    M

  • (Zitat von Mars): "Weil die "kompilierte" Datei im Prinzip eine Kombination aus "Interpreter + Skript" ist."

    - kann ich nicht so recht nachvollziehen.
    Demnach müßte eine dementsprechende exe-Datei immer größer als die Interpreter-Datei "AutoIt3.exe" sein.

    Dem ist aber nicht so! -

    Aus meinen ersten Versuchen mit AutoIt habe ich hier einen "Test Inputbox" - da ist die exe 296kB groß, bei einem Skript von 4kB und dem verwendeten AutoIt3.exe von 715kB (3.3.4.0). Das ist doch schon merkwürdig ...

    Wie Mars bereits richtig schrieb, enthält ein 'kompiliertes AutoIt-Skript' (.exe) folgende Komponenten :

    - den AutoIt-Interpreter (also die AutoIt3.exe - bzw. AutoIt3_x64.exe falls #AutoIt3Wrapper_UseX64 = Y)

    - das Skript sowie verwendete #includes in einer 'tokenized' Variante (a3x)

    - Dateien, die mittels FileInstall eingebunden werden

    Der Grund, warum Deine kompilierte .exe-Datei kleiner ist als der Interpreter selbst liegt daran, dass die UPX-Komprimierung aktiv ist :

    #AutoIt3Wrapper_UseUpx= ;(Y/N) Compress output program. Default=Y

    Diese Komprimierung ist aber leider auch ein Hauptgrund für 'false positive' Warnungen von Virenscannern.

    Daher wird in diversen Beiträgen empfohlen, sie zu deaktivieren, mittels :

    #AutoIt3Wrapper_UseUpx=N

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (13. August 2023 um 19:12) aus folgendem Grund: typo

  • Sagt mal, kann mir jemand erklären warum ein kompiliertes Script mit einer älternen Aut2Exe kleiner wird als mit einer aktuellen?

    Ja, ist größer, weil es mehr Fähigkeiten hat, was mehr Code bedeutet, was eine größere ausführbare Datei bedeutet.

    Macht Sinn ?

  • Mars

    Danke für den Hinweis auf die Doku in https://www.autoitscript.com/autoit3/docs/intro/running.htm.

    Also, wenn ich das richtig verstanden habe (mein Englisch ist nicht so gut), dann muß man unterscheiden:

    - AutoIt-Skript mit dem Interpreter AutoIt3.exe ausführen und

    - AutoIt-Skript mit dem Compiler Aut2exe.exe (bei mir die Version 3.3.4.0 = 299k) in eine exe-Datei überführen, so wie es mit SciTE gemacht wird.

    Die exe ist dann auf jedem (?) Windows-PC lauffähig - ohne eine AutoIt-Installation, d.h. ohne den Interpreter AutoIt3.exe.

    Der Interpreter wird so ähnlich funktionieren wie bei BASIC. Auch dort werden zahlreiche Laufzeitdatein bzw. Frameworks als "Beiwerk" benötigt.

    Deshalb finde ich die Compilierung mittels des AutoIt-Compiler Aut2exe.exe so faszinierend, weil dabei kein "Beiwerk" benötigt wird und die exe-Datein im Gegensatz zu manch anderen Programmiersprachen sehr klein sind.

    Leider habe ich zu den Interna des AutoIt-Compilers bislang keine weiteren Angaben gefunden - außer, daß man irgendwie/zu irgendwas eine Lizenz beantragen kann ...

    Grüsse aus Berlin

    PSblnkd

    Einmal editiert, zuletzt von Musashi (18. August 2023 um 14:20) aus folgendem Grund: den Haufen von Leerzeilen am Beitragsende entfernt

  • Keiner einen "hilfreichen" Kommentar?

    ... noch eine Ergänzung zu meinem Posting vom Montag 14.08.2023,

    Es ist tatsächlich so, daß auch die neueren Versionen von Aut2exe größer sind als ältere, z.B. die mir vorliegende Version 3.3.14.5 mit 1305kB. Damit meine o.g Testdatei kompiliert ergibt dann auch eine etwas größere exe (376kB9 - und die läuft genauso wie die alte ... das ist schon sehr merkwürdig ...
    Nachdem, was ich in https://www.autoitscript.com/autoit3/docs/intro/running.htm nachgelesen habe (mit G-Translater übersetzt), gibt es auch eine Möglichkeit nur eine Zeile des Skripts mit dem Interpreter auszuführen, bzw. mit Aut2exe zu kompilieren. Dabei können jeweils auftretende Fehler in den stdout-Kanal (was ist das?) umgeleitet werden.

    Dieses Feature wäre eine willkommende Ergänzung zur SciTE-Funktionalität, wo es bisher keine Möglichkeit gibt den Quelltext im Schritt-Modus (Step-Betrieb) testen zu können, wie das z.B. bei VB üblich ist. Dort kann man sich dann ggf. auch gleich noch die Veränderungen in den Variablen anschauen ... Z.Zt. behelfe ich mich mit MsgBoxen ...
    Die Source-Datei vom SciTE gibt es zwar in vielen Versionen, aber um dort dahinter steigen zu können, um einen zusätzlichen Menüpunkt einzubauen, fehlt mir momentan die Zeit.

    Grüsse aus Berlin

    PSblnkd

  • Aus reiner Neugier ;) : Geht es Dir lediglich darum, einige MB hier und da einzusparen ?

    Dort kann man sich dann ggf. auch gleich noch die Veränderungen in den Variablen anschauen ... Z.Zt. behelfe ich mich mit MsgBoxen ...

    Eine kleine Tipphilfe zu MsgBoxen und ConsoleWrites :

    Nehme folgendes Trivialskript :

    AutoIt
    Local $iCount = 0
    For $i = 1 To 5
         $iCount += $i * 2
    Next

    Setze den Mauscursor auf die Variable $iCount in der Schleife.

    Verwende nun die Tastenkombination ALT-D (natürlich ohne das - Zeichen).

    Damit wird automatisch eine ConsoleWrite-Anweisung eingefügt.

    Mit der Tastenkombination CTRL-SHIFT-D wird analog eine MsgBox eingefügt.

    Mit der Tastenkombination CTRL-ALT-Z können alle so eingefügten Zeilen wieder entfernt werden.

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

    Einmal editiert, zuletzt von Musashi (18. August 2023 um 14:21) aus folgendem Grund: typo