Die Skriptsprache Python im Kontext des Softwareentwicklungsprozesses Ergebnisse der Untersuchung zur Eignung einer Programmiersprache für die schnelle Softwareentwicklung kann der Informatikunterricht davon profitieren? Zur Diplomarbeit: „Eignet sich die Skriptsprache Python für schnelle Entwicklungen im Softwareentwicklungsprozess?“ Ingo Linkweiler, 10.+11. Okt. 2002 Diplomarbeit, Universität Dortmund, Ingo Linkweiler, -1- Die Skriptsprache Python im Kontext des Softwareentwicklungsprozesses 1.1 Ansatz (Thema der Diplomarbeit): Untersuchung der Programmiersprache Python für die schnelle Softwareentwicklung: • Rapid Prototyping • Extreme Programming • Pair Programming Verfahren werden alltäglich eingesetzt. Praxisgenutzte Werkzeuge: Skriptsprachen wie Perl, Python und Tcl Diplomarbeit, Universität Dortmund, Ingo Linkweiler, -2- Die Skriptsprache Python im Kontext des Softwareentwicklungsprozesses 1.2 Kann der Informatikunterricht davon profitieren? Parallelen bei den Anforderungen an die konkrete Programmiersprache? Hypothese: • Anforderungen an eine Programmiersprache zur schnellen Softwareentwicklung ~= informatischen Bildung: Es ist möglich, beiden Anforderungen gerecht zu werden. Eignung der Programmiersprache Python ? Diplomarbeit, Universität Dortmund, Ingo Linkweiler, -3- Die Skriptsprache Python im Kontext des Softwareentwicklungsprozesses 2. Vorgehensweise Ziel: Beurteilung von Programmiersprachen. Anfragen / Diskussion zu Anforderungen an Programmiersprachen mit Informatikern Lehrern Kriterienkatalog(e) zur Beurteilung einer Programmiersprache Python: Auswertung, Sprachvergleiche, Fallstudien Diplomarbeit, Universität Dortmund, Ingo Linkweiler, -4- Die Skriptsprache Python im Kontext des Softwareentwicklungsprozesses 3. Kriterien und Ergebnisse Schnelle Softwareentwicklung Interessen professioneller Entwickler GUI-Entwurf Rapid Prototyping Generatoren Bibliotheken Dokumentation Wiederverwendung … Portabilität Teamarbeit Lesbarkeit Fehlertoleranz … ? Schüler, Ausbilder Grundlagen Erlernbarkeit Algorithmen Leichte Syntax Orthogonalität … Gemeinsamkeiten? Konflikte? Diplomarbeit, Universität Dortmund, Ingo Linkweiler, -5- Die Skriptsprache Python im Kontext des Softwareentwicklungsprozesses 3.2 Umfrage zur Lesbarkeit von Programmier-Sprachen Diplomarbeit, Universität Dortmund, Ingo Linkweiler, -7- Die Skriptsprache Python im Kontext des Softwareentwicklungsprozesses 4.1 Python-Syntax: Kriterium integrierte Datentypen >>> >>> >>> >>> zahl = 3.141 tupel = (7, 42) text = 'Hallo.' print text*2 Hallo. Hallo. >>> komplex = complex(5,-2) >>> hash = {1: 'abc', 2: 'def' >>> liste = [0,1,2,3,4,5] } >>> print liste[2:5] [2,3,4] >>> print liste[:3] [0,1,2] for i in liste: tuwas(i) Diplomarbeit, Universität Dortmund, Ingo Linkweiler, -8- Die Skriptsprache Python im Kontext des Softwareentwicklungsprozesses 4.2 Kriterium: Einfach zum Ziel - Java vs. Python Static? Public? Args? Void? Java class HelloWorld { public static void main(String[] args) { System.out.println("Hallo Welt."); } } Python print 'Hallo Welt.' Diplomarbeit, Universität Dortmund, Ingo Linkweiler, -9- Die Skriptsprache Python im Kontext des Softwareentwicklungsprozesses 4.3 Pascal vs. Python Pascal Python program Test; var i: integer; i:=0; begin while i<10 do ; begin i:=i+1; writeln(i); end; writeln('fertig.'); ? Keine Deklaration u. Zeilentrenner, Blockbildung durch Einrücken i=0 while i<10: i=i+1 print i print 'Fertig.' end. Diplomarbeit, Universität Dortmund, Ingo Linkweiler, -10- Die Skriptsprache Python im Kontext des Softwareentwicklungsprozesses 4.4 Paradigmen: Beispiel Wertetabelle # Imperativ / Prozedural von = -5 bis = 5 funktion = "x*x-10" for x in range(von,bis): print eval(funktion) # Objekt-Orientiert Ausführung von Funktionen / Quelltext zur Laufzeit class Funktion: def __init__(self, term): self.term=term def setze_Wertebereich(self,von,bis): self.von=von self.bis=bis def ausgeben(self,x): print eval(self.term) def tabelle(self): for i in range(self.von,self.bis-self.von): self.ausgeben(i) f=Funktion("x*x-10") f.setze_Wertebereich(-5,5) f.tabelle() Diplomarbeit, Universität Dortmund, Ingo Linkweiler, -11- Die Skriptsprache Python im Kontext des Softwareentwicklungsprozesses 4.4.1 Paradigmen # Funktional def auswerten(funktion,x): print eval(funktion) def tabelle(funktion,von,bis): map(auswerten, [funktion]*(bis-von), range(von,bis)) tabelle("x*x",-5,5) Prädikative Programmierung (vgl. Prolog): • möglich (Holmes, Pylog) • wenig dokumentiert • nicht in Syntax integriert Diplomarbeit, Universität Dortmund, Ingo Linkweiler, -12- Die Skriptsprache Python im Kontext des Softwareentwicklungsprozesses 4.4.2 Prädikative Entwicklung Prolog Python+Holmes weg(rein,28). weg(28,37). .... weg(43,61). weg(41,raus). rule rule .... rule rule weg(A,B):-weg(B,A),!. rule r1 if weg ?a nach ?b, weg ?b nach ?c then tour ?a nach ?c. gehe(Raus,Raus,Weg). gehe(Woher,Raus,AlterWeg):-weg(Woher,A), nicht_drin(AlterWeg,A), gehe(A,Raus,[A|AlterWeg]). nicht_drin(Liste,A):-enthaelt(Liste,A), write(['gehe zurueck nach',A]),nl, !,fail. nicht_drin(Liste,A):-write(['gehe nach',A]),nl. f01 if true then weg rein nach 28. f02 if true then weg 28 nach 37. f19 if true then weg 43 nach 61. f20 if true then weg 41 nach raus. rule r2 if weg ?a nach ?b, tour ?b nach ?c then tour ?a nach ?c. ?- tour rein nach raus . enthaelt([Element|_],Element). enthaelt([_|Tail],Element):-enthaelt(Tail,Element). Diplomarbeit, Universität Dortmund, Ingo Linkweiler, -13- Die Skriptsprache Python im Kontext des Softwareentwicklungsprozesses 4.5 Kriterium: Schnelle Entwicklung = Baukastenprinzip aus der Prototypentwicklung & Spielwarenabteilung. Idee: Kombination fertiger Bausteine / Komponenten zu etwas Neuem. Beispiel: Lesen einer Webseite per HTTP: import urllib datei = urllib.urlopen("http://www.uni-dortmund.de") text = datei.read() datei.close() Diplomarbeit, Universität Dortmund, Ingo Linkweiler, -14- Die Skriptsprache Python im Kontext des Softwareentwicklungsprozesses 4.6 Beispiel: E-Mail versenden. import smtplib def eingabe(prompt): return raw_input(prompt).strip() smtphost fromaddr toaddrs subject msgtext = = = = = eingabe("Adresse des Mailservers: ") eingabe("Von........: ") eingabe("An.........: ") eingabe("Betreff....: ") eingabe("Nachricht..: ") # Erzeuge den Mail-Header msg = ("From: %s\r\n To: %s\r\n Subject: %s\r\n\r\n" % (fromaddr, toaddrs, subject) ) # Nachricht anhängen msg = msg + msgtext server = smtplib.SMTP(smtphost) server.sendmail(fromaddr, toaddrs, msg) server.quit() Diplomarbeit, Universität Dortmund, Ingo Linkweiler, -15- Die Skriptsprache Python im Kontext des Softwareentwicklungsprozesses 4.7 Kriterium Lernsoftware Diplomarbeit, Universität Dortmund, Ingo Linkweiler, -16- Die Skriptsprache Python im Kontext des Softwareentwicklungsprozesses 4.7.2 Funktionsplotter mit „Von Stiften und Mäusen“ from sum import * # Funktion einlesen # Objekte erzeugen bild = Bildschirm() stift = Stift(bild) # Mit Stift ein Diagramm zeichnen stift.bewegeBis(10,10) stift.schreibe("Funktionsplotter") stift.zeichneLinie(0,200, 639,200) stift.zeichneLinie(320,0, 320,399) for x in range(-20,20): stift.zeichneLinie( x*10+320,198, x*10+320,202) print "Funktion eingeben:" funktion = raw_input("f(x)=") # Funktion zeichnen for x in range(-20, 20): y = eval(funktion) print "f(" , x, ")=" ,y stift.bewegeBis( x*10+320,200-y*10) stift.runter() bild.GibFrei() for y in range(-20,20): stift.zeichneLinie(318,y*10+200, 322,y*10+200) Diplomarbeit, Universität Dortmund, Ingo Linkweiler, -17- Die Skriptsprache Python im Kontext des Softwareentwicklungsprozesses 4.7.3 Stifte & Mäuse: Java ....... vs. ....... Python public class RechteckProgramm4 { //Deklarationsteil private Bildschirm bildschirm; private Stift stift; private Maus maus; public void fuehreAus() { bildschirm=new Bildschirm(); stift = new Stift(); maus = new Maus(); stift.hoch(); stift.bewegeBis(20,20); stift.zeichneRechteck(100,100); while (!maus.istGedrueckt()){;} maus.gibFrei(); maus=null; stift.gibFrei(); stift=null; bildschirm.gibFrei(); bildschirm=null } } bildschirm = Bildschirm() stift = Stift(bildschirm) maus = Maus(bildschirm) stift.hoch(); stift.bewegeBis(20,20) stift.zeichneRechteck(100,100) while not maus.IstGedrueckt(): pass maus.GibFrei() stift.GibFrei() bildschirm.GibFrei() Diplomarbeit, Universität Dortmund, Ingo Linkweiler, -18- Die Skriptsprache Python im Kontext des Softwareentwicklungsprozesses 5. Fazit Hypothesen durch Kriterien und an Beispielen überprüft. (heute nur sehr kleinen Teil gezeigt) • Anforderungen an eine Programmiersprache zur schnellen Softwareentwicklung ~= informatischen Bildung: Es ist möglich, beiden Anforderungen gerecht zu werden. • Python und verfügbare Werkzeuge eignen sich sowohl zur schnellen Softwareentwicklung als auch zum Einsatz in der informatischen Bildung. Diplomarbeit, Universität Dortmund, Ingo Linkweiler, -19- Die Skriptsprache Python im Kontext des Softwareentwicklungsprozesses 5.1 Diskussion: Kritik & offene Fragen • Integration aller Paradigmen fachdidaktisch vorteilhaft? • Lernziele? (Modellierung, Algorithmik, Anwendung) • Praxisrelevanz (C++/Java) vs. Verständnis (Python) • Wenig schulische Python-Erfahrungen in Deutschland (gute in NL) • Bedeutung integrierter grafischer Entwicklungsumgebungen? Ingo Linkweiler, [email protected] Software im Internet: www.ingo-linkweiler.de/diplom Diplomarbeit, Universität Dortmund, Ingo Linkweiler, -20- Die Skriptsprache Python im Kontext des Softwareentwicklungsprozesses Beispiele...[PyNassi.py] u.a. Diplomarbeit, Universität Dortmund, Ingo Linkweiler, -21- Die Skriptsprache Python im Kontext des Softwareentwicklungsprozesses Inhalt: 1. Einleitung, Hypothese 2. Kriterien und Ergebnisse 3. Python 4. Fallstudien 5. Fazit Diplomarbeit, Universität Dortmund, Ingo Linkweiler, -22-