Skript-Sprachen
Transcription
Skript-Sprachen
Teil 7 Skript-Sprachen Perl Python Tcl/Tk Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 1 Aufgaben Historisch: (1) Textdateiverarbeitung (2) Steuerung und Kopplung von Programmen Zusätzlich heute: (a) Benutzerschnittstellenentwicklung (b) Prototypentwicklung (c) Softwarekonfiguration Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 2 Geschichte Zuerst: Steuerbefehle von Hand eingegeben (Operateur) oder am Beginn eines Programms (Kartenstapel) Job Description Language (JCL auf OS 360/MVS) ab 1963 Verkettung von Programmläufen (Chain-Jobs) gesteuert durch Ergebniswert Vorrangsteuerung ,,System``-Variable (z.B. Cobol Dateinamen) zur Steuerung des EA-Verhaltens Flexibilisierung Wartbarkeit interaktive Benutzeroberfläche von Teilnehmersystemen (Multics, MTSS, TSOS, BS 2000) seit 1966/7 Bourne-Shell auf UNIX (1971ff.): interaktiv, Programme abspeicherbar als „Skripten“ Skripten für Texteditoren wie ed, sed, awk, ... Skripten für graphische Werkzeuge wie Tk Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 3 Prinzipien von Skript-Sprachen Einfache Programmiersprache Ziel: Dateibearbeitung Operation = Programm aus Effizienzgründen auch eingebaute Operationen Operand = Datei, Zahl, Text Variable: Behälter für beliebige Texte häufig nur flache Gültigkeitsbereiche, keine Schachtelung Ablaufsteuerung: sequentielle Ausführung asynchrone Ausführung (fork) mit/ohne Endemeldung Koroutinen (UNIX-pipe) Unterprogramm = Programm in eigener Datei parametrisiert mit Texten $1, $2, ... von der Kommandozeile Prinzip der Standard-Eingabe/Ausgabe/Fehlerausgabe umlenkbar auf beliebige Dateien (Multics, UNIX) Ausführung interpretativ (neuerdings auch übersetzt, vorübersetzt) Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 4 (1) Eine MULTICS/UNIX-Errungenschaft: Universeller Dateityp Text Alle Dateien sind Bytefolgen, als Text interpretierbar jedoch Zugriff auf Puffer (rohe EA) und byteweise Adressierung unterstützt bearbeitbar mit Texteditor + kein spezielles Werkzeug abhängig vom Dateityp nötig - semantische Konsistenz der Bearbeitung nicht überprüft Ein/Ausgaben mit wenigen Ausnahmen als Text, nicht binär also keine Systemunterstützung für index-sequentielle Organisation plattformunabhängig, da ASCII/ISO-8859-*/Unicode-verschlüsselt die Microsoft-Errungenschaft: proprietäre Codierung des Zeilenwechsels Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 5 (1) Dateibearbeitung (ed) Kommandosyntax: [address[,address]]command [parameter] Semantik: Wende das Kommando auf die adressierten Zeilen (inklusive) an 1,$s/r/R/ 1,$s/r/R/g /abc/p ?abc?p 5d .,+3d .j # # # # # # # substitutiere R für erstes r auf jeder Zeile substituiere R für alle r suche vorwärts nach Zeile mit ''abc'' und drucke das gleiche rückwärts lösche Zeile 5 (mit Umnumerieren) lösche aktuelle Zeile bis dritte nachfolgende Zeile hänge nachfolgende Zeile hinten an aktuelle Zeile an Gebrauch des ed heute: einfachster, kleinster interaktiverTexteditor unter UNIX Für Skripten sed oder awk benutzen Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 6 (1) Reguläre Ausdrücke In Suchmustern bedeuten . beliebiges Zeichen ^ Zeilenanfang $ Zeilenende \c Sonderzeichen, z.B. \$: das Dollarzeichen [... ] Menge alternativer Zeichen z.B. [124], [1-9],[A-Z0-9], [^0-9]: alle Zeichen außer 0-9 * \{m,n\} vorangehendes Zeichen mindestens m, maximal n-mal \(...\)Klammerung beliebig häufiges Vorkommen des vorangehenden Zeichens einer Teilfolge - 2-te Teilfolge ist anschließend \2 Posix: weitere Zusätze Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 7 (1) awk Bislang: Bearbeitung von Text als Folge von Zeichen Zeilenorientierte Sicht: reguläre Ausdrücke auf Zeile einzeln angewendet Tabellarisch abgespeicherte Daten erfordern Spaltenbegriff awk ermöglicht diese Sicht Zeilen-Zerteiler mit C-ähnliche Ausgabemöglichkeiten Beispiel: datei: Neumann Rainer Löwe Welf Uni-Karlsruhe Uni-Karlsruhe awk -F\t´{print $2}´ datei Rainer Welf Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 8 (2) Filter und Ströme Spezielle Dateien: Standardeingabe, Standard- und Fehlerausgabe Kopplung von Programmen über Ströme von Puffern Abarbeitung der Programme mit Koroutinen Pufferung Dateibearbeitungswerkzeuge zur Bearbeitung der Ströme (eingeschränkt) einsetzbar Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 9 (1) und (2) Beispiel: Umlautersetzung Aufgabe: Umwandlung ae → ä, AE → Ä, Ae → Ä, sz → ß, usw. Aufruf (Skript): sed -n -f umpr $1 >/tmp/$$uml mv /tmp/$$uml $1 sed-Skript umpr s/ae/Ä/g s/oe/ö/g s/ue/ü/g s/Ae/Ä/g s/Oe/Ö/g s/Ue/Ü/g s/AE/Ä/g s/OE/Ö/g s/UE/Ü/g s/sz/ß/g s/\([ae]\)ü/\1ue/g s/\([AE]\)Ü/\1UE/g s/tüll/tuell/g s/TÜLL/TUELL/g s/\([zZ]\)ürst/\1uerst/g s/\([nN]\)öther/\1oether/g s/Thü/Thue/g s/Göthe/Goethe/g s/GÖTHE/GOETHE/g s/\([Ss]\)öben/\1oeben/g s/onflün/onfluen/g Prof. Dr. Gerhard Goos s/Öttinger/Oettinger/g s/trü$/true/g s/trü /true /g s/\([aAeEqQ]\)ü/\1ue/g s/ikröle/ikroele/g s/ongrün/ongruen/g s/ogün/oguen/g s/logü/logue/g s/glü /glue /g s/sgü/sgue/g Höhere Programmiersprachen WS 2001/2 s/aßin/aszin/g s/\([aA]\)uß/\1uszu/g s/uß\(auo\)/usz\1/g s/\([b-df-hj-np-tv-z]\)ß/\1sz/g s/gß/gsz/g s/außu/aus\{\}zu/g s/\([Kk]\)öffiz/\1oeffiz/g s/lß/ls"-z/g s/ußei/us"-zei/g p 10 (2) Shell-Programmierung Automatischer Ablauf von Programmfolgen Kopplung von Programmen (Bedingte Aufrufe, Ströme) Nebenläufigkeit Umgebungsvariablen Dynamische Befehlserzeugung (eval) Wiederverwendung? Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 11 (1) und (2) Perl - Practical Extraction and Report Language Ziele und Einsatzgebiete: Textfilter (wie sed, awk, ...) Berichterstellung Common Gateway Interface (CGI) Programme (www Server) Komplexe Automatisierungsaufgaben (Konfiguration von Programmen) Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 12 Entwurfsgedanken zu Perl Grundlegende Programmierereigenschaften: Faulheit und Ungeduld Demnach müssen Programme: kurz und schnell zu erstellen sein keine überflüssigen Anweisungen enthalten schnell zu testen sein einfache Aufgaben leicht machen, ohne komplexe Aufgaben unmöglich zu machen Problem: Lesbarkeit und damit Wartbarkeit von Programmen Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 13 RSA Verschlüsselung #!/bin/perl -sp0777i<X+d*lMLa^*lM%0]dsXx++lMlN/dsM0<j] dsj$/=unpack(‘H*‘,$_);S_=`echo 16dio\U$k“SK $/SM$n\EsN0p[1N*11K[d2%Sa2/d0$^Ixp“|dc`; s/\W//g;$_=pack(‘H*‘,/((..)*)$/) Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 14 Typen (Skalare) Werte - beginnend mit $ Reihungszugriffe - beginnend mit @ Assoziative Reihungen - beginnend mit % Beispiele: $a ist „{x->1, y->2}“ @a[2] ist „a->1“ %a = {x->1, y->2} Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 15 Operationen Operationen werden in einem Kontext ausgeführt Kontext: Skalarer Kontext (z.B. boolescher Kontext, Void-Kontext) Listenkontext Interpolativer Kontext Objektkontext Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 16 Standardmodule und -bibliotheken Modul File Term Text Math Tie Funktionen Basename, ChckTree, Copy, Find, Path Cap, Complete Abbrev, ParseWords, Tabs BigFloat, BigInt, Complex Hash, StdHash, SubstrHash, Socket, Net, Time, I18N, POSIX Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 17 Beliebte Fehler Operatoren können sich im Listenkontext anders verhalten als in skalarem Kontext Zuweisungen Vergleiche Namen können für Funktionen oder Literale stehen (kontextabhängig) Seiteneffekte von Operatoren, Funktionen Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 18 Erfahrungen Jedes Skript fängt einmal klein an (Kleine) Skripten sind selbsterklärend Jedes Skript wird größer ... und noch größer Ein großes Skript führt zur Unkündbarkeit des Autors Skripten dürfen nur disziplinierte Profis schreiben Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 19 (1) und (2) Python Python angelehnt an Modula-3 wesentlich besser lesbar, daher wesentlich besser wartbare Programme sonst vergleichbare Leistung wie Perl: Module, Objektorientierung, umfangreiche Bibliotheken für Einführungen vgl. z.B. die Unterlagen in der Linux-Dokumentation Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 20 (a) und (b) Benutzerschnittstellen und Prototypen Problem: Erstellung von grafischen Benutzerschnittstellen mit X11 kompliziert Prototypen bestehen zu großen Teilen aus Benutzerschnittstellen (ohne echte Funktionalität) Ziel: Einfache Erstellung von X11 Anwendungen Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 21 (a) X11-Hauptprogramm Widget MyXApplicationShell; Widget *MyXApplicationShellWidgets = (Widget *) NULL; main(unsigned int argc, char * argv[]) MyXApplicationShell = XtInitialize(argv[0],argv[0],NULL,0,&argc,argv); MyXApplicationShellWidgets = MyXApplicationShellLayout(MyXApplicationShell); XtRealizeWidget(MyXApplicationShell); XtMainLoop(); Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 22 (a) X11-Argumentvektoren n = 0; XtSetArg(args[n],XmNleftAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNrightAttachment,XmATTACH_FORM); n++; XtSetArg(args[n],XmNtopWidget,fdEditField); n++; XtSetArg(args[n],XmNtopAttachment,XmATTACH_WIDGET); n++; XtSetArg(args[n],XmNtopOffset,5); n++; separator = XmCreateSeparator(fdEntryEditor,sepName,args,n); XtManageChild(separator); Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 23 (a) X11 Erzeugen von Dialogfenstern n = 0; XtSetArg(args[n],XmNdialogStyle,XmDIALOG_FULL_APPLICATION_MODAL);n++; XtSetArg(args[n],XmNdialogTitle,XmStringLtoRCreate ('Edit entry ...', XmSTRING_DEFAULT_CHARSET));n++; XtSetArg(args[n],XmNnoResize,TRUE);n++; XtSetArg(args[n],XmNresizePolicy,XmRESIZE_NONE);n++; XtSetArg(args[n],XmNautoUnmanage,FALSE);n++; fdEntryEditor = XmCreateFormDialog(MyXApplicationShell,fdEntryEditorRes,args,n); Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 24 (a) Tk - Tool Kit für X-Windows Tk was [also] born out of frustration (J. K. Ousterhout) Grundidee: Vereinfachung wiederkehrender X11-spezifischer Aufgaben label .l -text Label button .b -text Button checkbutton .c -text Checkbutton radiobutton .r -text Radiobutton pack .l .b .c .r update Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 25 (a) GUI-Programmierung Rückrufe(Callbacks) Ziel: Reaktion auf Benutzeraktionen Mögliche Implementierungen: Ereignisse (mit Warteschlangen, etc.) Prozedurvariable Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 26 (a) Rückrufe (Callbacks) in Tk Skripte anstelle von Prozedurvariablen Spezielle Text-Muster für Ereignis-Daten Beispiel: button .b -text Test; pack .b bind .b <Destroy> { puts stdout {Window %W destroyed} } bind .b <1> { puts stdout {Mouse pressed at %x,%y} } Berechnung von Variablen, Ausdrücken? Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 27 (b) Prototyp-Entwicklung Starte mit einem reinen Interpretierer Implementiere Funktionalität auf Basis der Skript-Sprache Stabile bzw. (in Tk) ineffiziente Funktionen in C, argc-argv-Schnittstelle für Interpretierer Wiederhole letzteres bis zur Konvergenz Entferne Interpretiererkern und argc-argv-Schnittstellen Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 28 (b) Tcl / Tk Tcl (Tool Command Language) Skriptsprache mit Operationen für Zeichenketten und Listen Prozedurkonzept Zugriff auf Ausführungsstapel und Interpretierer (Meta-Informationen) Idee: Relevante C-Fkt interaktiv verwendbar machen (argc-argv-Schnittstelle) Vorteile: Interaktive Verwendbarkeit Einfaches Testen Möglichkeit zum Ausprobieren Nachteile: Verlust von Typinformationen Variableninterpretation (Typanpassung) Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 29 (b) und (c) Tcl-Interpretierermodell Kern besteht aus Funktionen zur Variablenverwaltung zur Zeichenketteninterpretation für die Aufrufkontextverwaltung zur Erzeugung von argc-argv-Aufrufen an unbekannte Funktionen zum An-/Abmelden zusätzlicher Funktionen Möglichkeit zur Integration von Interpretierer in Anwendungen ... zur Beschreibung der Benutzerschnittstelle ... zur dynamischen Konfiguration der Anwendung Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 30 (a) und (b) Beispiel Sather-Tcl Sather bietet statische Typsicherheit effiziente Programme kaum Bibliotheken, insbesondere keine GUI-Bibliotheken Implementierung der Programmlogik in Sather Implementierung der GUI-Teile in Tcl/Tk Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 31 (c) Tcl und Systemkonfiguration Problem: Starres, übersetztes System Leicht variierende Kundenwünsche Entwickler: Konfiguration nicht zu verwalten Lösung: Exportiere Objekte/Funktionen in eine Interpretierer-Schnittstelle. Verwende den Interpretierer bzw. die Skript-Sprache als Konfigurationssprache Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 32 (a), (b) und (c) Beispiele Erweiterung einer Anwendung um interaktive (oder skriptbasierte) Steuerung Beispiel: TclOBST Integration eines Tcl-Interpreters in einen OBST-Datenbankbrowser Anwendungen: OBST-DB-Shell USE, die OBST Schema-Evolutionsumgebung Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 33 Perl, Tcl/Tk und Python am gleichen Beispiel: Perl Perl %map = ('1','Maier','2','Müller','3','Schmidt'); print "Eingabe einer Zahl (1, 2 oder 3):"; chop($x = <STDIN>); if (1 <= $x && $x <=3){ print "Name für $x ist $map{$x}\n" } else { print "Falsche Eingabe\n" } Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 34 Perl, Tcl/Tk und Python am gleichen Beispiel: Tcl/Tk Tcl/Tk wm title . "Auswahl" wm minsize . 100 100 frame .buttons -borderwidth 15 pack .buttons -side top -fill x button .buttons.quit -text Schließen -command exit button .buttons.input -text Eingabe -command Print pack .buttons.quit .buttons.input -side right frame .f; pack .f -side top label .f.l -text "Eingabe einer Zahl (1,2 oder 3)" entry .f.digit -width 5 -relief sunken pack .f.l .f.digit -side left text .output -width 50 -height 20 -bd 5 -relief raised pack .output -side top proc Print {} { set list {Maier Müller Schmidt} set c [.f.digit get] if {$c >= 1 && $c <= 3} { .output insert end [lindex $list [expr $c-1]] .output insert end "\n" } else { .output insert end "falsche Eingabe\n" } } Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 35 Perl, Tcl/Tk und Python am gleichen Beispiel: Python Python map = { 1:"Maier", 2:"Müller", 3:"Schmidt"} print("Eingabe einer Zahl (1, 2 oder 3):"), x = input() if map.has_key(x) : print(map[x]) else: print("Falsche Eingabe") Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 36 (c) Anwendungen und Konfigurationssprachen R/3 -- ABAP/4 Microsoft Office - Visual Basic for Applications (VBA) StarOffice - StarBasic oder Java(Script) Rational Rose - Rose Basic Grundidee: Programmierbare Standardanwendungen Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 37 (c) VBA Objektorientierter Basic-Dialekt Entstanden aus Access-, Excel-, Word-Basic Anwendung ist Bibliothek lauffähiger Objekte (z.B. Document, Application, Database, Worksheet, etc.) Ereignisorientiert Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 38 (c) Power Point Macro Sub Beispiel() ActiveWindow.Selection.TextRange. ParagraphFormat.Bullet.Visible=msoFalse With ActiveWindow.Selection.ShapeRange .Fill.Visible = msoTrue .Fill.Solid .Fill.ForeColor.RGB = RGB(255, 255, 153) .Line.Visible = msoTrue .Line.ForeColor.SchemeColor = ppForeground .Line.BackColor.RGB = RGB(255, 255, 255) .TextFrame.TextRange.Font.Name = "Courier New" .TextFrame.TextRange.Font.Size = 24 End With End Sub Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 39 Zusammenfassung zu Skript-Sprachen Zielsetzung: Steuerung und Kopplung Prototypenentwicklung Konfiguration Konzepte: Schwache Typisierung Typisierung durch kontextabhängige Interpretation Bibliotheken im Mittelpunkt Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 40