Java vs. Python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

BlackJack hat geschrieben:Grösster Unterschied für mich: In Python programmieren macht mir Spass. 8)
:D

An den OP: Arbeite einfach mal das Python Tutorial durch und schau, ob du damit klarkommst. Etwas Entsprechendes für Java sollte es vermutlich auch geben, oder?
Dragonfire
User
Beiträge: 22
Registriert: Dienstag 28. Februar 2012, 09:03

mkesper hat geschrieben:An den OP: Arbeite einfach mal das Python Tutorial durch und schau, ob du damit klarkommst. Etwas Entsprechendes für Java sollte es vermutlich auch geben, oder?
Ich komme damit klar ...
ohne Klammern fühlt man sich so frei ;)

Es ging jetzt um Unterschiede die man nicht auf den ersten Blick sieht ...
und die ihr seht ...
Ich programmiere schon ein wenig in python und der Post von lunar (siehe #1) hat
mich nachdenklich gemacht ...
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Der größte Unterschied dürfte darin bestehen dass Java OOP vergewaltigt während Python es nicht tut.
Dragonfire
User
Beiträge: 22
Registriert: Dienstag 28. Februar 2012, 09:03

DasIch hat geschrieben:Der größte Unterschied dürfte darin bestehen dass Java OOP vergewaltigt während Python es nicht tut.
Vergewaltigt?
Was meinst du damit genau?
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Biite, hier lesen auch minderjährige mit …

Denkt denn keiner mal an die Kinder‽
finki
User
Beiträge: 20
Registriert: Samstag 19. Februar 2011, 11:15

BlackJack hat geschrieben:Grösster Unterschied für mich: In Python programmieren macht mir Spass. 8)
Mir auch. Habe viele Programmiersprachen angesehen (das ging jahrelang so) und Python macht mir bisher mit am meisten Spaß.

@Dragonfire

Ich möchte jetzt nicht die genannten Aspekte wiederholen. Stattdessen wollte ich dir noch sagen, das solche Details erst im einzelnen nach kleinen Unterschieden klingen, sich aber summieren. Daraus ergibt sich eine vollkommen andere Herangehensweise. Oftmals unterscheiden sich die Sprachen nicht so sehr, aber durch die Herangehensweise und der eingesetzten Umgebung ergeben sich starke Unterschiede.

Ein sehr wichtiges Thema sind auch die fertigen oder frei zugänglichen Bibliotheken. Je nachdem wie sie einzusetzen sind, können sie dramatische Auswirkungen auf die Herangehensweise des "Problems" verursachen.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Dragonfire hat geschrieben:
DasIch hat geschrieben:Der größte Unterschied dürfte darin bestehen dass Java OOP vergewaltigt während Python es nicht tut.
Vergewaltigt?
Was meinst du damit genau?
Objekt orientiert ist letztlich alles was Datenstrukturen definiert und eine Menge von Nachrichten, Methoden oder Funktionen die jeweils auf oder mit diesen Datenstrukturen arbeitet. OOP ist keine Eigenschaft einer Sprache, es ist eine Strategie mit Datenstrukturen umzugehen die ich genauso gut wie in Java, C#, C++ und Python auch in C, Scheme und Haskell verwenden kann.

Java bietet nicht nur wesentlich mehr als dass, Java zwingt einen zu mehr. Java macht aus Objekten Instanzen, die dann auch noch Klassen haben müssen. Objekte haben nicht einfach Methoden, die müssen public, private oder wasauchimmer sein. Java macht aus allem ein Objekt auch wenn es semantisch eigentlich gar kein Objekt ist, was dann zu komischen Main und Helfer Klassen führt die nichts anderes als Module mit Identitätsproblem sind. Java kennt außerdem Operatoren als spezielle Methoden mit variierender Arität, Assoziativität und Präzedenz, dass ist zwar praktisch aber da sie so speziell sind dass sie undefinierbar sind nicht wirklich OOP. Dann haben wir auch noch Typen wie int, die wie Integer zeigt eigentlich Objekte sein wollen und es doch nicht sind obwohl es semantisch sinnvoll wäre.

Das einziger was noch störender und schlimmer ist, ist natürlich nicht Java als Sprache sondern Java als Community, die da meint all diese Eigenschaften wären irgendwie Teil von OOP obwohl sie nur (Anti-)Pattern sind.
BlackJack

@DasIch: Eine kleine Kritik an Deinen Ausführungen: Java zwingt nicht alles in Objekte, das wäre IMHO kein Problem, denn das ist bei Python auch so, sondern Java zwingt allen Code in *Klassen*. Auf der anderen Seite ist in Java aber nicht alles ein Objekt, wie zum Beispiel die Klassen und die Methoden darauf, womit man beides nicht als Werte behandeln kann wie in Python, sondern wieder Klassen schreiben oder benutzen muss um das umständlicher und indirekter zu tun.
problembär

Dragonfire hat geschrieben:WAS FINDET IHR SIND DIE GRÖSSTEN UNTERSCHIEDE ZWISCHEN JAVA UND PYTHON ?
Abgesehen davon, daß Java nervt, dieses hier: Die Java-Falle:

