[Patch] Scripte laden ohne Ballast

CHDK-Skripte, CHDK-Entwicklung, PC-Zusatzprogramme, Informationen für Tüftler

Scripte laden ohne Ballast

Beitragvon rudi » 28.06.2010, 11:44

Hallo,

ich stelle hier eine Möglichkeit vor Scripte beim Laden von Ballast zu befreien.
    Die Vorteile:
    1. geringerer Speicherbedarf des Scriptes im RAM
    2. es wird nur das verkleinerte Skript geladen
    3. schnelleres laden der @-Parameter
    4. die "letzte Leerzeile" ist für uBasic-Scripte nicht mehr erforderlich
    5. Scripte können ausreichend kommentiert werden
    6. wahrscheinlich schneller Programmausführung in uBasic bzw. schnellerer Programmstart bei Lua
    Die Nachteile:
    1. Auf Grund der fehlenden CHDK-Funktion zur Verkleinerung eines benötigten Speicherbereichs (realloc), muss das Script die Routine zum Verkleinern 2 mal durchlaufen (1. Bestimmen des erforderlichen Speicherplatzes; 2. verkleinertes Script laden -> daher Vorteil 2).
    TEST: Den max. Zeitbedarf kann man mit der Datei "/SCRIPTS/TEST/libtst.lua" gut testen. Diese ist sehr groß und gut kommentiert.

    2. LUA-Kommentarblöcke müssen definitionsgerecht geschrieben sein (z.B. "--]]" sieht schön aus, entspricht aber nicht dem Syntax!)

    CHDK-Dateien mit Syntaxfehler "--]]"
    SCRIPTS/Kurven/ISOBoost.lua
    SCRIPTS/TEST/setmode.lua
    SCRIPTS/TEST/setrec.lua
    SCRIPTS/TEST/tstcallf.lua
    Das Verfahren:
    - entfernen der Leerzeichen am Zeilenanfang und -ende
    - entfernen von Leerzeilen
    - entfernen von REM oder "--" Zeilen
    - optimieren des 1. LUA-Kommentarblocks - es verbleiben die Kommentarblockzeichen ("--[[", "]]") und alle @-Zeilen
    - entfernen aller weiteren LUA-Kommentarblöcke
    - entfernen von LUA-Kommentaren am Zeilenende, wenn dort kein " oder ' im Kommentar enthalten ist
    - entfernen aller "carriage return"
    - jede Zeile wird mit "newline" abgeschlossen (wichtig für uBasic - letzte Zeile)
    Das Ergebnis:
    Eine durchschnittliche Speicherersparnis 10% bis 20%.
    Beispiel: Die Datei "/SCRIPTS/TEST/libtst.lua". Dabei werden aus 11.360Byte dann 9.440Byte - eine Einsparung von 17%.

Die Patches:
Ich habe wegen des "--]]"-Problems drei Versionen vorbereitet.

1. Die technisch korrekte Version: einfach und schnell, aber intolerant bei falschem Syntax (Fehler lädt "default script").
2. Die Version von 1. mit "--]]"-Toleranz ("scriptstrip_Ex").
3. Die Version für Sicherheitsfanatiker. Basiert ebenfalls auf Version von 1., verwendet aber im Fehlerfall die bisherige Laderoutine und kennzeichnet das im Programmtitel mit einem "!" als erstes Zeichen ("scriptstrip_fallback").

Zur Kontrolle des verkleinerten Scripts ist eine Debug-Mode integriert.
    Vor dem Auswählen des Scriptes im Script-Menü folgendes einstellen:
    - Parameter-Satz-Nr: 9
    - Parameterspeicher: aus.
    Das verkleinerte Script wird unter "/LOGS/STRIP.TXT" gespeichert und kann z.B. mit dem Textbetrachter geöffnet werden.
[EDIT 28.06.2010, 18:50]
Nach Prüfung der Syntaxregeln für Kommentarende ist auch "--]]" zulässig.
Es steht nur noch der Patch nach der 1. Version zur Verfügung.
(siehe Beitrag vom 28.06.2010, 18:44)
[/EDIT]


