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