ich hab jetzt relativ viel zeit investiert, um das rendering in webtek, von string-processing und vielen regular expressions, auf in perl-code uebersetzte templates umzubauen, ... mit maessig erfolg, denn leider ist perl's string-processing viel zu schnell um dort einen wirklichen vorteil rauszuholen.
einen aehnlichen ansatz hatte schon adrian im jahre 2001, als er fuer uboot eine templating engine in C programmiert hat, ... mit genauso wenig erfolg.
ein beispiel:
man wuerde ja denken, dass gerade die standard unix commandos schnell sind, aber...
imac:DrMap max$ time find . -not -path '*.svn*' -name '*.tpl' | wc -l
198
real 0m0.233s
user 0m0.153s
sys 0m0.078s
braucht deutlich laenger als
imac:DrMap max$ time perl -e \
'foreach (`find .`) { next if /.svn/; next unless /.tpl\n$/; print }' \
| wc -l
198
real 0m0.112s
user 0m0.036s
sys 0m0.083s
also dass hat mich dann schon stutzig gemacht (ich hab beide kommandos mehrere male ausgefuehrt, damit auch ja alle sys-calls im betriebssystem-cache sind).
nochmal zum eigentlichen thema. hurra jetzt ist es so, dass webtek um 5 - 10% schnellere responsezeiten hat (hab mir min. 30% erwartet). aber das programmieren hat wiedermal viel spass gemacht. der compiler ist ein einfacher rekursiver parser mit folgender syntax:
Terminale:
==========
CHAR -> .
EQUAL -> =
DOT -> \.
PIPE -> \|
ESCAPE -> \\
QUOTE_START -> " | ' | q\{ | q\[ | q\(
QUOTE_END -> " | ' | \} | \] | \)
SPACE -> \s+
NAME -> \w+
MACRO_START -> <%
MACRO_END -> %>
NonTerminale:
=============
Template -> ( Macro | CHAR )*
Macro -> MACRO_START
SPACE
NAME ( DOT NAME )*
( Param )*
( PIPE SPACE NAME ( Param )* )*
SPACE
MACRO_END
Param -> NAME EQUAL QUOTE_START Template QUOTE_END
und wiedermal, was ich an perl so mag, mit sehr wenig code-zeilen:
- scanner: 24 zielen
- parser: 70 zielen
- aus dem syntax-tree perl code erzeugen: 100 zeilen
wers genauer wissen will, hier der Compiler und hier der alte Renderer.
einen kleinen trost gibt es. es sollte jetzt doch leicht moeglich sein weitere macro-funktionalitaet zu implementieren (wie z.b. ein loop macro)
so denn...
1 Kommentar(e):
Neuen Kommentar schreiben: