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
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
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
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
3. Kriterien und Ergebnisse Schnelle Softwareentwicklung professioneller Entwickler Interessen Schüler, Ausbilder GUI Entwurf Rapid Prototyping Generatoren Bibliotheken Dokumentation Wiederverwendung? Portabilität Teamarbeit Lesbarkeit Fehlertoleranz?? Grundlagen Erlernbarkeit Algorithmen Leichte Syntax Orthogonalität? Gemeinsamkeiten? Konflikte? Diplomarbeit, Universität Dortmund, Ingo Linkweiler, 5
3.2 Umfrage zur Lesbarkeit von Programmier Sprachen Diplomarbeit, Universität Dortmund, Ingo Linkweiler, 7
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
4.2 Kriterium: Einfach zum Ziel Java vs. Python Java class HelloWorld { public static void main(string[] args) { System.out.println("Hallo Welt."); } } Static? Public? Args? Void? Python print Hallo Welt. Diplomarbeit, Universität Dortmund, Ingo Linkweiler, 9
Pascal program Test; var i: integer; i:=0; begin while i<10 do ;? begin i:=i+1; writeln(i); end; writeln( fertig. ); end. 4.3 Pascal vs. Python Python i=0 while i<10: i=i+1 print i print Fertig. Keine Deklaration u. Zeilentrenner, Blockbildung durch Einrücken Diplomarbeit, Universität Dortmund, Ingo Linkweiler, 10
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 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() Ausführung von Funktionen / Quelltext zur Laufzeit Diplomarbeit, Universität Dortmund, Ingo Linkweiler, 11
# Funktional def auswerten(funktion,x): print eval(funktion) 4.4.1 Paradigmen 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
Prolog 4.4.2 Prädikative Entwicklung Python+Holmes weg(rein,28). weg(28,37).... weg(43,61). weg(41,raus). rule f01 if true then weg rein nach 28. rule f02 if true then weg 28 nach 37.... rule f19 if true then weg 43 nach 61. rule f20 if true then weg 41 nach raus. weg(a,b): weg(b,a),!. 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. enthaelt([element _],Element). enthaelt([_ Tail],Element): enthaelt(tail,element). rule r1 if weg?a nach?b, weg?b nach?c then tour?a nach?c. rule r2 if weg?a nach?b, tour?b nach?c then tour?a nach?c.? tour rein nach raus. Diplomarbeit, Universität Dortmund, Ingo Linkweiler, 13
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
import smtplib 4.6 Beispiel: E Mail versenden. def eingabe(prompt): return raw_input(prompt).strip() smtphost = eingabe("adresse des Mailservers: ") fromaddr = eingabe("von...: ") toaddrs = eingabe("an...: ") subject = eingabe("betreff...: ") msgtext = 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
4.7 Kriterium Lernsoftware Diplomarbeit, Universität Dortmund, Ingo Linkweiler, 16
4.7.2 Funktionsplotter mit Von Stiften und Mäusen from sum import * # 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) for y in range( 20,20): stift.zeichnelinie(318,y*10+200, 322,y*10+200) # Funktion einlesen 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() Diplomarbeit, Universität Dortmund, Ingo Linkweiler, 17
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
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
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, i.linkweiler@gmx.de Software im Internet: www.ingo linkweiler.de/diplom Diplomarbeit, Universität Dortmund, Ingo Linkweiler, 20
Beispiele...[PyNassi.py] u.a. Diplomarbeit, Universität Dortmund, Ingo Linkweiler, 21
Inhalt: 1. Einleitung, Hypothese 2. Kriterien und Ergebnisse 3. Python 4. Fallstudien 5. Fazit Diplomarbeit, Universität Dortmund, Ingo Linkweiler, 22