Diplomarbeit, 2007
97 Seiten, Note: 1,0
1 Einleitung
1.1 Motivation und Zielsetzung
1.2 Aufbau der Arbeit
1.3 Fundamentale Ideen als Unterrichtsprinzip
1.4 Programmiersprachen im Unterricht
1.5 Grundlagen Python
1.5.1 Geschichte und Entwicklung
1.5.2 High-Level-Sprache und Skriptsprache
1.6 Grundlagen Zope
1.6.1 Zope 2
1.6.2 Zope 3
2 Python lehren
2.1 Python als erste Programmiersprache?
2.2 Programmierparadigmen
2.2.1 Programmierparadigmen im Unterricht
2.2.2 Imperative Programmierung
2.2.3 Deklarative Programmierung
2.2.4 Weitere Paradigmen
2.3 Algorithmen
2.4 Python in Fachgegenständen
2.5 Open-Source und Community
2.6 Material, Werkzeuge und Frameworks für den Schuleinsatz
3 Softwareentwicklung im Unterricht mit Zope
3.1 Komponentenarchitektur
3.2 ZODB
3.3 Softwareentwicklungsprozess erleben
3.4 Testen und Dokumentieren von Software
3.5 Beispielimplementierung
3.6 Die Zukunft von Zope
3.7 Alternative Python Frameworks
4 Diskussion
4.1 Zusammenfassung und Bewertung
4.2 Kritik
4.3 Nächste Schritte
4.4 Ähnliche Arbeiten
A Quelltexte
Kurzfassung
Für Anfänger ist das Erlernen einer Programmiersprache schwierig. Das liegt daran, dass im heutigen Unterricht bevorzugt mit Sprachen aus der Industrie gelehrt wird. Studenten wollen in der Industrie Jobs bekommen, und legen deshalb Wert darauf, dass gefragte Technologien Bestandteil ihrer Ausbildung sind. Die Industrie wiederum will ihren Bedarf befriedigen. Dabei wird übersehen, dass Programmiersprachen keine Technologien selbst, sondern Werkzeuge für Technologien sind. Im Unterricht muss eine Programmiersprache ein Werkzeug sein, mit dessen Hilfe es möglich ist, die fundamentalen Ideen eines Unterrichtsgegenstandes zu vermitteln, ohne in einen Unterricht über die Programmiersprache selbst abzudriften.
Die vorliegende Arbeit stellt Python als ein solches Werkzeug vor. Sie zeigt auf, dass Python, im Gegensatz zu heute häufig im Unterricht zum Einsatz kommenden Sprachen (wie C, C++ oder Java), gut für Anfänger geeignet ist. Aufgrund des einfachen Zugangs können mit Python viel früher relevante Konzepte der Informatik und Softwareentwicklung diskutiert werden. Ein weiterer wesentlicher Vorteil ist, dass auch die Arbeit der Unterrichtenden erleichtert wird. Die Sprache ist kompakt und simpel gehalten und versucht sich dem Entwickler nicht in den Weg zu stellen. Gleichzeitig ist sie eine allgemein anerkannte Sprache und findet Verwendung in der Industrie.
Für fortgeschrittene Konzepte der Softwareentwicklung kann auf komplexere Sprachen umgestiegen werden, wobei die Studenten dabei von ihren Erfahrungen mit Python stark profitieren. Der Unterricht kann aber durchaus weiter auf Python aufbauen. So zeigt diese Arbeit, wie das Komponentenframework Zope hierbei Verwendung finden könnte. Dabei werden Themen wie Komponentenorientierung, Reuse, Datenbanken, das Erleben eines Softwareentwicklungsprozesses und Testen und Dokumentieren von Software erläutert. Auch Zope, das auf Python basiert, hat den Vorteil, dass im Vergleich zu anderen Applikationsframeworks ein einfacherer Zugang schnelle Lernerfolge ermöglicht.
Vorliegende Arbeit zeigt, wie mit Python der komplette Bedarf eines auszubildenden Softwareentwicklers abgedeckt wird. Durch die Schnelllebigkeit der Technik wird es immer wichtiger, die grundlegenden Konzepte einer Wissenschaft zu beherrschen, anstatt das Erlernen eines Werkzeugs, das in der Industrie aktuell ist.
Abstract
For beginners the learning of a programming language proves to be quite difficult. This is due to the fact that today’s educational system focuses primarily on languages related to industry. Students want to get jobs in the industry. Therefore they demand to be sufficiently trained in these technologies. The industry again wants to satisfy its need. But programming languages are not technologies by themselves, though, they are tools for technologies. However, programming languages for educational purposes must be such tools which help students gain fundamental understanding of a topic without the need for expert knowledge in a programming language itself.
This paper introduces Python as one example for such a tool. It points out that, unlike languages such C, C++ or Java widely used today, Python is highly suitable for beginners. Due to the easy access it is possible to teach relevant concepts of computer science and software de]velopment earlier in the learning process. A further substantial advantage is relief of the instructor´s. The language is compactly and simply held without hinderung the developer. Python is a generally a well respected language and finds use in the industry.
For advanced concepts of software development, teaching can be directed to more complex languages, whereby the students strongly profit from their experience with Python. If knowledge of other languages is not required, it is also possible to stay with Python, which performs well in this situation.
Thus this paper shows how the component-framework Zope could be of use in this field. The following topics, such as component orientation, reuse, databases, experiencing a software development process and testsand documenting of software are discussed. Also Zope, which is based on Python, has the advantage of easy access, thus creating the possibility of fast successes in learning. This paper shows how the complete need of a software developer is covered by teaching with Python.
Verwendete Abkürzungen
Abbildung in dieser Leseprobe nicht enthalten
Geht es um das Aneignen von Programmierkenntnissen, ist die momentane Situation nach Ansicht des Autors nicht optimal. Sie ist verbesserungswürdig. Gerade in der schnelllebigen Informatik sollte im Unterricht nicht auf Trends oder Modeerscheinungen zurückgegriffen werden, sondern die fundamentalen Ideen der Wissenschaft Informatik mit einem guten Konzept an die Studierenden herangetragen werden. Erste Programmierkenntnisse mit z.B. C oder Java zu vermitteln bzw. vermittelt zu bekommen, ist problematisch. Diese Arbeit hat zum Ziel, einen einfacheren Weg aufzeigen und soll begründen, warum erste Programmiererfahrungen mit Python didaktisch sinnvoller sind.
Die Programmiersprache Python soll als Programmiersprache für den Unterrichtseinsatz vorgestellt werden und es wird gezeigt, wie gewisse Grundkonzepte mittels dieses Werkzeugs vermittelt werden können. Weiterführend wird Z Object Publishing Environment (Zope) als Applikationsserver, basierend auf Python, für fortgeschrittenere Themen der Softwareentwicklung, und vor allem für den praktischen Teil dieser Arbeit verwendet.
Die Arbeit hat das Ziel, die Verbreitung von Python an Schulen und Universitäten zu unterstützen, um damit den Schülern1 und Studenten den Einstieg in die Programmierung und diese selbst zu erleichtern.
Weiters ist Zope für den Einsatz an Universitäten vorzustellen; der einfache Zugang zu einem Open-Source Produkt soll die Vorteile für Lektoren und Studenten bei fortgeschrittenen Themen der Softwareentwicklung aufzeigen.
Die vorliegende Arbeit soll dabei als Entscheidungsund Argumentationsgrundlage an genannten Ausbildungseinrichtungen dienen können.
Die Arbeit gliedert sich in Einleitung, zwei Hauptkapitel und abschließende Diskussion. Sie ist nicht klassisch in Theorieund Praxisteil gegliedert. Eine solche Aufteilung ist bei dieser Thematik schwer zu vollziehen, die vorgestellte Theorie wird immer wieder durch praktische Beispiele unterstützend erläutert. Im zweiten Kapitel ist eine Beispielimplementierung abgehandelt.
In der Einleitung werden die Argumentationsgrundlagen für die Arbeit aufgebaut. Die in der Arbeit verwendeten Technologien Python und Zope werden vorgestellt.
Nach Erklärung allgemeiner, in der Arbeit verwendeter Begrifflichkeiten und Technologien, folgt im ersten Kapitel die Abhandlung der Programmiersprache Python. Darin wird erläutert, warum sich Python als eine Einstiegsprogrammiersprache, und vor allem für Unterrichtszwecke besonders gut eignet. Danach werden Grundkonzepte des Informatikunterrichts, wie Paradigmen und Algorithmen mit Python als unterstützendes Werkzeug analysiert. Weiters wird behandelt, welche andere Fachgegenstände neben Informatik von Python profitieren können, wie das Thema Open- Source auf den Unterricht angewandt werden kann, und welche Materialien und Werkzeuge als Unterstützung für den Unterricht bzw. die Unterrichtsgestaltung zur Zeit zur Verfügung stehen.
Zope ist das Thema des zweiten Kapitels. Zope ist ein Applikationsframework basierend auf Python und eignet sich für das Lehren fortgeschrittener Softwareentwicklungsmethoden. Darin wird untersucht, ob Zope als Komponentensystem betrachtet werden kann, und wie das Framework mit Component Based Software Engineering (CBSE) in Verbindung gebracht werden kann. Dass das Testen und Dokumentieren von Software im Unterricht vernachlässigt wird, wird ebenso behandelt, wie das Lehren eines Softwareentwicklungsprozesses. Den Abschluß des Hauptteils bildet die Beispielimplementierung aus einem realen Projekt im Arbeitsumfeld des Autors.
Eine Argumentationsgrundlage dieser Arbeit ist die Definition einer fundamentalen Idee nach Schwill [Sch93]. In seiner Arbeit untersucht er die philosophische Sicht der Idee nach Plato und Kant, und formuliert diese mit den Strukturen nach J.S. Bruner [Bru60] zur fundamentalen Idee.
J.S. Bruner hat das didaktische Prinzip an den Strukturen der zugrundeliegenden Wissenschaft, an denen sich der Unterricht orientieren soll, formuliert.
“Eine fundamentale Idee (bezgl. einer Wissenschaft) ist ein Denk-, Handlungs-, Beschreibungsoder Erklärungsschema, das
1. in verschiedenen Bereichen (der Wissenschaft) vielfältig anwendbar oder erkennbar ist (Horizontalkriterium),
2. auf jedem intellektuellen Niveau aufgezeigt und vermittelt werden kann (Vertikalkriterium),
3. in der historischen Entwicklung (der Wissenschaft) deutlich wahrnehmbar ist und längerfristig relevant bleibt (Zeitkriterium),
4. einen Bezug zu Sprache und Denken des Alltags und der Lebenswelt besitzt (Sinnkriterium).“
Abbildung in dieser Leseprobe nicht enthalten
Abbildung 1: Horizontalkriterium nach [Sch93]
Das Horizontalkriterium veranschaulicht Schwill wie in Abbildung 1. Eine Idee wird soweit abstrahiert, dass fachspezifische Elemente herausfallen. Damit kann themenund fachübergreifend gearbeitet werden. Der Lernende erkennt durch immer wiederkehrende Prinzipien die übergreifende Relevanz der Thematik. Anschließend wird durch Wiederholung das Wichtige gefestigt. Die gemeinsame Idee kann jedoch wiederum nur durch umfassendes Spezialwissen herausgearbeitet werden. Das ist die Aufgabe der Lehrkräfte.
Das Vertikalkriterium kann wie ein Faden im Bildungsweg gesehen werden. Diesem Faden wird im Laufe der Ausbildung gefolgt. Dabei steigen das Niveau und die Detaillierung der Materie (Abbildung 2).
Abbildung in dieser Leseprobe nicht enthalten
Abbildung 2: Vertikalkriterium nach [Sch93]
Das Zeitkriterium ist in der Informatik nicht schwer zu erfüllen. Die Schnelllebigkeit der Technik birgt zwar viele Modeerscheinungen, jedoch sichert das Kriterium die Kontinuität des Unterrichts und den Wert der Kenntnisse und Erfahrungen der Unterrichtenden und verhindert fachliche Moden.[Mod02]
Dabei ist die Trägheit der Lehre eine Art Vorauslese, um das Zeitkriterium einer fundamentalen Idee zu erfüllen.
Der Autor interpretiert das Sinnkriterium als das tatsächliche Wertempfinden beim Empfänger der Idee, beim Lernenden. Wie gut kann die Thematik als praxisrelevant oder als sinnvoll erkannt werden? Kann der Bezug zur späteren Verwendung in der Arbeitswelt hergestellt werden?
Der Einsatz fundamentaler Ideen wird von [Mod02] wie folgt beschrieben:
“Der Unterricht muss dann so angelegt werden, dass sich diese - wenigen - fundamentalen Ideen bei den Schülerinnen und Schülern bilden können, er muss Kenntnisse und Erfahrungen vermitteln, die anhand dieser Ideen zu ordnen sind, und er muss diese Ideen zu einem geeigneten Zeitpunkt explizit thematisieren, um die spezifischen Möglichkeiten und Beschränkungen der Informatik in Abgrenzung gegen andere Disziplinen erkennbar zu machen.“
Einige Beispiele fundamentaler Ideen und die dazugehörigen Kriterien sind in [Sch94] zu finden.
Ein vieldiskutiertes Thema ist, welche Sprache sich für den Unterricht am besten eignet. [LGS06, Pal90] meint, dass der Lernerfolg von der Zeit abhängt, die für tatsächliches Programmieren aufgewendet werden kann. Es sollte keine Zeit mit sprachspezifischen Eigenheiten und Syntaxproblemen “verschwendet“ werden. Geht es nach [LGS06, Mil93], hat eine Programmiersprache für Unterrichtszwecke einen einfachen Zugang. Sie sollte leicht erlernbar sein, eine klare Struktur haben und vielfältig einsetzbar sein. Die Sprache hat eine einfache Syntax, einfaches I/O Handling, verständliche String-Manipulation, aussagekräftige Schlüsselwörter und verständliches Feedback im Fehlerfall.
Während Pascal und Logo vor einigen Jahren noch oft im Unterricht zum Einsatz kamen, sind beide heute stark aus der Mode gekommen. Gründe dafür sind sicher die mangelnde Einsatzfähigkeit in der Industrie und die, so gut wie nicht mögliche, Verwendbarkeit der Sprache bei steigender Komplexität der Software.
Heute zählen Sprachen wie C, Java und C++ zu den beliebtesten Programmiersprachen. Das ist an der Anzahl der verfügbaren Entwickler, Lehrgänge und Dienstleister weltweit zu erkennen [TIO07]. Studien wie [dWT02], [Md03] und [SW98] belegen, dass Java, C++ und C die Sprachen mit der größten Verbreitung an Universitäten sind.
Trotz dieser Beliebtheit (oder gerade deswegen) wird viel über die Tauglichkeit dieser Sprachen im Unterricht diskutiert, gerade wenn es um geeignete Sprachen für Programmieranfänger geht. Die oben genannten Sprachen werden als überladen betrachtet. Die Studierenden plagen sich eher mit der Notation, als mit dem tatsächlichen Algorithmen. [LGS06] erläutert, dass die meisten Probleme von Programmierneulingen immer dasselbe Muster zeigen:
“[...] construct-based problems, which make it difficult to learn the correct semantics of language constructs, and plan composition problems, which make it difficult to put plans together correctly [...] students lack the skills needed to trace the execution of short pieces of code after taken their first course on programming.“
Im Zuge einer Studie an der finnischen Universität in Tampere ist eine Umfrage an europäischen Hochschulen durchgeführt worden. 559 Studenten und 34 Lektoren an 6 verschiedenen Universitäten wurden unter anderem zu deren Schwierigkeiten beim Lernen und Lehren von Programmiersprachen befragt. Die daraus abgeleiteten Folgerungen besagen:
“the most difficult concepts to learn are the ones that require understanding larger entities of the program instead of just details [...] abstract concepts like pointers and memory handling are difficult to learn [...] However, the biggest problem of novice programmers does not seem to be the understanding of basic concepts but rather learning to apply them.“ [LAMJ05]
Die Studenten haben Probleme, wenn es darum geht, den Gesamtumfang eines Programmes zu erfassen und umzusetzen, dh. wie setze ich eine mir gestellte Aufgabe mit den Konzepten um, die ich gelernt habe. Dabei darf die Syntax einer Sprache nicht im Wege stehen, da sie daran hindert eine Problemlösung zu finden und nur neue, andere Probleme schafft. Zeiger und Speichermanipulation zählen zu den als sehr schwierig eingestuften Konzepten.
Die in diesem Kapitel zitierte Literatur deckt sich mit den Beobachtungen des Autors aus der eigenen Ausbildung und der Abhaltung eines C Tutoriums für Programmieranfänger. Die Studenten konnten genau wiedergeben, wie sie das Problem lösen würden, doch konnten sie es nicht “zu Papier“ bringen, also als Quelltext wiedergeben. Die Syntax wurde als unnatürlich und teilweise unverständlich empfunden. Manche syntaktische Eigenheiten sind für den Tutor auch schwer zu erklären, da die Studenten die dahinterliegenden Konzepte noch nicht verstehen können. Nahezu alle Fehler resultierten aus einem Fehler in der Syntax. Der Autor konnte dabei ein hohes Maß an Frustration und Demotivation der Studenten im Unterricht feststellen. Die Sinnhaftigkeit des Lehrinhaltes wurde weiters angezweifelt.
Die persönlichen Erkenntnisse des Autors und jene der obig angeführten Literatur lassen Handlungsbedarf erkennen. Diese Arbeit wird im weiteren Verlauf diese Problematik behandeln und zwei Werkzeuge für möglichst reibungsfreien und effektiven Unterricht vorstellen.
Python ist eine dynamische High-Level“ Programmiersprache, die den interpretierten Skriptsprachen zugeordnet und oft ˶ Perl, Ruby, Scheme oder Java verglichen wird. Sie wurde mit dem Ziel entwickelt, möglichst einfach und übersichtlich zu sein, gleichzeitig aber nicht an Flexibilität und funktionaler Skalierbarkeit einbüßen zu müssen.
Die Syntax ist sehr übersichtlich gehalten, was unter anderem durch zwingende Einrückung des Quelltextes erreicht wird (siehe Listing 1). Grammatikalisch ist auf wenige Schlüsselwörter optimiert worden2.
Abbildung in dieser Leseprobe nicht enthalten
Listing 1: Python Syntax
Python arbeitet mit dynamischer Typverwaltung. Variablen haben somit keinen festen Typ. Anders als bei statischer Typverwaltung wie in Compilersprachen, wird der Typ zur Laufzeit und abhängig vom Einsatz der Variable bestimmt. Das erspart dem Entwickler vieles an zusätzlicher Arbeit, da der Quelltext, durch die Ersparnis der explizit anzugebenden Typinformation, übersichtlicher und kürzer wird. Weiters können Funktionen, die ja ohne Typinformation geschrieben sind, auf vielen verschiedenen Objekttypen wiederverwendet werden. Man spricht auch von Duck Typing: If it looks like a duck and quacks like a duck, it must be a duck“ [DT00]. Die Kehrseite der ” sind natürlich Performanceeinbußen.[CG97], [Lej06], [GH]
In Programmiersprachen wie C oder C++ ist der Programmierer für Speicherreservierung und Spreicherfreigabe selbst verantwortlich. Unter C wird das z.B. mit den Funktionen malloc() und free() durchgeführt. Pythons Strategie hiezu hat den Namen ˶ ähler“ (reference counting). Das Prinzip ist einfach: jedes Objekt enthält einen Zähler, der mit jeder Referenz auf das Objekt inkrementiert wird. Wird eine Referenz wiederum gelöscht, wird der Zähler dekrementiert. Erreicht dieser den Wert Null, kann der Speicher freigegeben werden.
Der Pythonentwickler ist an kein Programmierparadigma gebunden. Auch wenn Python sich als objektorientierte Sprache vorstellt, ist die Entwicklung mit verschiedenen Programmierstilen möglich. Das erlaubt Flexibilität bei der Erstellung von Programmen. Die Entwicklung ist durch die Sprache nicht an ein Paradigma gebunden, sondern kann das, für die momentane Situation effizienteste Paradigma wählen, eventuell sogar verschiedene Paradigmen anwenden. Das macht natürlich Python für den Unterricht sehr interessant.
Die Python-Distribution wird mit einer Standardbibliothek in Form von Python-Modulen ausgeliefert, die von der Community als batteries included“ bezeichnet wird. Die Komplexität wurde aus der Sprache entfernt, die ˶ liegt in den Bibliotheken. Das Spektrum reicht von Bibliotheken zur Graphical User Interface (GUI)-Gestaltung über Multimedia und Spielentwicklung bis hin zu verteilten Systemen [Lin02]. Großes Augenmerk wird hierbei auf Webapplikationsentwicklung gelegt, die gängigen Protokolle und Standards sind plattformunabhängig verfügbar3. Findet der Entwickler die gewünschte Funktionalität nicht in den Standardbibliotheken, kann er das gewünschte Modul aus einer großen Sammlung von Drittanbietern wählen. Die Module der Standardbibliothek können mit C oder Python erweitert werden, auf gleiche Art können eigene Module entwickelt werden.
Abbildung in dieser Leseprobe nicht enthalten
Listing 2: Lesen einer Website durch Verwendung eines Moduls der Standardbibliothek
Python ist portierbar und somit plattformunabhängig. Der Python Interpreter kann auf jeder beliebigen Architektur installiert werden, wenn es dafür einen C Compiler gibt. Die populärsten Betriebssysteme mit verfügbaren Python Interpretern sind Linux, Berkeley Software Distribution (BSD), Mac OS X, Solaris und Microsoft Windows. Für diese gibt es auch sehr gut gewartete Bibliotheken.
Die Python Implementierung steht unter einer Open-Source Lizenz. Der Quelltext ist frei verwendbar und verteilbar, auch für den kommerziellen Gebrauch. Die Python Lizenz4 wird von der Python Software Foundation (PSF)5 verwaltet. Hinter Python steht natürlich eine Open-Source Community, die regelmäßig, aktiv und ambitioniert ihr Produkt verbessert. Jeder kann sich an der Entwicklung beteiligen. Internationale Mailinglisten, Foren, Arbeitsgruppen und Konferenzen werden auf den Internet-Seiten der Python Software Activity (PSA)6 organisiert. Eine wichtige Rolle in der Entwicklung von Python trägt die Special Interest Group (SIG)7.
Es gibt zahlreiche Projekte, die mit Python am Markt und in der Industrie erfolgreich ihre Arbeit verrichten. Zu den größten Referenzen zählen Firmen wie Google, Yahoo, National Aeronautics and Space Administration (NASA) und viele andere8.
Peter Norvig, director of search quality“ bei Google meint: ˶
“Python has been an important part of Google since the beginning, and remains so as the system grows and evolves. Today, dozens of Google engineers use Python, and we’re looking for more people with skills in this language.“
Bei Google ist Python ein wichtiges Werkzeug; Google sucht immer wieder nach talentierten Entwicklern, in deren Portfolio Python zu finden ist.
Python ist zu einer bedeutenden Größe in der Softwareindustrie geworden.
Ihren Namen verdankt die Programmiersprache Python der britischen Comedy-Gruppe Monty Python, nicht der gleichnamigen Schlangenart, wenngleich diese auch zu einem wesentlichen Bestandteil der Python Corporate Identity (CI) geworden ist.
Pythons Erfinder und momentaner Hauptbetreuer ist Guido van Rossum. Python basiert auf ABC, einer Programmiersprache, die in den achtziger Jahren verwendet wird. 1989 beginnt Van Rossum mit der Entwicklung von Python am Centrum voor Wiskunde en Informatica (CWI)9 in Amsterdam. Das Ziel ist, die Hürden, die ABC an der Weiterverbreitung hindern, zu überwinden. ABC ist wie Pascal: eine gute Lehrsprache für den Unterricht, aber in der Industrie nicht zu gebrauchen. Ein Grund ist Unflexibilität, wenn es um Skalierbarkeit geht. So wird Python von Grund auf für den Einsatz in der Ausbildung an Lehranstalten konzipiert. Hinzu kommen mehr fortgeschrittene Möglichkeiten zur Softwareentwicklung, eine Standardbibliothek voller Erweiterungen und die leichte Anknüpfbarkeit an andere Programmiersprachen (vor allem C), damit Python auch außerhalb des Unterrichts Verwendung finden kann.[Wil02]
Abbildung in dieser Leseprobe nicht enthalten
Abbildung 3: Einflüsse anderer Sprachen auf Python
Abbildung 3 zeigt eine kompakte Übersicht zur Entwicklung Pythons. Eine detaillierte, historische Übersicht zur Entstehung von Programmiersprachen im Allgemeinen ist auf [Pix01] zu finden.
Python wird 1991 veröffentlicht; die Entwicklung der ersten Version geht bis Python 1.6.1. Oktober 2000 wird Python 2.0 freigegeben, zum Zeitpunkt dieser Arbeit ist Python in Version 2.5 aktuell, welche seit September 2006 zur Verfügung steht. Momentan wird an Version 3.0 (Py3K, Python 3000) entwickelt, die in einer Alpha Version 2007 erwartet wird10.
Diese Arbeit greift nun den Versuch auf, die Popularität Pythons anhand einer Google Suche zu messen. Das ist keine sehr wissenschaftliche Messung, spiegelt aber doch eine gewisse Relevanz und vor allem deren Veränderung in den letzten Jahren, in der weltweit größten Suchmaschine wider. Basis der Untersuchung sind die Ergebnisse aus dem Jahr 2002 von [Wil02]:
Abbildung in dieser Leseprobe nicht enthalten
Tabelle 1: Google-Suche: Platzhalter-Sprache AND ( language OR code OR program). Zugriff auf http://www.google.com/ am 22.10.2006.
Tabelle 1 stellt die Ergebnisse einer Anfrage an die Suchmaschine Google dar. Dabei wird die ursprüngliche Anfrage von [Wil02] aus dem Jahr 2002 mit der gleichen - nur zeitlich aktuelleren - Anfrage verglichen. Wie zu erkennen ist, ist die Anzahl der Treffer immens in die Höhe geschnellt. Das kann in erster Linie durch die technologische und inhaltliche Entwicklung der Suchmaschine begründet werden, wie auch durch die Relevanz der einzelnen Suchanfragen.
Die hohe Trefferanzahl der Sprache C ist mit Vorsicht zu genießen, da angenommen werden kann, dass hier einige Treffer zu C++ mitgerechnet werden. Trotzdem steht C ungeschlagen an der Spitze dieser Auswertung, was auch nicht weiter verwunderlich ist. Nach wie vor wird C in der Systemprogrammierung verwendet, Schnittstellen zu Anwendungsprogrammen sind typischerweise ebenso in C implementiert. Ein C-Compiler exisitiert für eine Vielzahl an Plattformen. Gerade im rasant gewachsenen Embedded Systems Bereich ist C quasi Standard.
Die anderen Programmiersprachen sind interessant zu beobachten, wobei Python im Vergleich zu 2002 das größte Wachstum verbuchen kann und sich im Gesamtvergleich mit Anwendungsentwicklungssprachen wie C++ oder Java durchaus messen kann. Im Vergleich der Skriptsprachen hat Perl vor Python die höhere Trefferanzahl.
Abbildung in dieser Leseprobe nicht enthalten
Tabelle 2: Google-Suche: Platzhalter-Sprache AND ( (language OR code OR programm) AND ( education OR teaching)). Zugriff auf http://www.google.com/ am 22.10.2006.
Die Daten in Tabelle 1 sind sehr allgemein und umfassen mehr als die gewünschte Thematik dieser Arbeit. Aus diesem Grund wird mit Tabelle 2 die Suchanfrage leicht abgeändert und damit konkretisiert: wie relevant sind die genannten Programmiersprachen im Unterricht? Während Tabelle 1 die Veränderung im Laufe der letzen Jahre darstellt, zeigt Tabelle 2 den Status quo.
Weiterführende Literatur zu Python: [Pyt06], [Swa04], [AD02], [Lut06], [AM05], [Pil04].
High Level Language (HLL) nach [Fed96, Lin02]:
“A computer programming language that is primarily designed for, and syntactically oriented to, particular classes of problems and that is essentially independent of the structure of a specific computer or class of computers.“
Nach diesem Zitat ist eine HLL eine Programmiersprache, die unabhängig von der Maschine ist. Programmiersprachen ab der dritten Generation zählen zu den höheren Programmiersprachen oder High-Level-Languages. In der Literatur wird oft auch der Begriff “Systemsprache“ verwendet. Eine HLL hat eine für Menschen lesbare Syntax, die von einem Compiler oder Interpreter 1:n in Maschinensprache übersetzt wird. Das bedeutet, dass ein einziger Befehl in einer HLL durch viele Instruktionen in Maschinensprache ausgedrückt wird. Assembler, zählend zur zweiten Generation, übersetzt 1:1 in Maschinensprache, die wiederum zur ersten Generation gezählt wird.
Zwei verschiedene Programme verarbeiten eine HLL in Maschinensprache (Binärcode): Compiler und Interpreter. Ein Interpreter liest ein High-Level Programm und führt es aus. Die Analyse des Quelltextes erfolgt also zur Laufzeit des Programms.
Abbildung in dieser Leseprobe nicht enthalten
Abbildung 4: Interpreter
Ein Compiler analysiert das Programm und übersetzt es komplett, bevor das Programm ausgeführt wird. Der somit entstandene Code wird Objektcode genannt. Das Programm kann ohne weitere Übersetzung wiederholt ausgeführt werden.
Abbildung in dieser Leseprobe nicht enthalten
Abbildung 5: Compiler
Python wird zu den interpretierten Programmiersprachen gezählt; Programme werden von einem Interpreter ausgeführt. Es gibt hierbei zwei Varianten: den Kommandozeilenmodus und den Skriptmodus. Im Kommandozeilenmodus werden Befehle Zeile für Zeile eingegeben, der Interpreter gibt das Ergebnis sofort retour11:
Abbildung in dieser Leseprobe nicht enthalten
Im Skriptmodus wird das Programm in einem File gespeichert. Der Inhalt wird dann vom Interpreter ausgeführt.
Der Skriptmodus führt zum Begriff Skriptsprache. Wie zu Beginn des Kapitels erwähnt, wird Python den interpretierten Skriptsprachen zugeordnet. Eine Skriptsprache ist eine HLL, jedoch mit noch höherer Abstraktion zur Maschine. [Ous98] unterscheidet dabei Systemsprachen von Skriptsprachen wie folgt:
“Scripting languages are designed for different tasks than system programming languages, and this leads to fundamental differences in the languages. System programming languages were designed for building data structures and algorithms from scratch, starting from the most primitive computer elements such as words of memory. In contrast, scripting languages are designed for gluing: they assume the existence of a set of powerful components and are intended primarily for connecting components together. [...] Scripting languages are sometimes referred to as glue languages or system integration languages. [...] The growth of the Internet has also popularized scripting languages. The Internet is nothing more than a gluing tool.“
Skriptsprachen haben andere Aufgaben als “Systemsprachen“. Sie sind nicht darauf ausgelegt Datenstrukturen oder Algorithmen von Grund auf neu zu entwickeln, sondern als Bindeglied für vorhandene Applikationen zu dienen. Skriptsprachen bedienen sich also anderer Komponenten, um daraus eine eigene Applikation entstehen zu lassen.
Den immer wieder kritisierten Geschwindigkeitsunterschied zu kompilierten Sprachen versuchen Skriptsprachen wie Python zu verbessern. So wird der Quelltext nicht direkt interpretiert, sondern zuerst in den sogenannten “Bytecode“ umgewandelt. Dieser wird wesentlich schneller interpretiert. Wirklich Geschwindigkeitskritisches oder Rechenintensives wird in einer kompilierten Sprache geschrieben. Wie schon erwähnt, wird bei Python C verwendet. Weiters relativiert immer schnellere und billigere Hardware die Kritik an der Performance.
Einige weitere Eigenschaften von Skriptsprachen sind in diesem Kapitel schon erwähnt. Zur Übersicht sei eine Darstellung in kompakter Form aufgelistet:
- noch “höhere“ Implementierung als eine typische HLL
- interpretiert
- dynamische Typverwaltung
- optimal für schnelle Softwareentwicklung bzw. Prototyping [Lin02]
- hoher Re-Use Faktor
- leichter erlernbar als Systemsprachen
Weitere Beispiele für Skriptsprachen sind Perl12 oder Tcl13.
Zope14 ist ein Applikationsund Backend Server Framework, das Entwicklern erlaubt, schnell Protokolle einzubinden, Applikationen (üblicherweise webbasierte) zu entwickeln, und Konnex zwischen anderen internetbasierten Services herzustellen [Ric05a].
Zope wird großteils mit Python entwickelt. Geschwindigkeitskritisches wird in C umgesetzt. Üblicherweise wird die mit Zope mitgelieferte Zope Object Database (ZODB) verwendet, um transaktionssicher15 (Python) Objekte zu persistieren. Zope ist mit der Zope Public Licence (ZPL)16, einer freien Softwarelizenz, verfügbar.
Momentan werden zwei stabile Zope Versionen von der Community gepflegt. Mit Oktober 2006 ist Zope 2.10 die letzte stabile Version der Zope 2 Generation. Zope 3.3 ist die letzte stabile Version des neuen Zope 3. Diese Arbeit konzentriert sich auf Zope 3, wobei zuerst einige Unterschiede zu Zope 2 aufzeigt werden sollen.
Bevor Zope ins Leben gerufen wird, entwickelt die Zope Corporation17 (ursprünglich Digital Creations) 1996 das Produkt Bobo, ein in Python entwickelter Object-Publisher, welcher Entwicklern erlaubt, Python Objekte im Web abzubilden. Bobo ist weiters eine Objektdatenbank und ein Object Request Broker (ORB), der Uniform Resource Locator (URL) in Objektpfade umwandelt. 1998 wird dieses Produkt als Open-Source unter dem Namen Zope veröffentlicht.[Ric05a]
Zope 2 erfreut sich anfangs großer Beliebtheit durch die Through the Web (TTW) Entwicklung und Administration. Komplette Projekte können per Web entwickelt werden, ohne auch nur einmal eine Kommandozeile zu sehen. Die schnelle Projektabwicklung durch die Produktivität mit Python plus die Zope Templatesprachen Document Template Markup Language (DTML) und Zope Page Templates (ZPT) mobilisieren viele Entwickler, ihre Projekte mit Zope umzusetzen.
Zope 2 hat jedoch mit einer Vielzahl von Problemen zu kämpfen. Die anfangs, vor allem bei unerfahrenen Entwicklern, sehr beliebte TTW Entwicklung stößt schnell an Grenzen. So muss für fortgeschrittenere Methoden, wie etwa das Verwenden von regulären Ausdrücken, das Zope 2 Sicherheitssystem umgangen werden. Zope 2 TTW wird vom Framework aus Stabilitätsgründen mit eingeschränktem Zugriff auf Pythonbibliotheken versehen. Mit Zope 3 gibt es hier keine Einschränkung, da Funktionalität mit Hilfe von Pythonpaketen implementiert wird. Innerhalb dieser Pakete kann auf die komplette Funktionalität Pythons zurückgegriffen werden. Das ist unter Zope
2 auch möglich, nur ist die Dokumentation dazu schlecht zugänglich und die Implementierung nur mit einigen Tricks möglich. Listing 3 zeigt ein Beispiel dazu: wird das Initialisieren der Klasse in Zeile 27 vergessen, ist schnell und einfach eine potentielle Sicherheitslücke produziert. Das Zope 2 Framework liefert dem Entwickler hierzu keine Hinweise oder Warnungen.
Abbildung in dieser Leseprobe nicht enthalten
Listing 3: Typische Zope 2 Content Klasse
Um existierende Funktionalität zu erweitern, muss unter Zope 2 das sogenannte ˶Monkey-Patching“ angewandt werden. Hierbei wird die ursprüngliche Funktionalität zur Laufzeit geändert, ohne den Originalquelltext zu verändern. Eine gefährliche Methodik, da der Monkey-Patch nach einer Änderung des Originalquelltextes, mit hoher Wahrscheinlichkeit nicht mehr funktional ist. Bei exzessiver Anwendung dieser Methodik kommt der Entwickler schnell in Teufels Küche. Konkurrierende Monkey-Patches sind schwer nachvollziehbar, die Wartung wird somit teuer erkauft.
Auch die schlechte Trennung von Inhalt, Konfiguration und Präsentation trägt einen Teil dazu bei. Unter Zope 2 muss jede Instanz einer Klasse Attribute und Methoden bereitstellen, die Zope für die Interaktion im Framework benötigt. Das führt zu überladenen Objekten, schränkt die Portierbarkeit ein und erschwert nachträgliche Erweiterungen.[vW05b]
Trotzdem sind in den letzten Jahren hunderte von sogenannten Produkten unter Zope 2 veröffentlich worden. Die Palette reicht von einfachen Erweiterungen, wie z.B. unterschiedliche Datenbankadapter, Wikis, Blogs, bis zu e-Commerce Lösungen. Seine Praxistauglichkeit stellt Zope 2 etwa im Intranet-Einsatz der North Atlantic Treaty Organisation (NATO) oder beim Webauftritt des World Wide Fund For Nature (WWF)18 unter Beweis. Auch bekannte Contentmanagementsysteme wie Plone19 oder der Collaborative Portal Server (CPS)20 stützen sich auf Zope.[Möl05]
Für mehr Literatur zu Zope 2 empfiehlt der Autor [MB02], [AL01].
Dieses Kapitel umfasst die allgemeinen Eigenschaften und Merkmale von Zope 3. Tiefergehende Informationen und Praxisbezug sind in Kapitel 3 zu finden.
Das Zope 3 Projekt wird im Februar 2001 ins Leben gerufen. Die Community spricht sich für eine komplette Neuentwicklung des Frameworks aus, um die grundlegenden Schwierigkeiten mit Zope 2 auszumerzen. Seit Oktober 2005 ist Zope 3 auch für den Produktionseinsatz freigegeben.
Die Komponentenarchitektur, als wichtigeste Neuerung, teilt die Zuständigkeit für Inhalt (Content), Dienste (Utilities), Sichten (Views) und Adapter auf. Sie ermöglicht es, Software in kleinen und wiederverwertbaren Bausteinen zu entwickeln. Ziel einer solchen Aufteilung ist vor allem die höhere Wartbarkeit der Software. Ein anderes Datenbank-Backend, oder ein neuer Skin für eine Webapplikation soll keine Konsequenzen auf die tatsächliche Programmlogik haben. Außerdem wird für eine gewisse Übersicht und Ordnung durch Reduzierung der Komplexität gesorgt.
Auch die Wiederverwendung existierender Python-Komponenten aus den Bibliotheken gestaltet sich einfacher, als in der Vorgängerversion. Das dürfte helfen, die bisher vorhandene Spaltung zwischen Pythonund Zope-Entwicklern zu überwinden [vW05a].
Damit Komponenten austauschbar bleiben, müssen ihre Schnittstellen definiert sein. Dafür zuständig sind Interfaces, die als Verträge für die Komponenten fungieren. So ist es möglich, dass unterschiedliche Implementierungen für ein Interface entwickelt werden können, da ein Interface nur das Was“ beschreibt, nicht aber das ˶Wie“.
Zope 3 Komponenten kurz beschrieben:
Content Komponenten sind Datenobjekte. Die Daten sind anhand eines Schemas definiert. Ihre einzige Aufgabe besteht darin, ihre Daten zu verwalten. Das ermöglicht eine Zopeunabhängige Weiterverwendung unter Python.
Utilities Utilities sind kontextunabhängige Komponenten, die für bestimmte Aufgaben im Framework zuständig sind (z.B. Emailversand, Kodierung, Suche).
Adapter Adapter nutzen eine Komponente mit definiertem Interface, um ein neues Interface bereitzustellen. Das ermöglicht existierende Funktionalitäten zu erweitern, ohne die Originalimplementierung zu verändern.
Views sind Komponenten, die für die Darstellung anderer Komponenten zuständig sind. Views sind normalerweise als Kombination von Python-Code für Logik und ZPT für die Präsentation definiert.
Die Konfiguration des Frameworks und der Applikationen erfolgt bei Zope 2 im Quelltext selbst. Veränderungen der Konfiguration hat eine Änderung des Quelltextes zur Folge. Zope 3 Konfiguration wird in seperaten Extensible Markup Language (XML)-Dateien abgelegt. Der verwendete Dialekt ist Zope Configuration Markup Language (ZCML).
Um Entwicklern und vor allem bestehenden Applikationen die Umstellung auf Version 3 zu ermöglichen, wurde das Projekt Five (Zope 2 + Zope 3 = Five) ins Leben gerufen. Five ist ein Zope 2 Produkt, das einiges an Zope 3 Funktionalität zur Verfügung stellt. Zukünftige Zope 2 Versionen und Five werden langsam zu einer gemeinsamen Zope Version, basierend auf Zope 3, führen.
Der Großteil der momentanen Zope Projekte basiert auf Version 2. Anhand des stark wachsenden Interesses in den Communityforen und Mailinglisten21, und der stetig steigenden Anzahl an Zope 3 Modulen im Zope Repository22, kann in Zukunft mit einer größeren Anzahl an Referenzen gerechnet werden. Ende 2006 sind folgende größere Projekte bekannt:
Schooltool23 ist eine Applikation für die Administration einer Schule.
Launchpad24 ist ein Framework rund um Opensource Produkte, wie die Linux Distribution Ubuntu25 oder die Versionierungssoftware Bazaar26.
Weiterführende Zope 3 Literatur: [vW06], [Ric05a]
Warum eignet sich Python als Werkzeug für den Informatikunterricht? Ist Python als Einstiegssprache geeignet? Was zeichnet Python gegenüber anderen Programmiersprachen aus? Welche Anforderungen werden an eine “erste Programmiersprache“ gestellt? Was haben die Lehrenden davon? Dieses Kapitel enthält eine Diskussion zu den vorangegangen Fragen.
Gegenwärtig sind hauptsächlich Java und C++ als Programmierprachen in Lehrgängen für Programmieranfänger anzutreffen (vgl. Kapitel 1.4) [Rad06].
“While students with good preliminary background, who have already committed themselves to a computing career, usually succeed in such courses, many others remain disappointed or even completely fail.“
[Rad06] schreibt, dass Studenten mit Vorkenntnissen und explizitem Interesse an der Materie es leichter haben, solche Kurse erfolgreich zu absolvieren. Studenten, die bisher keine Erfahrungen in der Programmierung haben, bleiben hier oft auf der Strecke. Die Motivation, die Materie weiter zu verfolgen, ist verständlicherweise gering. Dabei soll Unterricht üblicherweise motivieren und dadurch den Forschergeist wecken. Ob das gelingt, ist eine Frage der Gestaltung des Unterrichts und hängt nur geringfügig von der zu unterichtenden Materie ab. Jedes noch so trockene Thema kann durch interessante und fesselnde Unterrichtsgestaltung schmackhaft gemacht werden. Die Unterrichtsgestaltung hängt auch mit der Wahl der benutzten Werkzeuge, um Wissen zu vermitteln, zusammen.
Das Problem nach [Rad06] ist, dass die heute verwendeten Sprachen alle kommerziell ausgerichtet sind. Kommerzielle Sprachen sind nicht für den Unterricht ausgelegt, sondern für die industrielle Softwareentwicklung. Kommerzielle Applikationen sind komplex. Die Programmiersprachen sind dafür ausgelegt, die Entwicklung dieser Applikationen zu ermöglichen.
Der Autor unterstützt diese Argumentation. Es stellt sich jedoch die Frage, warum nicht gerade aus diesen Gründen Programmiersprachen so einfach und übersichtlich wie möglich sein sollten. Eine Ursache dafür ist sicher eine versuchte Effizienzsteigerung durch diverse Sprachkonstrukte, die den Profi effizienter arbeiten lassen, für Anfänger aber nicht leicht verständlich sind (”make the common case efficient”). [Rad06] meint in seiner Arbeit, dass genau aus diesem Grund Programmierneulinge mit Konzepten konfrontiert werden, die für den Anfang überfordern.
[BM05] bringen einen Vergleich für den sportlichen Leser, indem sie ein Beispiel aus dem Schifahren bringen. Um ein wirklich guter Schifahrer zu werden, erfordert es Übung. Schipisten sind darauf ausgelegt, das Üben zu unterstützen, indem sie je nach Schwierigkeitsgrad farblich markiert sind. Blau für Anfänger, Rot für Fortgeschrittene und Schwarz für Profis. Eine blaue Piste bedeutet aber nicht, das hier auf die wichtigen Elemente des Schifahrens zu verzichten ist. Schwünge, Geschwindigkeitskontrolle, Bremsen und die richtige Übersicht sind auch hier notwendig, sind jedoch unter entschärften Bedingungen ausübbar. Wird ein Anfänger auf die schwarze Piste geschickt, wird er oft stürzen. Die Erfahrung ist für ihn frustrierend, und er wird schnell aufgeben und den Sport verdammen.
Dieser Ausflug in eine anderes Gebiet und die einfache Erkenntnis daraus kann auf jedes Lernen umgelegt werden. Konfrontiert man den Lernenden zu früh mit zu hoher Komplexität, kann dieser nicht genug Erfolge erleben und wird sich eher frustriert von der Thematik abwenden. Der Stoff muss sich aufbauend an den fundamentalen Ideen des Unterrichtsgegenstandes nähern, und dem Lernenden zwischendurch immer wieder Erfolgserlebnisse ermöglichen.
“As students progress through the introductory computer science sequence, we want them to focus on aspects of problem solving, algorithm development, and algorithm understanding. Unfortunately, many modern programming languages require that students jump into more advanced programming concepts at a point that is too soon in their development. This sets them up for possible failure, not because of the computer science but because of the language vehicle being used.“ [BM05]
In der Informatik liegt das Augenmerk auf den Aspekten der Problemlösung, der Entwicklung und dem Verstehen von Algorithmen. Die heute im Unterricht angewandten Programmiersprachen führen aber zu früh in komplexere Details der Wissenschaft. Das führt auch dazu, dass nicht Informatik, sondern die Aspekte einer Programmiersprache zum Gegenstand des Unterichts werden.
“It is a shame that the languages that our students encounter when they come to learn to program are languages that are designed for commercial use by experienced commercial programmers. Modern languages like Java and C++ contain a host of features that most students will never need, and which we should probably admit are a mystery to many of the students’ teachers.“ [Jen03]
Sprachen wie Java oder C++ sind in ihrem Umfang so mächtig, das es bestimmt eher selten ist, wirklich routinierte Profis als Lektoren zu bekommen. Glücklich sind diejenigen, die in diesen Genuss kommen.
Industriesprachen
Weßhalb werden Java, C++ und C nun hauptsächlich verwendet? Geht es nach [Jen03], [LGS06], [Zel98], [LM06], [Md03] und [Sta00], ist dieser Zustand industriegetrieben. Studenten sehen Jobangebote, in denen eine bestimmte Programmiersprache als Voraussetzung verlangt wird, und wollen diese lernen, um ihre Qualifikation damit aufzuwerten. Sie haben kein Interesse, eine “Baby- Sprache“[PM06] zu lernen. Lehreinrichtungen bewerten ihre Studienpläne anhand der Nachfrage in der Industrie. Das betrifft ganz besonders Fachhochschulen, wo Lehrpläne in enger Zusammenarbeit mit der Industrie erstellt werden.
Ein Lektor des Autors, der lieber anonym bleiben möchte, ist da ganz anderer Meinung. Die obig gebrachten Überlegungen seien unwahr, vielmehr gestaltet sich der Unterricht oft nach der Verfügbarkeit von Lektoren im Bekanntenkreis der für den Studienplan verantwortlichen Personen. Diese Lektoren bringen eher ihre persönlich bevorzugten Themen und Werkzeuge in den Unterricht ein (wobei letzteres durchaus legitim und wichtig für die Qualität des gebrachten Unterichtsstoffes ist).
Nach Ansicht des Autors ist die Realität wohl eine Mischung aus beiden gerade genannten Punkten. Doch sollte es nicht anders sein? In der Informatik war es früher auch anders. Blickt man auf die Zeit vor der objektorientierten Bewegung zurück, gab es Pascal [Wir71] als allgemein anerkannte Programmiersprache für den Unterricht [Rad06],[Zel98]. Das Problem mit reinen Unterrichtssprachen wie Pascal ist jedoch, dass sie in der Industrie nicht verwendet werden. Aus diesem Grund wurde Pascal auch weltweit aus den Lehrplänen gestrichen.
Es braucht also eine Sprache, die
- in der Industrie anerkannt ist bzw. in der Industrie Verwendung findet,
- mit der komplexe Softwareprojekte umgesetzt werden können,
- die für den Unterrichtseinsatz geeignet ist.
Betrachten wir Python, sind die ersten beiden Punkte erfüllt (siehe Kapitel 1.5). Wenden wir uns nun dem dritten Punkt zu. Ist Python für den Unterrichtseinsatz geeignet?
Hello World
Hello World ist traditionellerweise das erste Programm jedes Programmieranfängers. Starten wir gleich mit der Python Variante.
Abbildung in dieser Leseprobe nicht enthalten
Listing 4: Hello World mit Python
Über die Kommandozeile kann nun mit
Abbildung in dieser Leseprobe nicht enthalten
das Programm ausgeführt werden. Unter Windows reicht ein Doppelklick auf die Datei.
Sieht sehr einfach aus. [Jen03] meint aber, dass die vermeintliche Trivialität nicht unterschätzt werden sollte. Es muß klar sein, was ein Programm ist und wie das Programm erstellt, ausgeführt und das Ergebnis betrachtet werden kann.
Nun zur C++ Variante des Programms.
Abbildung in dieser Leseprobe nicht enthalten
Listing 5: Hello World mit C++
- Zeile 1: Zeilen, die mit einer Raute(#) beginnen, sind Direktiven für den Präprozessor. Diese Zeilen werden vom Compiler nicht normal ausgewertet, sondern zuvor vom Präprozessor bearbeitet. Dieser reagiert je nach Befehl unterschiedlich. In diesem Beispiel wird dem Präprozessor mitgeteilt, die Datei iostream zu inkludieren. Diese enthält Deklarationen der Standard Eingabe-Ausgabe Bibliothek von C++. Sie wird benötigt, da wir einen Befehl aus dieser Bibliothek später im Programm verwenden.
- Zeile 3: Alle Elemente der Standard C++ Bibliothek werden in einem eigenen Namensraum deklariert. Dieser Namensraum hat den Namen std.
- Zeile 5: Die main Funktion ist der Startpunkt eines jeden C++ Programmes. Eine Funktion wird immer mit runden Klammern definiert. Innerhalb der runden Klammern können Parameter an die Funktion übergeben werden. Die geschwungenen Klammern markieren den Bereich der Funktion. Alles innerhalb dieser Klammer wird beim Aufruf der Funktion ausgeführt. Vor dem Namen der Funktion steht die Definition des Rückgabewertes.
- Zeile 7: Das ist ein C++ Befehl (statement), den wir über eine Library inkludiert haben und einem Namesraum zugewiesen haben. Dieser spezielle Befehl repräsentiert den Standard Output Stream in C++. Das Beispiel zeigt, wie eine Sequenz von Zeichen (“Hello World!“) in den Stream geschrieben wird. Jeder Befehl muss mit einem Semikolon (;) beendet werden.
- Zeile 8: Der return Befehl beendet die Funktion, der Returnwert muss vom gleichen Typ wie die Deklaration der Funktion sein. Der Returncode von 0 bedeutet, das die Funktion fehlerfrei ausgeführt wurde.
Wie zu sehen ist, müssen, bei diesem sehr simplen Beispiel, Themen, die für einen Anfänger doch sehr fortgeschritten sind, erläutert werden. Eine andere, und nach Erfahrung des Autors sehr beliebte Variante um diese Problematik zu umschiffen, ist das gezielte Ignorieren dieser Punkte. Der Vortragende ersucht die Studenten, gewisse Teile des Programmes einfach auszublenden und z.B. nur innerhalb der main Funktion zu arbeiten und zu denken.
“The C++ version has always forced me to choose between two unsatisfying options: either to explain the #include, void main(), { , and } statements, and risk confusing or intimidating some of the students right at the start, or to tell them ’just don’t worry about all of that stuff now, we will talk about it later’ and risk the same thing.“ [Elk00]
Keine der beiden Varianten ist befriedigend. [Elk00] beschreibt den Aufwand, ein Hello World
Programm in ein Skriptum zu verfassen, wie folgt.
“There are thirteen paragraphs of explanation of “Hello, world“ in the C++ version, in the Python version there are only three. More importantly, the missing ten paragraphs do not deal with the “big ideas“ in computer programming, but with the minutia of C++ syntax. I found this same thing happening throughout the chapters that I have completed so far. Whole paragraphs simply disappear from the Python version of the text because Python’s much simpler syntax renders them unnecessary.“
[Elk00] zeigt damit, dass viel Einführungsarbeit mit C++ auf Spracheigenheiten bezogen ist. Das ist Zeitverschwendung. Studenten könnten mit Python viel früher zu ersten Erfolgserlebnissen kommen, ohne über mysteriöse Gegebenheiten, wie unerklärte und nicht verstandene Konstrukte, in den eigenen Programmen zu stolpern.
Einen Vorteil gegenüber Java hat C++ jedoch: im ersten Programm muss über Klassen nichts bekannt sein. Bei der Java Version des Programmes wird der Student sofort mit einem fortgeschrittenen Konzept konfrontiert, welches aber das Wissen über darunterliegende, objektorientierte Thematik voraussetzt. Abbildung 6 zeigt übersichtlich, welche Konzepte das unter anderem sind. Dabei fehlt bei diesem Beispiel der Konstruktor, ein weiteres neues Konzept.
Der Autor will C++ und Java nicht negativ darstellen. Es soll lediglich aufgezeigt werden, dass ein Start in die Programmierung mit einer der momentan in der Ausbildung verwendeten Sprachen nicht als optimal angesehen werden kann. Ein großer Vorteil von Python im Vergleich der Hello World Programme, ist die unterschiedliche Anzahl der Konzepte, die verstanden werden müssen, um ein erstes Programm zu schreiben. Ein erstes funktionales Programm ist auch ein erstes Erfolgserlebnis und motiviert zu mehr.
Abbildung in dieser Leseprobe nicht enthalten
Abbildung 6: Hello World mit Java nach [Rad06]
Syntax
“Compared to languages such as Java or C++, Python has a more intuitive syntax. Python enforces an intended and structured way of writing programs, and the code resembles pseudo code.“ [LGS06]
Entwickler werden unter Python gezwungen, mit Einrückung ihres Quelltextes zu arbeiten. Eine Einrückung markiert einen Block im Programm. Der Block endet erst mit der Einrückung. Bei falscher Einrückung wird ein Fehler generiert. Dabei sieht ein Programm in Python fast genauso aus wie das Programm geschrieben in Pseudocode. Das hat den Vorteil, dass Algorithmen einfach nach Pseudocodevorlage implementiert werden können.
“[...] with Python, the Pseudocode is in fact also real code, and already executable.“
[Sta00] meint sogar, dass mit Python sei Pseudocode auch echter Quelltext, der schon ausführbar ist.
Die Einrückung zwingt dazu, strukturiert zu schreiben und fördert dadurch ein einheitliches Programmbild, während in anderen Sprachen verschiedene Schreibstile möglich sind, die dazu führen, dass Richtlinien zur Lesbarkeit entwickelt werden müssen.
Programme werden lesbarer, was einige Vorteile mit sich bringt. Lektoren haben es leichter, die Arbeit der Studenten zu evaluieren und finden auch schneller Fehler in Programmen. Da Python keine unterschiedlichen syntaktischen Stile erlaubt, ist es somit für Studenten einfacher, an größeren Projekten gemeinsam zu arbeiten.[Elk00]
“Novice programmers find indentation to be quite natural and we have found that it enforces a more readable coding style than students typically adopt when they can use braces.“ [BM05]
Listing 6 zeigt ein C++ Beispiel. Frei nach dem Auge würde der zweite Befehl zum if-Block gehören. Durch das Fehlen der geschwungen Klammern umfasst der Block jedoch nur den ersten Befehl, der zweite wird unabhängig von der Verzweigung ausgeführt. Dieser Fehler passiert recht häufig. Mit Python wäre dieses Beispiel klar, alles Eingerückte nach der Verzweigung ist dem Block zugehörig. Es herrscht eine Art “natürliche Lesbarkeit“.
Abbildung in dieser Leseprobe nicht enthalten
Listing 6: Beispiel zur Lesbarkeit von eingerücktem Quelltext
“We feel that writing structured programs, which are easy to check, follow and maintain, is one of the main lessons in any programming course. Using Python, this lesson is taught automatically.“ [LGS06]
Lesbaren Quelltext zu schreiben ist ein wichtiges didaktisches Ziel. Durch Python erreicht der Student das implizit.
Semantik
Durch die dynamische Typisierung erspart man sich das Konzept der Deklaration. Der Typ einer Variable wird zur Laufzeit bestimmt. Eine Variable zeigt immer auf ein Objekt. Dieses Konzept ist leichter zu erläutern und zu verstehen, als die maschinennahe statische Typisierung, wo eine Variable ein Platz im Speicher ist, der zuvor deklariert werden muss. Typisierung ist ebenfalls eine häufige Fehlerquelle, auf die anfangs getrost verzichtet werden kann. Auch Zeiger und Speicherverwaltung sind solche Konzepte.
Die Literatur ist sich einig, dass die genannten Konzepte für eine erste Programmiersprache nicht notwendig sind, aber trotzdem zu einem späteren Zeitpunkt gelehrt werden sollten. Erfahrungen zeigen, dass die Konzepte auch viel einfacher angenommen werden, nachdem Studenten ihre ersten Erfolge mit Python erlebt haben und in der Lage sind, eigene komplexe Programme zu schreiben. Der Umstieg auf eine Hochsprache ist unproblematisch.[Jen03, Sha03, Rad06, Zel98, Elk00, PM06]
“We believe that it is advantageous for beginning students to spend time on the green runs[blaue Piste] learning the rudimentary ideas relating to algorithms and data structures. If you are among those of our colleagues who are frustrated with Java or C++, we encourage you to consider Python and join us on the green runs, it works.“
[Elk00] nimmt wieder das Beispiel des Schifahrens als Illustration und vergleicht Python als erste Programmiersprache mit dem Fahren auf einer blauen Piste, wo Studenten, unter entschärften Bedingungen, das Arbeiten mit Algorithmen und Datenstrukturen lernen.
Entwicklungsumgebung
Python wird mit dem Integrated Development Environment (IDLE) (Abbildung 9), einer auf das Nötigste reduzierten Entwicklungsumgebung ausgeliefert. Features sind Syntaxhighlighting, automatisches Einrücken des Quelltextes, ein einfacher Debugger und die integrierte Python Dokumentation.
[...]
1 Wenn in dieser Arbeit die männliche Form verwendet wird, sind Frauen gleichermaßen gemeint, sofern nicht explizit Gegenteiliges behauptet wird.
2 Mit Python 2.5 sind das 31 Schlüsselwörter. Zum Vergleich C/C++ mit 63 und Java mit 53 Schlüsselwörtern.
3 TCP/IP, FTP, NNTP, HTTP, POP, SMTP, MAPI, SGML, XML, CGI, ...
4 Python Lizenz: http://www.python.org/psf/license/
5 Python Software Foundation: http://www.python.org/psf/
6 Python Software Activity: http://www.python.org/psa/
7 Special Interest Groups: http://www.python.org/community/sigs/
8 Erfolgsgeschichten: http://www.python.org/about/success/
9 http://www.cwi.nl/
10 Python 3000, Google Tech Talk, Guido van Rossum, 2006
11 Im Laufe der Arbeit werden immer wieder Quelltexte eingearbeitet. Dabei gibt es zwei Formen. Die interaktive Session einer Interpreter Shell und den Skriptmodus. Die Interpreter Sessions sind erkennbar an der typischen Python Eingabeaufforderung (engl. “prompt“), die durch drei aufeinanderfolgende spitze Klammern (>>>) symbolisiert wird. Die Eingabe ist dabei immer fett ausgeprägt, die Ausgabe des Interpreters normal.
12 Perl: http://www.perl.com/
13 Tcl: http://www.tcl.tk/
14 Zope: http://www.zope.org/
15 siehe Maillinglisteneintrag “ZODB implementiert kein ACID“: https://mail.dzug.org/pipermail/zope/2007- June/003937.html
16 Zope Public Licence: http://www.zope.org/Resources/ZPL/
17 http://www.zope.com/
18 WWF: http://www.wwf.at/
19 Plone: http://www.plone.org/
20 CPS: http://www.cps-project.org/
21 Zope Users Mailingliste: http://mail.zope.org/pipermail/zope3-users/
22 Zope Repository: http://svn.zope.org/ 23Schooltool: http://www.schooltool.org/ 24Launchpad: https://launchpad.net/
25 Ubuntu: http://www.ubuntu.com/
26 Bazaar: http://bazaar-vcs.org/
Der GRIN Verlag hat sich seit 1998 auf die Veröffentlichung akademischer eBooks und Bücher spezialisiert. Der GRIN Verlag steht damit als erstes Unternehmen für User Generated Quality Content. Die Verlagsseiten GRIN.com, Hausarbeiten.de und Diplomarbeiten24 bieten für Hochschullehrer, Absolventen und Studenten die ideale Plattform, wissenschaftliche Texte wie Hausarbeiten, Referate, Bachelorarbeiten, Masterarbeiten, Diplomarbeiten, Dissertationen und wissenschaftliche Aufsätze einem breiten Publikum zu präsentieren.
Kostenfreie Veröffentlichung: Hausarbeit, Bachelorarbeit, Diplomarbeit, Dissertation, Masterarbeit, Interpretation oder Referat jetzt veröffentlichen!
Kommentare