Post by Dennis SchulmeisterPost by guidofrankeBlueJ (also JAVA) oder PYTHON 2.5 sind in die engere Wahl gekommen.
Viele meiner Kollegen bevorzugen BlueJ einige Wenige PYTHON!!!???
Was soll ich vorbereiten?
Ich möchte an dieser Stelle einfach mal aus meiner Sicht die Vor- und
Nachteile beider Sprachen beschreiben, was dir meiner Meinung nach wohl
besser hilft, als die recht oberflächliche Diskussion über Metal. :)
Ja, etwas Tiefgang kann in diesem Thread nicht schaden. :-)
Post by Dennis SchulmeisterInsgesamt wirkt der Python-Code etwas eleganter, dennoch würde ich den
Punkt hier an Java vergeben. Warum? In Java wird der Code vor der
Ausführung kompiliert, in Python gibt es diesen Schritt nicht zwingend.
Du meinst das richtige: statische Typprüfung. Punkt an Java.
Ob die allerdings durch einen Compiler oder einen Interpreter erfolgt
ist irrelevant. Zumal sowohl Python als auch Java eine _Kombination_
aus Compiler und Interpreter verwenden. Dieses "Gemisch" ist in Python
viel entwicklerfreundlicher realisiert als in Java. Punkt an Python.
Post by Dennis SchulmeisterDas heißt, obwohl UnitTests für beide Sprachen unumgänglich sind, ist es
meiner Meinung nach bereits ein schweres Vergehen, Python-Code
auszuliefern, der nicht durch einen ordentlichen Unit-Test geprüft
wurde. Denn 70% der Compilierfehler in Java sind versteckte
Laufzeitfehler in Python!
Hier steht übrigens nach wie vor die Frage im Raum, was effektiver
ist: Befriedigung des Java-Compilers durch mehr Typo-Notationen,
oder Schreiben von mehr Unit-Tests in Python.
Das sollte man aber unter dem allgemeinen Punkt "statische vs.
dynamische Typisierung" betrachten. Diese Diskussion kann man
besser führen, wenn man sie auf dem Niveau "LISP vs. OCaml/Haskell"
führt, statt auf dem Niveau "Python vs. Java".
Diesen Punkt hast du IMHO zu oberflächlich behandelt, daher
gebe ich nochmal meinen Senf hinzu. Denn ich kenne einige
Programmierer, denen Python als Sprache viel besser gefällt.
Dennoch verwenden sie Java. Warum? Nur wegen der Standard-
bibliotheken, vorallem wegen Swing! Dieser Punkt ist viel
wichtiger, als man zunächst glauben mag.
Dabei geht es gar nicht um die Qualität von Swing, die ich im
Vergleich zu GTK oder Qt übrigens auch nicht so toll finde,
sondern es geht um was anderes. Es geht um die Batterien.
(siehe nächste Absätze)
Post by Dennis SchulmeisterHier können beide Sprachen punkten und es gibt meiner Meinung nach
keinen Sieger. Beide Sprachen liefern sehr umfangreiche Bibliotheken
mit, die vorerst nur wenig Wünsche offen lassen.
Dennoch gibt es einen großen Unterschied: Die Python-Libraries
kommen i.d.R. direkt aus den bekannten C-Libraries, die Highlevel-
APIs natürlich sind dann in Python geschrieben. Das heißt, man hat
es mit Libraries zu tun, die man auch von C, C++, Perl, PHP und
vielen anderen Sprachen kennt.
Java hingegen hat auch im Lowlevel-Bereich praktisch alles neu
implementiert. Dabei sind die neuen APIs nicht unbedingt besser
designt, sondern einfach nur anders. Einige mögen genau das, andere
nervt das.
Post by Dennis SchulmeisterIn beiden Fällen
reichen die Funktionen der Bibliotheken von einfachen Kleinigkeiten bis
zur GUI-Pogrammierung. (Wobei ich persönlich Pythons TkInter nicht so
sehr mag wie Javas Swing. Doch auch von letzterem bin ich nicht so
angetan. Das ist jetzt aber nicht Gegenstand der Diskussion)
Dennoch sollte Python seinen starken Hang zu Tk ablegen. Nicht,
weil Tk zu einfach gestrickt ist, sondern vorallem, weil's rein
optisch potthässlich ist. Diesen Effekt darf man nicht unterschätzen.
Eine GUI-Library mit guter Optik motiviert Entwickler und Anwender
zugleich. Ähnliches gilt übrigens auch für Web-Programmierung, und
sogar für Programmierung im Textmodus (ncurses, slang).
Inzwischen hat jede Linux-Distribution Python-Bindings zu GTK, Qt,
wxWidgets und vielen anderen portablen GUI-Libraries. Aber zu den
"eingebauten Batterien" gehört nach wie vor nur Tk. Unter Linux
wiegesagt kein Problem, aber wer unter Windows programmiert, oder
für Windows ausliefert, der hat hier eine unnötige Hürde.
Und genau das macht Java/Swing interessant: Hier hat man eine
_schicke_ GUI-Library mit viel Funktionalität eingebaut. In Python
ist nur Tk eingebaut, eine _hässliche_ GUI-Lib mit viel zu wenig
Funktionalität. Daher klarer Punkt an Java.
Python sollte sich von Tk lösen und stattdessen GTK oder Qt als
Batterien mitbringen. Besonders ironisch: Für GTK gibt es bereits
eine Highlevel-Bibliothek namens Kiwi, die GUI-Programmierung
nochmals viel angenehmer macht. Eine echte "Geheimwaffe" von
Python, die AFAIK kein echtes Pendant in Java hat.
Kiki ist in meinen Augen der Swing-Killer schlechthin. Nur leider
gehört es in Python nicht zu den Batterien. :-(
Interaktiver Interpreter:
-------------------------
Post by Dennis SchulmeisterPython hat dafür einen anderen Vorteil: Seinen interaktiven Interpreter.
So ähnlich wie 8-Bit BASIC in den 80er Jahren kann man Pythons
Interpreter starten, ein bisschen Code eintippen und live verfolgen, was
passiert. Für kleine Spielereien reicht das vollkommen. Größere Sachen
sollte man dann aber doch in Dateien (Modulen) speichern. :)
Diesem Vorteil habe ich mal eine eigene Überschrift gegönnt. :-)
Java hat auch eine interaktive Shell, BeanShell, aber die ist
nicht mit "ipython" vergleichbar. Das Eben-Mal-Ausprobieren kann
man gar nicht genug betonen, gerade im didaktischen Bereich.
Viele Detail-Fragen kann man einfach durch ausprobieren klären,
und Selbermachen haftet besser im Gedächtnis. Dank Tab-
Vervollständigung kann man mal schnell die richtigen Methoden
erfragen, selbst wenn die erst dynamisch erzeugt wurden.
Und vorallem: Es bewegt sich ständig was. Man sieht immer
kleine Erfolge. Das ist für die "großen Programmierer" mindestens
genauso wichtig wie für Schüler. Es steigert nicht nur die
Motivation, sondern sorgt vorallem auch für weniger Verständnis-
und Konzept-Fehler. Das kann einem kein noch so strenges Typsystem
abnehmen.
In guten Python-IDEs (oder mit zwei XTerms für Vim und IPython ;-))
kann man mal schnell zwischen Interpreter und Quellcode-Datei
wechseln. Im Interpreter probieren, im Quellcode festschreiben.
Und nachdem die Funktion Quellcode steht, kann man sie im Interpreter
wieder direkt nutzen und entweder ausprobieren oder gleich die
nächste Funktion schreiben. Diese Technik der "inkrementellen
Programmierung" sollte man so früh wie möglich lehren!
Die großartige Interaktivität ist ein klarer Pluspunkt für Python.
Auch noch so viele Editor-Features von Eclipse können einen
interaktiven Interpreter einfach nicht schlagen. BTW, das hat
nichts mit statischer Typisierung von Java zu tun. Das sog.
"Toplevel" von OCaml zeigt, dass auch eine extrem strenge,
statisch typisierte Sprache einen Interpreter haben kann.
(Leider fehlt es dem OCaml-Toplevel an vielen benutzerfreundlichen
Features, wie man sie von IPython gewohnt ist. Wäre das Toplevel
besser, würde ich viel mehr in OCaml programmieren. Aber das ist
ein anderes Thema.)
Doc-Tests:
----------
Die interaktiven Sitzungen liefern i.d.R. auch super Anhaltspunkte
für Unit-Tests - und man kann sie größtenteil einfach herüber
kopieren.
Noch besser: Doc-Tests, das sind spezielle Unit-Tests, die man
als Beispiel-Code in seine API-Doc hinein schreibt. Es sind auto-
matisch getestete Beispiele und Unit-Tests zugleich. Und die kann
man sogar *witklich* 1:1 aus der Interpreter-Shell herüber kopieren,
weil genau das die Syntax für Doc-Tests ist.
Vielleicht gibt es das inzwischen auch für Java, doch Doc-Tests
entfalten erst dann ihre wahre Stärke, wenn sie interaktiv entstehen.
Eine der wichtigsten und aufwändigsten Tätigkeiten, das Testen, kann
man mit sehr kleinem Aufwand automatisieren. So, wie es sein sollte.
Daher würde ich auch hier einen Pluspunkt an Python vergeben.
Gruß,
Volker
--
"Wenn du der Meinung bist, der andere sei ein Depp, dann überlass das
Antworten denjenigen, die nicht dieser Meinung sind."
-- Adrian Suter in <***@mid.individual.net>