Erstellen einer Erweiterung der Java-Sprache - Schritte?

7

Ich habe mich gefragt, welche allgemeinen Schritte notwendig sind, um eine Art von Java-Erweiterung oder -Plugin zu erstellen. Genauer gesagt, ich möchte etwas wie eine C ++ - Struktur in Java erstellen, die es mir erlaubt, die Methoden einer bestimmten Klasse zu deklarieren, so dass ich die Reihenfolge angeben kann, in der sie von der JVM ausgeführt werden sollen. Dies ist im Moment nur ein Tor in den Himmel, und ich bin daran interessiert, wie AspectsJ oder andere Java-Erweiterungen arbeiten, um Ihnen zu ermöglichen, eine Syntax zu deklarieren, die nicht Java-typisch ist. Ich nehme an, dass dies eine Art Compiler-Plugin erfordern würde.

Ich stelle mir zum Beispiel folgendes vor:

%Vor%

Wenn ich im obigen Beispiel einen Webdienst habe und der Client ein schwaches Profil hat, was bedeutet, dass das Gerät, das sie zum Aufrufen des Dienstes verwenden, wenig Verarbeitung und geringe Bandbreitenkapazität hat, möchte ich nur nur% liefern. co_de% und streamDataViaGprs() Funktionalität. Wenn das Clientgerät jedoch über starke Verarbeitungsmöglichkeiten und eine hervorragende Bandbreitenverbindung verfügt, möchte ich sendSimpleMap() , streamDataVia3G() und sendComplexMap() verwenden. Das ist mein oberstes Ziel, aber ich bin mir nicht sicher, was daran beteiligt wäre, eine Struktur wie oben zu entwickeln, geschweige denn, wenn es überhaupt möglich ist.

    
Joeblackdev 08.06.2011, 19:22
quelle

7 Antworten

3

Wenn Sie Eclipse verwenden, können Sie sich Xtext ansehen. Es ermöglicht Ihnen, einen DSL- und einen Code-Editor (mit Syntaxhervorhebung und Code-Vervollständigung) in Eclipse zu erstellen.

Es gibt auch JetBrains MPS , das Meta-Programmiersystem.

    
Pescuma 20.07.2011, 18:21
quelle
16

Es gibt keine Compiler-Plugin-API. Es gibt mindestens vier Dinge, die Sie tun können:

1) Schreiben Sie Ihren eigenen Compiler für Ihre neue Sprache, der Ihren Code in Java-Code übersetzt und ihn dann dem Java-Compiler zuführt (der früher sehr beliebt war und jetzt nur noch selten verwendet wird). Ihr "Compiler" könnte tatsächlich nur einfache Texttransformationen durchführen, wobei der größte Teil des Codes unverändert weitergegeben wird. Dies ist also eine sinnvolle Möglichkeit, Dinge zu tun, wenn Ihre Änderungen klein und lokal sind.

2) Schreiben Sie Ihren eigenen Compiler für Ihre neue Sprache, die Java .class-Dateien ausstrahlt (jetzt sehr verbreitet: Groovy, Scala, Clojure funktionieren alle auf diese Weise.)

3) Verwenden Sie eine "bytecode engineering library", um kompilierte .class-Dateien zu erstellen, zu analysieren, zu modifizieren und entweder zurück auf den Datenträger zu schreiben oder sie dynamisch zu laden und auszuführen (dies ist die Art von AspectJ und den meisten Profilern) .)

4) Holen Sie sich die Quelle für Sun ^ H ^ H ^ HOracle's tatsächlichen Java-Compiler - er ist in OpenJDK verfügbar - und modifizieren Sie ihn. Das ist Hardcore und wahrscheinlich nicht der beste Plan.

Welchen Weg Sie wählen, hängt natürlich von Ihren Fähigkeiten und Anforderungen ab.

    
Ernest Friedman-Hill 08.06.2011 19:29
quelle
2

Sehen Sie sich JastAddJ an.

    
Jordão 20.07.2011 11:14
quelle
1

Ich schlage vor, ObjectTeams zu betrachten. Es ist ein Eclipse-Projekt, das es ermöglicht, ansonsten geschlossene Quellen zu verbessern, wie den Java-Compiler von Eclipse, den Editor für Java-Dateien usw. Sie bauen auch einige beispielhafte Java-Erweiterungen. Eine andere Möglichkeit ist die Verwendung von Jetbrains MPS , obwohl das nicht Java ist. MPS ist ein Projektionsansatz für erweiterbare Sprachen. Sie werden mit einer Java-Darstellung und mit einer Reihe schöner Erweiterungen ausgeliefert. Ihre 'Basissprache' kann als etwas wie 'Java ++' angesehen werden.

Allerdings bin ich nicht vertraut mit C ++ - Strukturen, aber ist keine einfache Java-Klasse mit öffentlichen Feldern so ziemlich wie eine Struktur?

    
Sebastian Zarnekow 08.06.2011 19:48
quelle
1

Sie sollten wirklich auf einige Java-Anmerkungen aufmerksam werden. Mit ihnen können Sie Felder, Klassen und Methoden markieren, sodass externe Entitäten über den Code entscheiden können. Eine Annotation, die in die Sprache eingefügt wird, ist @Override . Wenn der Compiler diese Annotation sieht, prüft er, ob die Methode tatsächlich etwas überschreibt oder sich sonst beschwert. Sie können jedoch Ihre eigenen Anmerkungen schreiben, so dass Sie eine @struct Annotation erstellen können (obwohl ich nicht denke, dass das besonders klar ist ...).

Die Annotationen werden in die Klassendatei kompiliert, so dass Sie dann über den Code mit Ihrer gewöhnlichen Reflexion oder einer der anspruchsvolleren Bibliotheken zur Bytecode-Manipulation ( ASM ist das Beste, was wir je gemacht haben.

    
CurtainDog 20.07.2011 11:10
quelle
0

Danke für all die Vorschläge Jungs. Am Ende habe ich Xtext benutzt und das erlaubte mir, meine eigene DSL (Domain-Specific Language) zu bauen. Sehr nettes Werkzeug!

    
Joeblackdev 30.06.2011 10:18
quelle
0

Zuerst möchte ich sagen, dass ich glaube, dass es leichtere Mittel gibt, das von Ihnen erwähnte Problem zu lösen als ein Compiler-Plugin. Aus der Spitze meines Kopfes würde ich die Verwendung von Java Enum -Typen erkunden, die sind vollwertige Objekte und kann Verhalten enthalten. Das Tool zur Bearbeitung von Anmerkungen könnte jedoch eine Möglichkeit für Sie sein Kompilieren Sie die Zeitcode-Generierung. Dies ist das Mittel, mit dem Projekt Lombok seine Kompilierungsmagie ausführt, daher kann es nützlich sein, seinen Code zu erkunden.

    
NullPointerException 20.07.2011 17:34
quelle

Tags und Links