%include "std.mgp" %%default 1 bimage "gtk/gtk-window.jpg" 1024x768, center %page %charset "iso8859-1" %bimage "bg.png" 1280x1024 %center GOOFED %center Generic Object Oriented Flexible Extensible Daemon Perl embedden... einmal anders! %page Welches Problem will ich lösen? %pause Ersetzen eines bestehenden Servers %pause Langzeitstabilität %pause Effizienz & Skalierbarkeit %pause Algorithmen sollten einfach und klar ausdrückbar sein %pause Vor- u. Nachteile von Perl: %pause Perl besitzt viele nützliche Module %pause Perl hat viele Abhängigkeiten (externe Dateien...) %pause Perl wird nicht häufig embeddet => wenig Beispiele %pause Perl stabil? Ja, aber nicht automatisch... %page Eckpunke der Implementation %pause Einzelnes Binary %pause keine externen Dateien %pause auch nicht zur Laufzeit, wie PAR %pause Kein komplexes Build-System %pause Feste Perl-Version: Upgrade == Kopfschmerzen %pause Perl-Sourcen integriert %pause Ausgewählte Module %pause Net::LDAP - "buggy as hell" %pause Coro - bekannte Memory-Leaks %page Microperl %pause µperl, bzw. uperl ist Teil der Perl-Distribution %pause README.micro, Makefile.micro, uconfig.sh %pause sehr spartanisch: C89 + ein bisschen POSIX %pause Tuning %pause %font "t5" <= -DPERL_CORE -DPERL_MICRO -DSTANDARD_C -DPERL_USE_SAFE_PUTENV => -DPERL_CORE=1 -DPERL_MICRO=1 %pause vi uconfig.sh %page Ergebnis %pause libuperl.a %pause microperl %pause Config.pm %page Bibliotheksdateien %pause %font "t5" UPERL = uperl/microperl -Ilib-perl src/libfiles.c: s/gen_libfiles extensions $(UPERL) s/gen_libfiles >$@ %font "s" %pause gen_libfiles erzeugt src/libfiles.c: %pause %font "t3" const char *embed_files[] = { /* 0 */ "\025Attribute/Handlers.pm\000\000\030Apackage Attribute::Handlers;\01... " "data eq 'ARRAY';\012\011\011\011\\$data = [ \\$data ] unless \\$wa... ... , }; const int embed_file_num = 208; %page Module mit XS-Dateien %pause ExtUtils::MakeMaker bietet Support für in-Tree-Builds %pause %font "t5" $TOP/uperl/microperl -I$TOP/lib-perl Makefile.PL INSTALLDIRS=perl PERL_CORE=1 PERL_SRC=$TOP/uperl PERL_LIB=$TOP/lib-perl %font "s" %pause Statische Module %pause %font "t5" make CC=$(CC) OPTIMIZE=$(OPTIMIZE) LINKTYPE=static CCCDLFLAGS= static %page Linken %pause %font "t4" goofed: src/main.o src/xsinit.o src/libfiles.o ... $(CC) $(CFLAGS) -o $@ src/xsinit.o `find lib-perl/auto -name '*.a' -print` src/main.o src/libfiles.o uperl/libuperl.a $(LIBS) %font "s" %pause xsinit.c enthält boot_Modulname Aufrufe, die die bootstrap-Funktionen registrieren: %pause %font "t4" newXS ("daemon::bootstrap", boot_daemon, file); newXS ("re::bootstrap", boot_re, file); newXS ("POSIX::bootstrap", boot_POSIX, file); \# usw.. %page "Bootstrapping" %pause %font "t4" char *embed_argv[EMBED_ARGC] = { "goofed", "-e", .... }; %pause daemon->bootstrap (0); PerlIO::scalar->bootstrap (0); %pause @INC = sub { open my $fh, '<', \(daemon::libfile ($_[1])) or die "FATAL: loader can't in-memory stream\n"; $fh; }; %pause require daemon; daemon->init; %page Daemon-Design %pause => Siehe Tagungsband