Jython und JRuby vs. Groovy (und Java) [geschlossen]

8

Ich interessiere mich sehr für Python zum Programmieren auf der JVM und habe viel in Java und Ruby (nicht JRuby) und bis zu einem gewissen Grad in Groovy gearbeitet.

Was sind derzeit die Grenzen der Integration von Java-Jython und Java-JRuby? Was ist mit Groovy: Gibt es Dinge, die eine Java-Klasse tun kann, die eine Groovy-Klasse nicht kann? Und was ist mit der IDE-Integration (hauptsächlich Eclipse, aber auch IntelliJ und Netbeans sind interessant)?

Es interessiert mich nicht, ob Python, Ruby oder Groovy besser / prägnanter / was auch immer ist. Ich bin nur daran interessiert, wie gut sie derzeit in der JVM und den Tools (insbesondere IDEs) arbeiten. Mein Hauptinteresse gilt nicht einem Webserver, wenn das wichtig ist.

Einfache Beispiele für das Abrufen einer HelloWorld, die eine benutzerdefinierte Java-Klasse erweitert und eine benutzerdefinierte Java-Schnittstelle implementiert, wären für mich sehr nützlich.

Dan Rosenstark
quelle

Antworten:

7

Ich habe keine Erfahrung mit JRuby oder Groovy. Aber Jython:

  • Hervorragende Integration mit NetBeans. NetBeans kann Python-Programme mit Jython fast sofort ausführen. Installieren Sie einfach das Plugin "Jython Distribution" und Sie sind fertig. Anscheinend funktioniert Eclipse auch. Siehe Kapitel Verwenden von Jython in einer IDE im Jython-Buch .

  • Die Java-Jython-Integration ist hervorragend. Das Aufrufen von Java aus Jython ist sehr einfach. Das Aufrufen von Jython von Java aus ist nicht ganz so einfach (Java wurde nicht für Jython entwickelt), aber dennoch recht einfach. Ich hatte größtenteils Glück, eine Klasse in Jython zu erstellen (eine Java-Klasse / -Schnittstelle zu erweitern) und dann Instanzen dieser Klasse in Java mithilfe einer Objektfactory zu erstellen. Anleitungen finden Sie unter Jython- und Java-Integration .

Das Erweitern einer Java-Klasse in Jython funktioniert folgendermaßen:

from javax.swing import JFrame, JButton

class MyFrame(JFrame):

    def __init__(self):
        self.defaultCloseOperation = JFrame.EXIT_ON_CLOSE
        self.size = (300, 300)
        self.add(JButton('Click Me!', actionPerformed=self.print_something))
        self.visible = True

    def print_something(self, event):
        print 'Clicked!'

Das Implementieren von Schnittstellen funktioniert ähnlich. Importieren Sie einfach die Schnittstelle, "erweitern" Sie sie mithilfe einer Klassendefinition wie class MyClass(MyInterface)und implementieren Sie, was benötigt wird.

Meine einzige Kritik an Jython ist, dass seine rohe Leistung nicht sehr gut ist (und das liegt hauptsächlich daran, dass es massive Reflexionen verwendet, um mit Java zu interagieren). Aber dann ist die rohe Leistung für eine Skriptsprache normalerweise ziemlich irrelevant.

Joonas Pulakka
quelle
Tolles Zeug +1. Irgendeine Idee, wie sich die Leistung von Jython mit der Leistung von Groovy (ebenfalls massiv reflektierend) vergleicht?
Dan Rosenstark
Ich habe sie nicht persönlich verglichen, aber Google scheint viele Meinungen zu finden: www.google.com/#q=jython+vs+groovy+performance
Joonas Pulakka
Google? Wer ist er? Es sieht so aus, als ob Jython schlechter ist als alle anderen Nicht-Java-JVM-langs. Interessant.
Dan Rosenstark
Die Leute verwenden Python für vollwertige Desktop-Apps, daher ist die Leistung etwas wichtig. Sind Sie sicher, dass Jython die Java-Reflection-APIs verwendet? (Sind Sie sicher, dass die Techniken von Groovy und JRuby nicht übernommen wurden? Weitere Informationen zur Leistung finden Sie unter blog.headius.com/2008/05/power-of-jvm.html und vielen anderen Posts im selben Blog.)
Ken Bloom
@ Ken Bloom: Ja, ich würde Jython nicht für vollwertige Desktop-Apps verwenden, da es ziemlich langsam ist (aber ich verwende es eingebettet in vollwertige Java-Apps). Ich bin mir ziemlich sicher, dass Jython hauptsächlich Reflection-APIs verwendet - im Gegensatz zu Groovy oder JRuby stammt die Codebasis von Jython tatsächlich aus dem letzten Jahrtausend - obwohl sie in letzter Zeit möglicherweise einige Optimierungen vorgenommen haben. Danke für den interessanten Blog-Link!
Joonas Pulakka
4

Im letzten Jahr habe ich viel mit Groovy gearbeitet (und auch mit Java, aber mehr mit Groovy).

IDE-Integration: OK in Netbeans. Da Groovy dynamisch ist, sollten Sie nicht die gleiche IDE-Unterstützung wie Java (Intelisense, Refactoring usw.) erwarten. Einige Leute sagen, dass InteliJ noch besser ist, aber mein Kollege, der es überprüft hat, mochte es nicht. YMMV. Als ich das letzte Mal nachgesehen habe, war die Unterstützung in Eclipse nicht so gut wie in Netbeans.

Groovy kann sehr einfach in Java integriert oder gemischt werden. Die Syntax ist relativ ähnlich, so dass der mentale Wechsel nicht zu sehr schmerzt.

Insbesondere bei Verwendung mit dem Grails-Framework macht es Spaß, mit Groovy zu arbeiten (IMO). Ich mag auch die Ähnlichkeit mit JavaScript; Daher erfordert ein Projekt, bei dem Groovy im Backend mit JavaScript auf dem Client gemischt wurde, keine zwei völlig unterschiedlichen Sprachen. In vielen Fällen fühlt es sich eher wie zwei Dialekte derselben Sprache an.

user281377
quelle
2

In Bezug auf Groovy kann eine Groovy-Klasse sicherlich alles, was eine Java-Klasse kann, da gültiges Java (fast) immer gültiges Groovy ist.

Ich habe festgestellt, dass Eclipse und NetBeans bei der Entwicklung von Groovy / Grails noch nicht für die Hauptsendezeit bereit sind. Aber IntelliJ ist wirklich gut, wenn Sie das Geld haben.

Eric Wilson
quelle
Dank dafür. Wie ich in der Frage sagte, interessiere ich mich NICHT für das Web, daher wäre IntelliJ kostenlos.
Dan Rosenstark
1
Java ist nicht immer IMMER gültig Groovy (aber fast), wie hier beschrieben (obwohl etwas veraltet): stackoverflow.com/questions/687601/…
Northover
wichtige Qualifikation hinzugefügt.
Eric Wilson