http://www.gnu.org/philosophy/java-trap.html
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

problembär hat geschrieben:
Dragonfire hat geschrieben:WAS FINDET IHR SIND DIE GRÖSSTEN UNTERSCHIEDE ZWISCHEN JAVA UND PYTHON ?
Abgesehen davon, daß Java nervt, dieses hier: Die Java-Falle:

http://www.gnu.org/philosophy/java-trap.html
Das OpenJDK ist die Referenz Implementation, was Oracle mit dem Manöver auch defakto durchgesetzt hat, mag man nicht mögen aber es kein großes Problem und für Programmierer nicht sonderlich relevant.

Der Stallman Artikel trifft nicht mehr zu weil das OpenJDK GPL lizensiert ist. Außerdem ist die Argumentation insofern lächerlich als dass sich kaum jemand den Luxus erlauben kann einen komplett freien Hardware/Software Stack zu benutzen, mal abgesehen davon dass kaum jemand dadurch einen Vorteil hätte.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

DasIch hat geschrieben:Außerdem ist die Argumentation insofern lächerlich als dass sich kaum jemand den Luxus erlauben kann einen komplett freien Hardware/Software Stack zu benutzen, mal abgesehen davon dass kaum jemand dadurch einen Vorteil hätte.
Also wenn ich mir den Hickhack der AMD/NVidia-Treiber anschaue und das mit den Intel-Treiber vergleiche dann liegen die Vorteile auf der Hand. Aber wie auch am Anfang des Artikels steht, sind die Punkte gegen Java nicht mehr gültig.

Aber zurück zum Thema: Der Unterschied ist vielerlei. Erstens mal, dass Python dynamisch typisiert ist und Java statisch und in letzterem sogar noch sehr schlecht. Ich habe nichts gegen statische Typsysteme, find sie sogar gut, aber Java's Typsystem ist weit Entfernt davon gut zu sein. Wenn mich mal nicht die Syntax abschreckt, dann haut mir das Typsystem von Java eine rein, so dass ich immer wieder aufs neue weiß warum ich mich damit nicht anfreunden kann.

Weiterhin sind in Python die Blöcke durch Einrückung festgelegt, was ich asthetisch schöner finde als auch angenehmer zu schreiben und zu bearbeiten. Daneben finde ich noch Lisp-Syntax passabel, aber bei wesentlich anderen Arten von Syntax geht es rapide abwährts. Geschweifte-Klammer-Syntax ist so weitläufig und die Syntax von etwa OCaml finde ich zwar prinzipiell OK, aber da gibt es zu viele Sonderfälle.

Ein besonders herausragender Unterschied ist auch die Community. Java ist sehr populär in der Enterprise-Community, wo gerne Blödsinn gemacht wird. So wird dort gerne UML verwendet, um total undurchsichtige Vererbungsstrukturen zu bauen, riesige Frameworks gebaut um die Beschränkungen der Sprache zu umgehen, viel XML verwendet weil XML ja toll ist und das einzige bessere als XML nun eben noch mehr XML ist. Das ist natürlich nicht bei allen so, aber betreffen tut es einen trotzdem, weil es sich in den APIs niederschlägt, die man nutzen muss. Zuletzt habe ich mir JAAS angeschaut, und das ist so furchtbar, es ist zum Haare raufen. Man wundert sich direkt, wer das jemals gut finden konnte. In Python sind die APIs flacher und simpler und so Sachen wie Spring Python können sich zum Glück nicht etablieren.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Leonidas: Könntest du mal grob sagen, was genau du schlecht findest am Typsystem von Java? Die Problematik, dass "niedere" Bestandteile der Sprache, wie Methoden oder Basistypen eine Sonderform einnehmen (im Gegensatz zu der Art, wie es in Python gelöst wurde), hatten wir ja schon. Was gibt es sonst noch?
deets

Eins was mir sofort einfaellt zB ist das die Generics eine Type-Erasure erfahren - d.h. die Typsicherheit der Container ist nur zur Compile-Zeit gegeben, du kannst aber zB ein HashMap auf eine untypisierte Variante casten, und dann da reinstopfen was du willst.

Die Tatsache dass es ausser single-inheritance und und interfaces keine Moeglichkeit gibt, Klassen zu komponieren - zB via Mixins oder sowas wie Kategorien aus ObjectiveC. Darum wird man dann gezwungen, so Delegate-Dinger als Nested Classes zu benutzen, um Standart-Funktionalitaet reinzuziehen - aber dafuer wird dann gleich wieder jeeeede Menge Boilerplate Code gebraucht (und es gibt bestimmt ein Eclipse-Plugin, dass das unterstuetzt...)

Last but not least (auf meiner Liste...) - kaum Meta-Programmierung. Damit braucht man dann fuer alles moegliche gleich Code-Generatoren und Co.
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

