Alice Server Pages
250 likes | 371 Vues
Alice Server Pages. Funktionale Programmierung und das Web. Gliederung. Anforderungen Entwurf Architektur Syntax Cookies Beispiel Implementierung Compileserver Word Sequences verwandte Projekte Zusammenfassung Fazit Ausblick Demo. Anforderungen.
Alice Server Pages
E N D
Presentation Transcript
Alice Server Pages Funktionale Programmierung und das Web Simon Georg Pinkel, Betreuer: Guido Tack & Thorsten Brunklaus
Gliederung • Anforderungen • Entwurf • Architektur • Syntax • Cookies • Beispiel • Implementierung • Compileserver • Word Sequences • verwandte Projekte • Zusammenfassung • Fazit • Ausblick • Demo
Anforderungen • Compiler zur Bearbeitung/Interpretation von HTML-seiten mit eingebetteten Programmfragmenten • Handhabung von dynamischem Input wie Formularvariablen oder Cookies • Datenbankschnittstelle • Niedrige Reaktionszeiten
Http Server Compiler Datenbank index.asp Architektur
Http Server CGI Cache Msp-Compiler index.cgi Datenbank index.msp Architektur : ML Server Pages
Architektur : Alice Server Pages Http Server CGI Cache Interfaceclient (C) index.stc Datenbank Compileserver (Alice) index.amsp
Syntax • Alice lässt sich folgendermassen einbetten: • <?AMSP [alice-programm] ?> • <?AMSP= [alice-ausdruck beliebigen typs] ?> • <?AMSP$ [wordsequence] ?>
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:
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 -> unit val deleteCookie : string -> unit
../index.amsp?n=6 <?AMSP type formvar = { n : int option } ?> <html><head>...</head> <body> <ul> <?AMSP val _ = List.app (fn x=> print("<li>" ^ Int.toString x) List.tabulate(#n formvar,fak) ?> </ul></body></html> Beispiel
../index.amsp?n=6 ../amspcache/<md5>.aml <?AMSP type formvar = { n : int option } ?> type formvar = { n : int option } val _ = print („ ") val _ = List.app ... val _ = print („ ") val formvar = ... <html><head>...</head> <body> <ul> <html><head>...</head> <body> <ul> <?AMSP val _ = List.app (fn x=> print("<li>" ^ Int.toString x) List.tabulate(#n formvar,fak) ?> </ul> </body></html> </ul></body></html> Beispiel
../index.amsp?n=6 ../amspcache/<md5>.aml HTML-output <?AMSP type formvar = { n : int option } ?> type formvar = { n : int option } val _ = print („ ") val _ = List.app ... val _ = print („ ") <html><head>...</head> <body> <ul> <li>1 <li>1 <li>2 <li>6 <li>24 <li>120 </ul> </body></html> val formvar = ... <html><head>...</head> <body> <ul> <html><head>...</head> <body> <ul> <?AMSP val _ = List.app (fn x=> print("<li>" ^ Int.toString x) List.tabulate(#n formvar,fak) ?> </ul> </body></html> </ul></body></html> Beispiel
Implementierung:Compileserver Anfrage auf index.amsp: • mit .amsp assoziiertes CGI-Programm(Interfaceclient) wird aufgerufen CGI Cache Interfaceclient (C) <md5sum>.stc Compileserver (Alice) index.amsp
Implementierung:Compileserver Anfrage auf index.amsp: • mit .amsp assoziiertes CGI-Programm(Interfaceclient) wird aufgerufen • Interfaceclient sammelt Daten und sendet sie an Compileserver CGI Cache Interfaceclient (C) <md5sum>.stc Socket - Kommunikation Compileserver (Alice) index.amsp
Implementierung:Compileserver Anfrage auf index.amsp: • mit .amsp assoziiertes CGI-Programm(Interfaceclient) wird aufgerufen • Interfaceclient sammelt Daten und sendet sie an Compileserver • Compileserver checkt, ob Cache Eintrag (MD5-summe vom lokalen Pfad der Source) vorhanden bzw. up-to-date und kompiliert gegebenenfalls CGI Cache Interfaceclient (C) <md5sum>.stc Socket - Kommunikation Compileserver (Alice) index.amsp
Implementierung:Compileserver Anfrage auf index.amsp: • mit .amsp assoziiertes CGI-Programm(Interfaceclient) wird aufgerufen • Interfaceclient sammelt Daten und sendet sie an Compileserver • Compileserver checkt, ob Cache Eintrag (MD5-summe vom lokalen Pfad der Source) vorhanden bzw. up-to-date und kompiliert gegebenenfalls • Compileserver ruft über ComponentManager.Eval das Kompilat auf CGI Cache Interfaceclient (C) <md5sum>.stc Socket - Kommunikation Struktur mit Zustand Compileserver (Alice) index.amsp
Implementierung:Compileserver Anfrage auf index.amsp: • mit .amsp assoziiertes CGI-Programm(Interfaceclient) wird aufgerufen • Interfaceclient sammelt Daten und sendet sie an Compileserver • Compileserver checkt, ob Cache Eintrag (MD5-summe vom lokalen Pfad der Source) vorhanden bzw. up-to-date und kompiliert gegebenenfalls • Compileserver ruft über ComponentManager.Eval das Kompilat auf • gesammeltes HTML/Cookiedaten werden an Interfaceclient geschickt CGI Cache Interfaceclient (C) <md5sum>.stc Socket - Kommunikation Struktur mit Zustand Compileserver (Alice) index.amsp
Implementierung:Compileserver Anfrage auf index.amsp: • mit .amsp assoziiertes CGI-Programm(Interfaceclient) wird aufgerufen • Interfaceclient sammelt Daten und sendet sie an Compileserver • Compileserver checkt, ob Cache Eintrag (MD5-summe vom lokalen Pfad der Source) vorhanden bzw. up-to-date und kompiliert gegebenenfalls • Compileserver ruft über ComponentManager.Eval das Kompilat auf • gesammeltes HTML/Cookiedaten werden an Interfaceclient geschickt • Interfaceclient sendet Daten an http Server CGI Cache Interfaceclient (C) <md5sum>.stc Socket - Kommunikation Struktur mit Zustand Compileserver (Alice) index.amsp
Implementierung:Word Sequences • Von den ML Server Pages übernommen: datatype wseq = $ of string | && of wseq * wseq | ...
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
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
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
Ausblick • Compile Server noch nicht nebenläufig • Anzeige von Kompilierungsfehlern im Browser • High-level Bibliothek für Sitzungs-management • Mehr Datenbank-schnittstellen (ODBC?)