Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 1
Teil 7
Skript-SprachenPerl
Python
Tcl/Tk
Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 2
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 3
Geschichte
Zuerst: Steuerbefehle von Hand eingegeben (Operateur) oderam 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 4
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 5
(1) Eine MULTICS/UNIX-Errungenschaft: Universeller Dateityp Text
Alle Dateien sind Bytefolgen, als Text interpretierbar
also keine Systemunterstützung für index-sequentielle Organisation
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
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 6
(1) Dateibearbeitung (ed)
Kommandosyntax: [address[,address]]command [parameter] Semantik: Wende das Kommando auf die adressierten Zeilen (inklusive) an
1,$s/r/R/ # substitutiere R für erstes r auf jeder Zeile1,$s/r/R/g # substituiere R für alle r/abc/p # suche vorwärts nach Zeile mit ''abc'' und drucke?abc?p # das gleiche rückwärts5d # lösche Zeile 5 (mit Umnumerieren).,+3d # lösche aktuelle Zeile bis dritte nachfolgende Zeile .j # 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 7
(1) Reguläre Ausdrücke
In Suchmustern bedeuten
. beliebiges Zeichen
^ Zeilenanfang
$ Zeilenende
\c Sonderzeichen, z.B. \$: das Dollarzeichen
[... ] Menge alternativer Zeichenz.B. [124], [1-9],[A-Z0-9], [^0-9]: alle Zeichen außer 0-9
* beliebig häufiges Vorkommen des vorangehenden Zeichens
\{m,n\} vorangehendes Zeichen mindestens m, maximal n-mal
\(...\)Klammerung einer Teilfolge - 2-te Teilfolge ist anschließend \2
Posix: weitere Zusätze
Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 8
(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 SichtZeilen-Zerteiler mit C-ähnliche Ausgabemöglichkeiten Beispiel:
datei:Neumann Rainer Uni-KarlsruheLöwe Welf Uni-Karlsruhe
awk -F\t´{print $2}´ datei
RainerWelf
Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 9
(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 10
(1) und (2) Beispiel: Umlautersetzung
Aufgabe: Umwandlung ae → ä, AE → Ä, Ae → Ä, sz → ß, usw.
Aufruf (Skript):
sed -n -f umpr $1 >/tmp/$$umlmv /tmp/$$uml $1
sed-Skript umpr
s/ae/Ä/g s/\([ae]\)ü/\1ue/g s/Öttinger/Oettinger/g s/aßin/aszin/gs/oe/ö/g s/\([AE]\)Ü/\1UE/g s/trü$/true/g s/\([aA]\)uß/\1uszu/gs/ue/ü/g s/tüll/tuell/g s/trü /true /g s/uß\(auo\)/usz\1/gs/Ae/Ä/g s/TÜLL/TUELL/g s/\([aAeEqQ]\)ü/\1ue/g s/\([b-df-hj-np-tv-z]\)ß/\1sz/gs/Oe/Ö/g s/\([zZ]\)ürst/\1uerst/g s/ikröle/ikroele/g s/gß/gsz/gs/Ue/Ü/g s/\([nN]\)öther/\1oether/g s/ongrün/ongruen/g s/außu/aus\{\}zu/gs/AE/Ä/g s/Thü/Thue/g s/ogün/oguen/g s/\([Kk]\)öffiz/\1oeffiz/gs/OE/Ö/g s/Göthe/Goethe/g s/logü/logue/g s/lß/ls"-z/gs/UE/Ü/g s/GÖTHE/GOETHE/g s/glü /glue /g s/ußei/us"-zei/gs/sz/ß/g s/\([Ss]\)öben/\1oeben/g s/sgü/sgue/g p
s/onflün/onfluen/g
Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 11
(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 12
(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 13
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 14
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 15
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 16
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 17
Standardmodule und -bibliotheken
Modul FunktionenFile Basename, ChckTree, Copy, Find, PathTerm Cap, CompleteText Abbrev, ParseWords, TabsMath BigFloat, BigInt, ComplexTie Hash, StdHash, SubstrHash, Socket, Net, Time, I18N, POSIX
Prof. Dr. Gerhard Goos Höhere Programmiersprachen WS 2001/2 18
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 19
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 20
(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 21
(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 22
(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 23
(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 24
(a) X11Erzeugen 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 25
(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 26
(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 27
(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 28
(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 29
(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 30
(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 31
(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 32
(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 33
(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 34
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 35
Perl, Tcl/Tk und Python am gleichen Beispiel: Tcl/Tk
Tcl/Tkwm title . "Auswahl"wm minsize . 100 100frame .buttons -borderwidth 15pack .buttons -side top -fill xbutton .buttons.quit -text Schließen -command exitbutton .buttons.input -text Eingabe -command Printpack .buttons.quit .buttons.input -side rightframe .f; pack .f -side toplabel .f.l -text "Eingabe einer Zahl (1,2 oder 3)"entry .f.digit -width 5 -relief sunkenpack .f.l .f.digit -side lefttext .output -width 50 -height 20 -bd 5 -relief raisedpack .output -side topproc 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 36
Perl, Tcl/Tk und Python am gleichen Beispiel: Python
Pythonmap = { 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 37
(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 38
(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 39
(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 40
Zusammenfassung zu Skript-Sprachen
Zielsetzung:
Steuerung und Kopplung
Prototypenentwicklung
Konfiguration
Konzepte:
Schwache Typisierung
Typisierung durch kontextabhängige Interpretation
Bibliotheken im Mittelpunkt