[linux-l] typdynamische Sprachfeatures
Axel Weiß
aweiss at informatik.hu-berlin.de
Mi Sep 28 21:58:22 CEST 2005
Volker Grabsch schrieb:
> p = Person()
> p.__dict__['name'] = "Hans" # Das geht!
> hello(p)
>
> Nun funktioniert alles. Selbst wenn der Compiler also feststellen
> könnte, dass "hello" das Attribut "name" von seinem Parameter
> verlangt, und dass "Person" dieses Attribut nicht bieten kann, müsste
> er den String-Parameter 'name' noch verstehen, und wenn man diesen zur
> Laufzeit erst zusammenbaut, hat der Compiler keine Chance mehr.
Ja, Python hat ein paar gruselige Features. Interessant finde ich hier,
dass im Zusammenhang mit Python immer OO-Vokabular benutzt wird
(Attribute, Methoden, usw.), Python also offensichtlich eine
objektorientierte Sprache ist. Zur Stärke der objektorientierten
Sprachen gehört jedoch gerade, dass für solche Konstrukte auch saubere
Varianten existieren. Und das bedeutet, dass ich es eigentlich verbieten
will, dass man einem Objekt eine neue Methode oder ein neues Attribut
andichtet.
Ich kenne bis heute kein Beispiel, was sich nicht mit sauberen
OO-Konzepten hinschreiben lässt, dafür aber mit Python's dynamischen
Features. Ich lasse mich aber gerne vom Gegenteil überzeugen...
> Macht man hingegen das hier:
>
> p = Person()
> p.name = "Hans" # Das geht!
> hello(p)
Meiner Meinung nach verleitet die (ernsthafte) Anwendung solcher
Konstrukte zur Herstellung von unübersichtlichem, wenn nicht sogar
nichtvorhersehbarem Code, ala 'self-modifying code', der in den 80er
Jahren ungeahnte Möglichkeiten verhieß. Wie gesagt, das geht auch
sauber. Wenn ich a priori weiß, dass ich Person-Objekte an die Funktion
hello übergeben will und hello auf ein Attribut name zugreift (mehr weiß
man über die Argumente von hello nicht?), dann kann ich das etwa so
hinschreiben:
class Helloable:
String name;
def hello (Helloable h):
print "Hello ", h.name, "!"
class Person: inherits Helloable
#pass
und alles ist wohlgeordnet, sprich: der Compiler kann die Typen prüfen.
Und wenn ich nicht a priori weiß, dass ich Person-Objekte an die
Funktion hello übergeben will, dann sollte ich das lassen!
> 1) gibt es ein Compiler-Projekt für Python, wo eben diese Sorte von
> Vorhersagen irgendwie ermöglicht werden. Will man den nutzen, darf
> man natürlich nicht mehr die ganz krassen Python-Features nutzen,
> aber du braucht man eh selten. Den Namen des Projektes weiß ich
> leider nicht mehr.
Python ist nicht mächtiger als C++, bezogen auf die zu lösenden Probleme.
Ein Python-Compiler wird die Sprache auf die Konstrukte reduzieren, die
eine Typüberprüfung zur Compilezeit erlauben - oder ganz auf statische
Typprüfung verzichten (was sicher nicht im Sinne der Erfinder ist).
> 2) gibt es prinzipiell nur die Sorge, ob bestimmte Methoden verfügbar
> sind, wenn sie aufgerufen werden. Selbst wenn man nur ganz einfache
> (aber vollständige) Testsuites hat, fällt das auf. Zwar erst
> zur Laufzeit, und nicht schon zur Compile-Zeit, aber immer noch
> in der Testing-Phase, also lange bevor der Code auch nur irgendwie
> ernsthaft gestartet wird. Und die Fehlersuche ist damit genauso
> schnell, als würde es vom Compiler gefunden werden ... naja,
> vielleicht ein paar Mikrosekunden später ...
> Richtig tiefliegende Fehler findet man natürlich nicht, aber ich
> wüsste andererseits auch kein Beispiel für so einen Fehler, der
> nicht schon beim Programmieren ins Auge fallen würde.
Laut einer Erhebung von 1997 in den USA enthalten ausgelieferte
Softwareprojekte durchschnittlich (!) 7 Fehler pro 100 Codezeilen...
> Ohne Testsuites ist Python aber ein ziemliches Wagnis, das stimmt. :-(
>
> > Wenn schon kein Compilierungs-Schritt da ist, sollte wenigstens eine
> > statische Analyse stattfinden, um den Programmierer zu unterstützen.
>
> Was bedeutet das? Kannst du das mal an einem Beispiel erläutern?
Hand aufs Herz: wie erzähl' ich's meinem Compiler? Ich versuche doch
erstmal hinzuschreiben, was ich meine. Der Compiler sagt mir aber, dass
er mich nicht versteht. Also sag' ich es ihm anders, und ich brauche
einige Versuche, um ihn zufriedenzustellen. Dann guck' ich mir an, ob
das, was ich jetzt gesagt habe, auch immer noch das ist, was ich meine.
So entsteht ein Konsens zwischen mir und meinem Compiler, noch bevor
einer von beiden auf die Idee kommt, irgendwas zu debuggen. Was würde
ich einem Compiler/Interpreter erzählen, der jeden Unsinn akzeptieren
würde?
Gruß,
Axel
--
Humboldt-Universität zu Berlin
Institut für Informatik
Signalverarbeitung und Mustererkennung
Dipl.-Inf. Axel Weiß
Rudower Chaussee 25
12489 Berlin-Adlershof
+49-30-2093-3050
** www.freesp.de **
Mehr Informationen über die Mailingliste linux-l