Gruß rudi
Dateianhänge
trunk350_scriptsc_01.5_patch.zip
script_strip_compile-Patch [14.07.10]
Basis: trunk 350
Testprogramm für Win-CMD
(69.94 KiB) 430-mal heruntergeladen
Zuletzt geändert von rudi am 14.07.2010, 18:59, insgesamt 6-mal geändert.
Benutzeravatar
rudi
CHDK-Spezialist
CHDK-Spezialist
 
Beiträge: 510
Registriert: 11.09.2009, 11:27
Kamera(s): A590IS_101B, SX260_100B

Beitragvon msl » 28.06.2010, 12:13

Hallo rudi,

das ist mal wieder eine geniale Idee. Damit können Skripte je nach Bedarf ausreichend kommentiert werden, ohne dass das CHDK-Speichermanagement unnötig belastet wird.Bild

Ich bin jetzt aber etwas in Sachen Lua-Kommentarblock irritiert. Sollte der nicht immer so aussehen:
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
--[[...

...]]
Erstellt in 0.004 Sekunden, mit GeSHi 1.0.8.9


Die Variante
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
--[[...

...--]]
Erstellt in 0.006 Sekunden, mit GeSHi 1.0.8.9
habe ich nie benutzt. Kann es sein, dass du dich auf diese Wiki-Seite beziehst. Ich denke, hier liegt ein Tipp-Fehler vor. Oder irre ich mich da und es wurde so für CHDK definiert?

Gruß msl
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4567
Bilder: 271
Registriert: 22.02.2008, 11:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Beitragvon fe50 » 28.06.2010, 13:32

Hallo zusammen,

ja, in der Tat, --]] am Ende ist wohl falsch.
Ich hatte damals beim Erstellen der Lua-Wikiseite einfach den Header von Jucifer's Demo-Script kopiert, seither hat da keiner mehr genauer hingeschaut, das wurde wohl einfach so übernommen ;)

Laut Lua Syntax ist ja -- die Einleitung des Kommentars, mehrzeilige Kommentare werden mit [[ ... ]] eingeschlossen - die zwei überflüssigen Minuszeichen müssen also vom Parser als Bestandteil des Strings und somit als Teil des Kommentars gewertet werden, sind also schlichtweg überflüssig.
◄"The grass was greener, The light was brighter"►  ◄fe50 home►  ◄TRAIL-Magazin►  ◄RTFM !►
Benutzeravatar
fe50
CHDK-Legende
CHDK-Legende
 
Beiträge: 1106
Registriert: 25.04.2008, 14:28
Wohnort: B'Württemberg
Kamera(s): Ixus50 101b, Ixus860 100c, SX10 101a

Beitragvon rudi » 28.06.2010, 17:44

Hallo,

ich habe mich nach unserem Handbuch gerichtet, da steht "]]" allein auf der Zeile.

msl hat geschrieben:
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
--[[...
...]]
Erstellt in 0.003 Sekunden, mit GeSHi 1.0.8.9

Na wenn das so gültig ist, dann kann ein "." ja auch ein "-" sein.

Danke ihr Beiden. Manchmal sieht man den Wald vor Bäumen nicht!

Hier der neue Lösungsweg:
"]]" wird einfach von rechts geprüft und schon ist es egal, was davor steht. Das ist dann alles weg.

Also keine @-Zeile mit "]]" abschließen. Das habe ich aber noch nirgends gesehen.

Der neue Patch nach der 1. Version ist im ersten Beitrag und die Diskussion um "--]]" damit erledigt.

Gruß rudi
Benutzeravatar
rudi
CHDK-Spezialist
CHDK-Spezialist
 
Beiträge: 510
Registriert: 11.09.2009, 11:27
Kamera(s): A590IS_101B, SX260_100B

Beitragvon msl » 28.06.2010, 18:19

alles klar, rudi!

Ich hatte mich da auch falsch ausgedrückt. Richtig sollte die Syntax für den Skriptkopf so lauten:
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
--[[

@title blabla

@param a blabla

@default a 1

]]
Erstellt in 0.007 Sekunden, mit GeSHi 1.0.8.9


