2010-01-06 8 views
8

Ich habe einige schöne Java-Compiler hacks gesehen wird, wobei Sie können replace assertions by throw-exception statements, können Sie automatisch generierte properties für Felder und so weiter ...Überladen von Operatoren Plugin für Java

Ich frage mich ...

Ist es möglich, den Java-Compiler so zu hacken, dass er das Überladen von Operatoren unterstützt?

EDIT:

Es ist nicht, dass ich Operator in Java oder etwas Überlastung am fehlt. Ich möchte nur wissen, ob es möglich ist, es unter Verwendung der Hacks zu implementieren, die in den Links erwähnt werden, die ich oben angegeben habe. Also schlage mir bitte nicht vor, auf eine andere Sprache wie Scala zu wechseln (was ich sowieso schon lerne!: D).

EDIT:

Bitte nur mir sagen, ob es möglich ist, es zu tun mit JSR 269 oder so ähnlich. : |

Danke.

+0

Sie zu Sca wechseln sollte ... oh wait ... – skaffman

+2

ich auf die Gruppe Projekt Lombok fragen gehen würde - Reinier Zwitserloot und Roel Spilker machen eine Menge Compiler-Hacks über eine Reihe von Tools/Compilern, so dass sie wahrscheinlich in der Lage sein werden, Sie in die richtige Richtung zu lenken - http://groups.google.com/group/project-lombok – McDowell

+0

Es scheint mir so Man könnte den Compiler dazu bringen, alles Mögliche in der Compiler-Theorie zu tun. Abstimmen. –

Antwort

5

Als Antwort auf die bearbeitete Frage ist die einzige Möglichkeit, true Operatorüberladung in Java zu implementieren, der Sprache hinzuzufügen. Dies bedeutet, dass Sie entweder den Compiler ändern müssen, um Ihren Code zu kompilieren, oder einen Präprozessor schreiben, der Ihren Code in Java-Standard konvertiert. Für Ersteres können Sie eine fast vollständige FOSS-Java-Implementierung von entweder GNU oder dem OpenJDK-Projekt herunterladen. Für Letzteres können Sie entweder Ihren eigenen Parser mit Dingen wie JavaCC usw. schreiben (Beispiele sind page) oder Sie können JFront als Basis verwenden, um Ihre eigene Syntax hinzuzufügen.

+1

Warum müssten Sie die Sprache (Syntax) ändern, um das zu tun? Das Laden von Benutzern ist ein semantisches Problem. Sollte die Parsing-Stufen nicht anders als die Disambiguierung von Bezeichnern ändern. – xcut

+0

Wie würden Sie das Überladen von Operatoren hinzufügen, ohne die Syntax zu ändern? Sie müssten entweder ein 'operator' Schlüsselwort hinzufügen oder' + ',' -' etc als Funktionsnamen zulassen. Beide erfordern eine Änderung der zulässigen Syntax. –

+0

Ich weiß, dass Sie dies tun können, indem Sie spezielle Methoden innerhalb jeder Klasse bereitstellen, wie __sum __() usw. Beachten Sie, dass ich nur das Parsen in Verbindung mit dem Schreiben eines Präprozessors erwähnt habe. –

1

Wenn Sie den Operator überladen möchten, sollten Sie in Erwägung ziehen, zu Scala zu wechseln. Scala-Code ist mit Ihren Java-Klassen kompatibel und unterstützt das Überladen von Operatoren.

2

JFront ist ein Vorprozessor für die Java-Sprache, mit dem Sie das Überladen von Operatoren für Ihre eigenen Klassen implementieren können. Leider scheint es diese Fähigkeit nicht zu Standardklassen hinzuzufügen (BigInteger et al. Wären dafür ein guter Kandidat).

+0

Es wäre ein guter Trick, wenn es das für die 'java. *' API-Klassen tun könnte, aber ich nehme an, dass es Bytecode oder Quellenmodifikation verwendet, was keine Option für 'java. *' Ist (ohne irgendeine fesselnde Classloader-Fußarbeit) , sowieso). – skaffman

1

Ein anderer Ansatz ist die Verwendung von Groovy-Bibliotheken, da Groovy bereits eine Operator-Überladung aufweist.

https://o24j.dev.java.net/

Die aktuelle Implementierung verwendet Groovy für die Überlastung. Dieser Ansatz hat einen Nachteil: die Groovy-Bibliotheken müssen mit dem Projekt geliefert werden.

2

interessieren Sie Byte Code-Injektion können einen Typen wie float mit Ihrer eigenen Art zu ersetzen, . Dies kann nach der Kompilierung erfolgen, ohne den Compiler zu ändern.

+0

Wie würde mir das helfen, das zu erreichen, was ich will? Kannst du bitte klarer sein? –

+0

Sie könnten Ihren gesamten Code schreiben, indem Sie float (zum Beispiel) mit Operatoren usw. verwenden und den Byte-Code ersetzen, um den Code so zu ändern, dass er den gewünschten Typ verwendet. –

4

Es ist möglich, das Überladen von Java-Operatoren mit JSR 269 mit einigen Hacks zu implementieren.Schauen Sie sich Java-oo-Plugins für javac und Eclipse JDT:

http://amelentev.github.com/java-oo/

+0

Sieht gut aus. Funktioniert auf BigInteger usw. so wie es ist. – Dukeling

Verwandte Themen