2010-01-06 6 views
8

J'ai vu un compilateur Java agréable hacks où vous pouvez replace assertions by throw-exception statements, vous pouvez avoir généré automatiquement properties pour les champs et ainsi de suite ...opérateur Plugin pour Java Surcharge

Je me demandais ...

Est-il possible de pirater le compilateur Java pour qu'il prenne en charge la surcharge de l'opérateur?

EDIT:

Ce n'est pas que je suis absent opérateur surcharge en Java ou quelque chose. Je veux juste savoir s'il est possible de l'implémenter en utilisant les hacks mentionnés dans les liens que j'ai donnés plus haut. Alors s'il vous plaît ne me suggérez pas de passer à une autre langue comme Scala (que j'apprends déjà quand même!: D).

EDIT:

S'il vous plaît me dire s'il est possible de le faire en utilisant JSR 269 ou quelque chose comme ça. : |

Merci.

+0

Vous devez passer à Sca ... oh wait ... – skaffman

+2

Je vais demander au groupe de projet Lombok - Reinier Zwitserloot et Roel Spilker font beaucoup de hacks de compilation à travers une gamme d'outils/compilateurs, donc ils seront probablement en mesure de vous diriger dans la bonne direction - http://groups.google.com/group/project-lombok – McDowell

+0

Il me semble que on pourrait pirater le compilateur pour faire quelque chose de possible dans la théorie du compilateur. Voter vers le bas. –

Répondre

5

En réponse à la question éditée, la seule façon de mettre en œuvre true surcharger l'opérateur Java consiste à l'ajouter à la langue. Cela signifie que vous devez soit changer le compilateur pour compiler votre code, soit écrire un préprocesseur qui convertit votre code en Java standard. Pour le premier, vous pouvez télécharger une implémentation Java FOSS presque complète à partir de GNU ou du projet OpenJDK. Pour ce dernier, vous pouvez soit écrire votre propre analyseur en utilisant des choses comme JavaCC etc. (les exemples sont sur ce page) ou vous pouvez utiliser JFront comme base pour ajouter votre propre syntaxe.

+1

Pourquoi devriez-vous modifier la langue (syntaxe) pour le faire? Le chargement de l'opérateur est un problème sémantique. Ne devrait pas avoir à changer les étapes d'analyse, autre que l'identification de l'identificateur. – xcut

+0

Comment ajouter une surcharge d'opérateur sans modifier la syntaxe? Vous devez soit ajouter un mot-clé 'operator', soit autoriser les noms de fonction' + ',' -' etc. Les deux nécessitent de changer quelle syntaxe est acceptable. –

+0

Je me rends compte que vous pouvez le faire en fournissant des méthodes spéciales à l'intérieur de chaque classe, comme __sum __() etc. Notez que je n'ai mentionné l'analyse que conjointement avec l'écriture d'un pré-processeur. –

1

Si vous souhaitez surcharger l'opérateur, vous pouvez envisager de passer à Scala. Le code Scala est interopérable avec vos classes Java et prend en charge la surcharge de l'opérateur.

2

JFront est un pré-processeur pour le langage Java qui vous permet d'implémenter la surcharge de l'opérateur pour vos propres classes. Malheureusement, cela ne semble pas ajouter cette capacité aux classes standard (BigInteger et autres seraient un bon candidat pour cela).

+0

Ce serait une bonne astuce s'il pouvait le faire pour les classes API java. * ', Mais je suppose qu'il utilise le bytecode ou la modification de source, ce qui n'est pas une option pour' java. * '(Sans un jeu de classeur de fantaisie) , en tous cas). – skaffman

1

Une autre approche utilise des bibliothèques Groovy puisque, Groovy a déjà une surcharge d'opérateur.

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

L'implémentation actuelle utilise Groovy pour la surcharge. Cette approche a un inconvénient: les bibliothèques groovy doivent être livrées avec le projet.

2

Vous pouvez utiliser l'injection de code octet pour remplacer un type comme flotteur avec votre propre type . Cela peut être fait après la compilation sans changer le compilateur.

+0

Comment cela m'aiderait-il à réaliser ce que je veux? Pouvez-vous s'il vous plaît être plus clair? –

+0

vous pouvez écrire tout votre code en utilisant float (par exemple) avec des opérateurs etc et utiliser le remplacement de code byte pour changer le code pour utiliser votre type désiré à la place. –

4

Il est possible d'implémenter une surcharge d'opérateur Java en utilisant JSR 269 avec certains hacks.Regardez les plugins java-oo pour javac et Eclipse JDT:

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

+0

Ça a l'air bien. Fonctionne sur BigInteger, etc. – Dukeling