Simon Georg Pinkel, Betreuer: Guido Tack & Thorsten Brunklaus
Alice Server Pages
Funktionale Programmierung und das
Web
2
Gliederung1. Anforderungen2. Entwurf
1. Architektur2. Syntax3. Cookies
3. Beispiel4. Implementierung
1. Compileserver2. Word Sequences
5. verwandte Projekte6. Zusammenfassung7. Fazit8. Ausblick9. Demo
3
Anforderungen
• Compiler zur Bearbeitung/Interpretation von HTML-seiten mit eingebetteten Programmfragmenten
• Handhabung von dynamischem Input wie Formularvariablen oder Cookies
• Datenbankschnittstelle• Niedrige Reaktionszeiten
4
Architektur
DatenbankCompiler index.asp
Http Server
5
Architektur : ML Server Pages
DatenbankMsp-Compiler
index.msp
Http Server
Cache
index.cgi
CGI
6
Architektur : Alice Server Pages
DatenbankCompileserver (Alice)
index.amsp
Http Server
Interfaceclient (C)Cache
index.stc
CGI
7
Syntax• Alice lässt sich folgendermassen einbetten:
• <?AMSP [alice-programm] ?>• <?AMSP= [alice-ausdruck beliebigen typs] ?>• <?AMSP$ [wordsequence] ?>
8
Syntax• Alice lässt sich folgendermassen einbetten:
• <?AMSP [alice-programm] ?>• <?AMSP= [alice-ausdruck beliebigen typs] ?>• <?AMSP$ [wordsequence] ?>
• Um auf Formularvariablen/Cookies zuzugreifen, muss ein Skript einen speziellen Typ „formvar“ bzw. „cookies“ nach dieser Grammatik deklarieren:
start ::= recordTy
ty ::=
|
|
|
primTy option | primTy eoption
recordTy | ty * ... * ty
( ty )
ty list | ty vector (*)
recordTy ::= { tyrow }
tyrow ::= lab : ty [, tyrow]
primTy ::= int | real | char | string | bool | file
(*) nicht erlaubt bei cookies
9
Cookies
Lokal(beim Browser) gespeicherte Datenpakete verteilter Zustand der Server Page
Programmierer muss Typ „cookies“ definieren Wert „cookies:cookies“ enthält eingehende Cookiedaten
können über folgende Funktionen gesendet/gelöscht werden:val setCookies : cookies -> unitval deleteCookie : string -> unit
10
Beispiel
<?AMSP type formvar = { n : int option } ?>
../index.amsp?n=6
<html><head>...</head><body><ul>
</ul></body></html>
<?AMSP val _ = List.app (fn x=> print("<li>" ^ Int.toString x) List.tabulate(#n formvar,fak) ?>
11
Beispiel
<?AMSP type formvar = { n : int option } ?>
../index.amsp?n=6
<html><head>...</head><body><ul>
</ul></body></html>
<?AMSP val _ = List.app (fn x=> print("<li>" ^ Int.toString x) List.tabulate(#n formvar,fak) ?>
type formvar = { n : int option }
val _ = print („
")val _ = List.app ...val _ = print („
")
../amspcache/<md5>.aml
</ul></body></html>
val formvar = ...
<html><head>...</head><body><ul>
12
Beispiel
<html><head>...</head><body><ul><li>1 <li>1 <li>2 <li>6 <li>24 <li>120 </ul></body></html>
HTML-output
<?AMSP type formvar = { n : int option } ?>
../index.amsp?n=6
<html><head>...</head><body><ul>
</ul></body></html>
<?AMSP val _ = List.app (fn x=> print("<li>" ^ Int.toString x) List.tabulate(#n formvar,fak) ?>
type formvar = { n : int option }
val _ = print („
")val _ = List.app ...val _ = print („
")
../amspcache/<md5>.aml
</ul></body></html>
val formvar = ...
<html><head>...</head><body><ul>
13
Implementierung:CompileserverAnfrage auf index.amsp:
1. mit .amsp assoziiertes CGI-Programm(Interfaceclient) wird aufgerufen
Compileserver (Alice)
Interfaceclient (C)Cache
<md5sum>.stc
index.amsp
CGI
14
Implementierung:CompileserverAnfrage auf index.amsp:
1. mit .amsp assoziiertes CGI-Programm(Interfaceclient) wird aufgerufen
2. Interfaceclient sammelt Daten und sendet sie an Compileserver
Compileserver (Alice)
Interfaceclient (C)Cache
<md5sum>.stc
index.amsp
CGI
Socket - Kommunikation
15
Implementierung:CompileserverAnfrage auf index.amsp:
1. mit .amsp assoziiertes CGI-Programm(Interfaceclient) wird aufgerufen
2. Interfaceclient sammelt Daten und sendet sie an Compileserver
3. Compileserver checkt, ob Cache Eintrag (MD5-summe vom lokalen Pfad der Source) vorhanden bzw. up-to-date und kompiliert gegebenenfalls
Compileserver (Alice)
Interfaceclient (C)Cache
<md5sum>.stc
index.amsp
CGI
Socket - Kommunikation
16
Implementierung:CompileserverAnfrage auf index.amsp:
1. mit .amsp assoziiertes CGI-Programm(Interfaceclient) wird aufgerufen
2. Interfaceclient sammelt Daten und sendet sie an Compileserver
3. Compileserver checkt, ob Cache Eintrag (MD5-summe vom lokalen Pfad der Source) vorhanden bzw. up-to-date und kompiliert gegebenenfalls
4. Compileserver ruft über ComponentManager.Eval das Kompilat auf
Compileserver (Alice)
Interfaceclient (C)Cache
<md5sum>.stc
index.amsp
CGI
Socket - KommunikationStruktur mit Zustand
17
Implementierung:CompileserverAnfrage auf index.amsp:
1. mit .amsp assoziiertes CGI-Programm(Interfaceclient) wird aufgerufen
2. Interfaceclient sammelt Daten und sendet sie an Compileserver
3. Compileserver checkt, ob Cache Eintrag (MD5-summe vom lokalen Pfad der Source) vorhanden bzw. up-to-date und kompiliert gegebenenfalls
4. Compileserver ruft über ComponentManager.Eval das Kompilat auf
5. gesammeltes HTML/Cookiedaten werden an Interfaceclient geschickt
Compileserver (Alice)
Interfaceclient (C)Cache
<md5sum>.stc
index.amsp
CGI
Socket - KommunikationStruktur mit Zustand
18
Implementierung:CompileserverAnfrage auf index.amsp:
1. mit .amsp assoziiertes CGI-Programm(Interfaceclient) wird aufgerufen
2. Interfaceclient sammelt Daten und sendet sie an Compileserver
3. Compileserver checkt, ob Cache Eintrag (MD5-summe vom lokalen Pfad der Source) vorhanden bzw. up-to-date und kompiliert gegebenenfalls
4. Compileserver ruft über ComponentManager.Eval das Kompilat auf
5. gesammeltes HTML/Cookiedaten werden an Interfaceclient geschickt
6. Interfaceclient sendet Daten an http Server
Compileserver (Alice)
Interfaceclient (C)Cache
<md5sum>.stc
index.amsp
CGI
Socket - KommunikationStruktur mit Zustand
19
Implementierung:Word Sequences• Von den ML Server Pages übernommen:
datatype wseq =$ of string
| && of wseq * wseq | ...
20
Implementierung:Word Sequences
• Von den ML Server Pages übernommen:datatype wseq =
$ of string | && of wseq * wseq | ...
Einsparung von string-Konkatenationen:• Konkatenation ist Baumkonstruktion• Projektion des Baums ist der dargestellte string• Bei Versendung wird der Baum traversiert und die
Blätter sequenziell versendet
21
verwandte Projekte
Alice Server Pages ML Server Pages
+ High-level Interface zum Zugriff auf Formulardaten/Cookies mit statischer Typprüfung
- low-level Interface
- Cookies müssen im Header deklariert werden
- Effizienz erkauft durch Tricks(Compileserver, Caching)
+ auch ohne Tricks schnell
+ Architektur portabel bezüglich Http Server-Interface
- nur CGI
22
verwandte Projekte
Alice Server Pages PHP
+ High-level Interface zum Zugriff auf Formulardaten/Cookies mit statischer Typprüfung
+ dynamische Daten werden in PHP-Datenstrukturen konvertiert - setzt Kenntnis von HTTP voraus
- Effizienz erkauft durch Tricks(Compileserver, Caching)
+ auch ohne Tricks schnell
- nur MySQL-API+ reiche Bibliothek mit vielen Datenbank-APIs
+ Typsystem mit statischer Typprüfung
- keine Typen
23
Zusammenfassung Compileserver kompiliert Skripte Formulardaten/Cookies werden geparst und in Alice-record
konvertiert Niedrige Reaktionszeiten dank:
• Compile Server• Umgehung der Startup-zeiten von Alice• Von Skripten importierte Komponenten werden im Arbeitsspeicher
gecacht• Kann unabhängig vom Http Server betrieben werden
• Caching MySQL-API
Aufwand: z4500 Zeilen Kern + z2000 Zeilen Beispielanwendung & Demos
24
Fazit
Alice bietet einige Features, die sich zur Erstellung von Server Pages nutzen lassen:
Statische Typprüfung für Formulardaten/Cookies frühe Fehlerlokalisierung
Höherstufige Funktionen bei der Erzeugung der Formulardaten/Cookies
First-class compiler zur Skriptkompilierung Component Manager zur Ausführung von Skripten
und Caching importierter Komponenten
25
Ausblick
Compile Server noch nicht nebenläufig Anzeige von Kompilierungsfehlern im
Browser High-level Bibliothek für Sitzungs-
management Mehr Datenbank-schnittstellen (ODBC?)