Aber das ist jetzt geklärt. Widmen wir uns dem Test

Gruß msl
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4567
Bilder: 271
Registriert: 22.02.2008, 11:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Beitragvon CHDKLover » 29.06.2010, 09:49

Hallo rudi,
sehr schönes Projekt!
Ich hab mir den Stipper (dein Zusatzmodul) mal genauer angesehen. Alle von mir getesteten Skripts hat er problemlos minimalisiert, aber wenn man den Code kennt kann man gezielt Skripte erzeugen die LUA versteht, aber bei der Minimalisierung Fehler produzieren.

Ein Beispiel:
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
--[==[t]==]
--[=[
@param b test

Kommentare
Kommentare
Kommentare
...
[[
test
]]

--]=]

print("1") --test

--[[test]]

print("2")

--[===[test2]===]

print("3")

--[===[
test2
]===]

print("4")

sleep(1000)
Erstellt in 0.004 Sekunden, mit GeSHi 1.0.8.9

Kommentare werden in LUA nur mit einem "--" eingeleitet. Mit den Konstrukten aus den eckigen Klammern kann man Textblöcke gruppieren. Somit Kommentiert man mit --[[...]] einen gruppierten Textblock aus.
Jetzt gibt es aber auch noch eine Verschärfung des ganzen. Denn man kann auch Textblöcke ineinander schachteln. Um die Anfangs und Endmarken eindeutig identifizieren zu können gibt es noch Textblocklevels. Das Level wird durch die Anzahl der "=" zwischen den eckigen Klammern angegeben. "[=[" enspricht der Textblockstartmarke in Level 1.
LUA filtert die Kommentare in der "lib/lua/llex.c", vielleicht kann man auch gleich mit den Funktionen arbeiten.