deets hat geschrieben:Eins was mir sofort einfaellt zB ist das die Generics eine Type-Erasure erfahren - d.h. die Typsicherheit der Container ist nur zur Compile-Zeit gegeben, du kannst aber zB ein HashMap auf eine untypisierte Variante casten, und dann da reinstopfen was du willst.
Ich finde es viel haarsträubender, dass der umgekehrte Weg funktioniert: Man kann z.B. eine untypisierte `ArrayList`, die nur Zahlen enthält, problemlos etwa in `ArrayList<String>` casten. Bei einem Zugriff auf eines der Items kracht es, wie du schon sagtest, aber erst zur Laufzeit. Damit ist klar, dass man Methoden, die String-Listen erwarten, munter fremde Typen unterschieben kann.

Ich hab aber zu wenig Erfahrung mit Java, um sagen zu können, wie praxisrelevant das tatsächlich ist. Vielleicht erwarten "gute" Java-Methoden ja ohnehin eher ein `String[]`-Array...
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

snafu hat geschrieben:@Leonidas: Könntest du mal grob sagen, was genau du schlecht findest am Typsystem von Java? Die Problematik, dass "niedere" Bestandteile der Sprache, wie Methoden oder Basistypen eine Sonderform einnehmen (im Gegensatz zu der Art, wie es in Python gelöst wurde), hatten wir ja schon. Was gibt es sonst noch?
Ein brauchbares Typsystem sollte so etwas wie eine Null Pointer Exception unmöglich machen und es erlauben die Integrität von Datenstrukturen sicherzustellen.
problembär

Python ist ja eine Skriptsprache (was immer das sein mag), Java sieht sich wohl eher als Alternative zu C/C++, also als "echte Programmiersprache". Ich teile diese Einschätzung so nicht, aber muß zugeben, daß Java für kommerzielle Entwickler, die notwendigerweise ClosedSource schreiben wollen, mit dem kompilierten ".jar" gewisse Vorteile bietet. Hier z.B. wird ein Programm kostenlos, aber ausdrücklich als ClosedSource angeboten:

http://www.jes-eur.de/?Download

Dieses Modell ist in Python schlecht zu realisieren, ein ".pyc" läuft nur auf der passenden Interpreter-Version und wäre wahrscheinlich auch relativ leicht zu rekonstruieren. "Code-Obfuscation" ist in Python auch so gut wie unmöglich.
Ich denke, das hängt damit zusammen, daß Guido bei Google Python vor allem für Skripte auf Servern gedacht hat, die zwar Verarbeitungsergebnisse an den Benutzer ausliefern, aber nicht selbst an diesen übermittelt werden.
Als Skriptsprache für die Java-Plattform gibt es (neben Jython) ja vor allem Groovy:

http://groovy.codehaus.org/

Mir scheint dies eher das Pendant zu Python zu sein als Java selbst.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Java zu dekompilieren ist nicht wesentlich schwerer als Python zu dekompilieren und mit dem AST Modul einen einfachen Obfuscator zu schreiben dürfte auch nicht sonderlich schwer sein.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

DasIch hat geschrieben:Java zu dekompilieren ist nicht wesentlich schwerer als Python zu dekompilieren und mit dem AST Modul einen einfachen Obfuscator zu schreiben dürfte auch nicht sonderlich schwer sein.
Im Gegenteil, es ist sogar einfacher, weil es dafür ausgereifte Tools gibt, die erstaunlich akkurat den Quelltext dekompilieren. Im Gegensatz zu Python.

@snafu: Probleme irgendwelche Generics in Arrays zu stecken, oder auch die Tatsache, dass Typfehler zur Laufzeit als Exception fliegen können wären weitere Beispiele. Am Schluss wird überall rungecastet, damit der Compiler das durchlässt und gut ist. Dafür brauchts dann auch kein statisches Typsystem.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

@problembär: Für Java-``class``-Dateien gibt es Decompiler und auch den Bytecode kann man sich disassemblieren, genau wie bei ``*.pyc``-Dateien von CPython. Ich sehe auch nicht warum man den Code notwendigerweise vor den Blicken der Kunden schützen können muss. Denn der will den in aller Regel nur ausführen. Das Problem für die kommerzielle Verwertung ist normalerweise ja nicht, dass man in den Quelltext schauen kann, sondern dass die Software kopiert werden kann. *Das* kann man aber auch mit obfucated Bytecode machen.

Python ist sieben Jahre älter als Google, also wird Guido nicht an Skripte auf Servern bei Google gedacht haben können, als er die Sprache entworfen hat. Die Sprache entstand als er für ein verteiltes Betriebssystem eine Sprache gebraucht hat, die dynamischer als C aber mächtiger als Shellskripte ist.

Für das Scripting innerhalb von Java gibt es deutlich mehr Sprachen als nur Groovy und mittlerweile mit JSR 223 auch eine standardisierte Anbindung für Scripting-Engines. Seit Version 6 vom Sun JDK wird mit `Rhino` eine JavaScript-Implementierung ausgeliefert.
deets

DasIch hat geschrieben: Ein brauchbares Typsystem sollte so etwas wie eine Null Pointer Exception unmöglich machen und es erlauben die Integrität von Datenstrukturen sicherzustellen.
Hast du dafuer ein real existierendes Beispiel? Last time I checked kommt man halt in solche Schwulitaeten wenn man rekursive Datentypen erlaubt (listen, baueme, graphen).
Antworten