Quellen:
doxygen
http://www.lua.org/manual/5.1/manual.html#2
Literal strings can also be defined using a long format enclosed by long brackets. We define an opening long bracket of level n as an opening square bracket followed by n equal signs followed by another opening square bracket. So, an opening long bracket of level 0 is written as [[, an opening long bracket of level 1 is written as [=[, and so on. A closing long bracket is defined similarly; for instance, a closing long bracket of level 4 is written as ]====]. A long string starts with an opening long bracket of any level and ends at the first closing long bracket of the same level. Literals in this bracketed form can run for several lines, do not interpret any escape sequences, and ignore long brackets of any other level. They can contain anything except a closing bracket of the proper level.
...
A comment starts with a double hyphen (--) anywhere outside a string. If the text immediately after -- is not an opening long bracket, the comment is a short comment, which runs until the end of the line. Otherwise, it is a long comment, which runs until the corresponding closing long bracket. Long comments are frequently used to disable code temporarily.


http://lua-users.org/wiki/RetiredLuaFaq

CHDKLover
Zuletzt geändert von CHDKLover am 01.07.2010, 20:48, insgesamt 1-mal geändert.
A610 100e CHDK-DE: aktuelle Version
Benutzeravatar
CHDKLover
Super-Mod
Super-Mod
 
Beiträge: 878
Bilder: 8
Registriert: 12.09.2007, 18:25
Wohnort: Dresden
Kamera(s): a610 100e

Beitragvon rudi » 29.06.2010, 12:21

Hallo CHDKLover,

danke für deine Hinweise.

Vorab eine nicht ganz ernst gemeinete Bemerkung.
Warum nennt sich das "Multi-line comment", wenn es dann so daherkommen kann?
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
--[[test]]
Erstellt in 0.002 Sekunden, mit GeSHi 1.0.8.9

... und in der "LuaShortRef5.1.pdf" findet sich diese Variante:
Code: Alles auswählen
Comments
--             Comment to end of line.
--[[ ... --]]  Multi-line comment.

Das ist aber nicht so tragisch, wenn jetzt meine Schlussfolgerungen stimmen.

Ablauf für Kommentarblöcke:
Code: Alles auswählen
1. Anfang bei "--["

2. "=" zählen und in X merken (0 .. ?)

3. "[" erforderlich

4. alles Ãœbergehen

5. Ende, wenn "]" + (X mal "=") + "]"  gefunden



Ach so:
CHDKLover hat geschrieben:TODO:
Hilfreich wäre ein Befehl "get_focal_length36()" Äquivalenzbrennweite im analogen 36mm-Format, damit die User

Die gibt es doch für die aktuelle Brennweite
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
dofinfo().eff_focal_length
Erstellt in 0.002 Sekunden, mit GeSHi 1.0.8.9


Gruß rudi
Benutzeravatar
rudi
CHDK-Spezialist
CHDK-Spezialist
 
Beiträge: 510
Registriert: 11.09.2009, 11:27
Kamera(s): A590IS_101B, SX260_100B

Beitragvon CHDKLover » 29.06.2010, 13:50

Hallo rudi,
rudi hat geschrieben:Ach so:
CHDKLover hat geschrieben:TODO:
Hilfreich wäre ein Befehl "get_focal_length36()" Äquivalenzbrennweite im analogen 36mm-Format, damit die User

Die gibt es doch für die aktuelle Brennweite
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
dofinfo().eff_focal_length
Erstellt in 0.002 Sekunden, mit GeSHi 1.0.8.9


:D Der Kommentar stammte aus einem alten Testskript, ich habe ihn einfach mit kopiert.

Nun zum Thema:
Deine Schussfolgerungen scheinen mir logisch. Nur muss man beachten dass das Blockende auch in der gleichen Zeile stehen darf. Ist wie in c:
Syntax: [ Download ] [ Verstecken ]
Benutze C Syntax Highlighting
/* <Kommentar> */
Erstellt in 0.001 Sekunden, mit GeSHi 1.0.8.9

Vielleicht könnte man auch den Stripper und den @-Parameter Parser kombinieren, somit bräuchte man keine extra Unterscheidung ob das der erste Kommentar-Block ist oder nicht und es könnten einfach alle Kommentare raus.
Vielleicht will ja auch einer schreiben:
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
--[[Skript für a610]]

--[[

@-Parameter

@-Parameter

]]
Erstellt in 0.002 Sekunden, mit GeSHi 1.0.8.9


CHDKLover
A610 100e CHDK-DE: aktuelle Version
Benutzeravatar
CHDKLover
Super-Mod
Super-Mod
 
Beiträge: 878
Bilder: 8
Registriert: 12.09.2007, 18:25
Wohnort: Dresden
Kamera(s): a610 100e

Beitragvon rudi » 30.06.2010, 18:05

Hallo!
CHDKLover hat geschrieben:Vielleicht könnte man auch den Stripper und den @-Parameter Parser kombinieren, somit bräuchte man keine extra Unterscheidung ob das der erste Kommentar-Block ist oder nicht und es könnten einfach alle Kommentare raus.
Das ist eine gute Idee, aber nicht so leicht umzusetzen.
Ursache dafür ist, dass das Default-Script nicht aus einer Datei kommt und damit den von mir angepassten Programmteil auch nicht durchläuft.

Als Lösungsweg wird jetzt ein Puffer für das Script und ein weiterer, nur beim Laden benötigter, für die @-Parameter verwendet.

Das Ergebnis:
Da die Script-Datei für die Parameterübergabe nicht noch einmal geöffnet werden muss, hat sich die Ladedauer etwas verringert.

Beispiel: Die Datei "/SCRIPTS/TEST/libtst.lua". Dabei werden aus 11.360Byte dann 9.199Byte - eine Einsparung von 19%.

Der Patch ist im ersten Beitrag.

Gruß rudi
Benutzeravatar
rudi
CHDK-Spezialist
CHDK-Spezialist
 
Beiträge: 510
Registriert: 11.09.2009, 11:27
Kamera(s): A590IS_101B, SX260_100B

Beitragvon CHDKLover » 30.06.2010, 18:45

Klasse rudi,
das ging ja mal wieder super schnell!

Ich hab es gerade noch kurz getestet und das ist der Oberhammer. Mein gemeines Testskript wird zur Perfektion minimalisiert.

Danke rudi!

CHDKLover
A610 100e CHDK-DE: aktuelle Version
Benutzeravatar
CHDKLover
Super-Mod
Super-Mod
 
Beiträge: 878
Bilder: 8
Registriert: 12.09.2007, 18:25
Wohnort: Dresden
Kamera(s): a610 100e

Beitragvon msl » 01.07.2010, 16:35

Hallo,

ich habe nun auch endlich mal einen Test durchgeführt.

Dafür habe ich mir TagMe herausgesucht, weil dieses Skript sehr umfangreich kommentiert ist und als Zugabe ein "require" beinhaltet.

Das Skript wurde erfolgreich verkleinert (16k -> 7k). In der Debug-Datei fehlt aber der Script-Header - siehe Anhang.

Ich konnte ansonsten keine Einschränkungen feststellen. Die Parameter lassen sich einstellen. Das Skript und CHDK arbeiten normal.

Klasse Arbeit.

Gruß msl
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4567
Bilder: 271
Registriert: 22.02.2008, 11:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Beitragvon rudi » 01.07.2010, 17:16

Hallo msl,

msl hat geschrieben:In der Debug-Datei fehlt aber der Script-Header - siehe Anhang.

Richtig. Die Parameter werden extra unter "LOGS/PARAM.TXT" abspeichert. Für die Ausführung des Scriptes sind sie ja nicht erforderlich und daher dort entbehrlich. Das spart noch einmal einige Bytes.

Gruß rudi
Benutzeravatar
rudi
CHDK-Spezialist
CHDK-Spezialist
 
Beiträge: 510
Registriert: 11.09.2009, 11:27
Kamera(s): A590IS_101B, SX260_100B

Beitragvon msl » 01.07.2010, 18:03

Hallo rudi,

das dachte ich mir schon. Nun habe auch ich es verstanden und kann es dann auch dokumentieren. :D

Danke für die schnelle Antwort.

Spricht eigentlich noch etwas dagegen, den Patch im Trunk einzubauen? Ich gehe mal davon aus, dass hier kaum noch jemand testen wird.

Gruß msl
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4567
Bilder: 271
Registriert: 22.02.2008, 11:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Beitragvon rudi » 01.07.2010, 20:04

Hallo,

damit man nicht immer die Kamera bemühen muss, habe ich hier noch mein Testprogramm für die Windows-Kommandozeile.

Verwendung:
sstrip <Dateiname>

Ergebnis:
Anzeige der Einsparung
Speicherung von STRIP.TXT und PARAM.TXT

Gruß rudi
Dateianhänge
sstrip4_cmd.zip
script_stripper für WinCMD
(9.02 KiB) 427-mal heruntergeladen
Zuletzt geändert von rudi am 02.07.2010, 08:12, insgesamt 1-mal geändert.
Benutzeravatar
rudi
CHDK-Spezialist
CHDK-Spezialist
 
Beiträge: 510
Registriert: 11.09.2009, 11:27
Kamera(s): A590IS_101B, SX260_100B

Beitragvon CHDKLover » 01.07.2010, 20:27

Hallo
@rudi: Deine Projekte sind immer sehr transparent. Zumal du auch ein komfortable Testumgebung mitlieferst. Klasse! Interessant wäre in solchen Fällen auch dein Quellcode, um eventuell selber noch ein wenig zu basteln.

Was meint ihr, sollten wir die Debugschnittstelle wirklich standardmäßig mit rein kompilieren. Ich würde eine bedingte Kompilierung für diesen Teil vorschlagen.

CHDKLover
A610 100e CHDK-DE: aktuelle Version
Benutzeravatar
CHDKLover
Super-Mod
Super-Mod
 
Beiträge: 878
Bilder: 8
Registriert: 12.09.2007, 18:25
Wohnort: Dresden
Kamera(s): a610 100e

Nächste

Zurück zu Code-Ecke

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 20 Gäste

cron