[JAVA] Führen Sie JVM-Math-Language als Gradle-Projekt aus

Ich werde zum ersten Mal seit langer Zeit einen Artikel schreiben.

TCG ist nicht motiviert, daher kann ich es vorerst nicht schreiben.

Fast nützliche Sätze sind [Methode 2] Geben Sie den Prozessor aus den Einstellungen an. ](# Methode 2 Geben Sie den Prozessor in den Einstellungen an), überspringen Sie ihn also.

Abstrakt

Ich habe die JVM-Math-Sprache gelöscht und verschoben.

~~ Es kann zur Kompilierungszeit mit der Option -processor ausgeführt werden. ~~

Wenn der Anmerkungsprozessor in den Einstellungen festgelegt wurde, wurde der Quellcode dem Projekt zugeordnet.

gerührt.

Motivation

Ich wollte eine Programmiersprache erstellen, die mit Truffle auf Graal VM ausgeführt wird.

Graals SL war nicht so einfach wie ich erwartet hatte, also entschied ich mich, meine Sprache basierend auf einem einfacheren Interpreter zu implementieren.

Graalvm / simplelanguage

Trüffel-Tutorial-Folien

Ich habe auch vorher eine kleine verschiedene Übersetzung der Folien geschrieben.

Trüffel-Tutorial Folien Persönliches Übersetzungsprotokoll ①

Was ist JVM-Math-Language?

JJUG CCC 2017 Herbst Lassen Sie uns eine Oreore JVM-Sprache erstellen (nur vier Regeln werden berechnet) Eine mit ANTLR + Truffle erstellte Programmiersprache.

Jyukutyo / JVM-Math-Language

An AST interpreter with Truffle. This program can execute four arithmetic operations. You can use numbers, +, -, *, /, "()", and "->" for running in another thread.

Es scheint, dass es Truffles AST-Interpreter (Abstract Syntax Tree) ist, der vier Regeln ausführen kann.

Ein Projekt erstellen

Erstellen Sie ein Projekt.

Im Projekt Gradle verwendet der Compiler JDK 1.8. Ich benutzte es.

Die IDE verwendet IntelliJ.

Ich werde die Methode weglassen, aber ich habe vorher einen ähnlichen Artikel geschrieben, also denke ich, dass Sie ihn sich ansehen können.

Dann komprimieren Sie den Projektordner von GitHub. (Klonen oder Herunterladen)

Legen Sie nach dem Entpacken den Ordner src direkt unter dem Projekt ab.

JVM-Math-Language sieht aus wie ein Maven-Projekt, daher müssen Sie build.gradle schreiben.

Als Beispiel habe ich grob pom.xml von JVM-Math-Language (nur geschriebene Abhängigkeiten) portiert. ) Lass ihn in Ruhe.

build.gradle


plugins {
    id 'java'
}

version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

compileJava.options.encoding = 'UTF-8'
compileTestJava.options.encoding = 'UTF-8'

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    //Muss ANTLR ausführen
    compile group: 'org.antlr', name: 'antlr4-runtime', version: '4.7'
    //Muss Trüffel laufen lassen
    compile group: 'org.graalvm.truffle', name: 'truffle-api', version: '1.0.0-rc12'
    //Erforderlich, um Code aus Anmerkungen zu generieren
    compile group: 'org.graalvm.truffle', name: 'truffle-dsl-processor', version: '1.0.0-rc12'
}

Abgesehen davon scheint es, dass Sie, wenn Sie Gradle gut über die Konsole verwenden, ein Projekt (und natürlich build.gradle) aus pom.xml generieren können.

Geben Sie insbesondere den folgenden Befehl in das Verzeichnis ein (das das Projektverzeichnis sein wird), in dem sich pom.xml befindet.

gradle init --type pom

Kompilierungsfehler

Übrigens treten vorerst etwa 6 Kompilierungsfehler an Orten wie build ..... auf.

Übrigens gibt es auch eine rote Linie.

Wenn ich es überprüfe, scheinen die folgenden Klassen zu fehlen.

・ Jvmmathlang.truffle.JvmMathLangTypesGen

・ Nodes.ops.AddNodeGen (Paket unten weggelassen)

・ DivNodeGen

・ MulNodeGen

・ SubNodeGen

~~ Was ist Gen-Klasse?

Diese Klassen verwenden die JSR 269: Pluggable Annotation Processing API und den Truffle DSL-Prozessor. Scheint der Code zu sein, der automatisch von generiert wird.

Grob gesagt scheint die Implementierung einer abstrakten Klasse mit einer bestimmten Anmerkung automatisch generiert zu werden.

Jetzt liegt ein Kompilierungsfehler vor, da für die Generierung nichts festgelegt ist.

Jetzt richten wir den Anmerkungsprozessor ein.

In Bezug auf die Annotation Processing API war der folgende Artikel leicht zu verstehen.

API-Verwendungsprotokoll für steckbare Annotation Processing

** Methode ① funktioniert nur mit CompileJava, aber CompileJava scheint erfolgreich zu kompilieren, ohne Optionen anzugeben. (Das ist bedeutungslos) **

** Es fiel mir jedoch schwer, zu dem Artikel zu gelangen, in dem die Option -processor und das Festlegen mit gradle erläutert werden. Daher werde ich den Text selbst belassen. ** **.

~~ Methode (1) Geben Sie in der Kompilierungsoption an. ~~

~~ Der Java-Compiler hat die Option, mit einer angegebenen Prozessorklasse zu kompilieren. ~~

javac -Prozessor Vollqualifizierter Klassenname,Vollqualifizierter Klassenname,Vollqualifizierter Klassenname

~~ Außerdem werden im Gradle-Projekt Kompilierungsoptionen im Build-Skript beschrieben. ~~

~~ ・ Die Geschichte, der ich beim automatischen Generieren mit dem Anmerkungsprozessor #Source Code Automatic Generation verfallen war ~~

build.gradle


compileTestJava.options.compilerArgs += ['-processor', 'Vollqualifizierter Klassenname,Vollqualifizierter Klassenname,Vollqualifizierter Klassenname']

~~ Hier tritt ein Problem auf. ~~

~~ Ich habe keine Liste von Prozessorklassen. ~~

~~ Aber zum Glück war es direkt an meinen Fingerspitzen. ~~

Es gibt eine Datei namens javax.annotation.processing.Processor in META-INF-> service in ~~ truffle-dsl-processor-1.0.0-rc12.jar. ~~

~~ Es gibt eine vollständige Liste der Klassennamen. ~~

:javax.annotation.processing.Processor


com.oracle.truffle.dsl.processor.TruffleProcessor
com.oracle.truffle.dsl.processor.verify.VerifyTruffleProcessor
com.oracle.truffle.dsl.processor.LanguageRegistrationProcessor
com.oracle.truffle.dsl.processor.InstrumentRegistrationProcessor
com.oracle.truffle.dsl.processor.InstrumentableProcessor
com.oracle.truffle.dsl.processor.verify.VerifyCompilationFinalProcessor
com.oracle.truffle.dsl.processor.OptionProcessor
com.oracle.truffle.dsl.processor.interop.InteropDSLProcessor
com.oracle.truffle.object.dsl.processor.LayoutProcessor

~~ Wende dies früher auf build.gradle an. ~~

build.gradle


//Abkürzung
compileJava.options.compilerArgs += ['-processor', 'com.oracle.truffle.dsl.processor.TruffleProcessor,' +
        'com.oracle.truffle.dsl.processor.LanguageRegistrationProcessor,' +
        'com.oracle.truffle.dsl.processor.InstrumentRegistrationProcessor,' +
        'com.oracle.truffle.dsl.processor.InstrumentableProcessor,' +
        'com.oracle.truffle.dsl.processor.verify.VerifyCompilationFinalProcessor,' +
        'com.oracle.truffle.dsl.processor.OptionProcessor,' +
        'com.oracle.truffle.dsl.processor.interop.InteropDSLProcessor,' +
        'com.oracle.truffle.object.dsl.processor.LayoutProcessor']

~~ Sie können dies über Gradle-> Aufgaben-> Java in der Seitenleiste kompilieren. ~~

~~ Wenn Sie alle Klassennamen in Gradle schreiben, ist die Sichtbarkeit schlecht, also ~~

Sie können die Kompilierungsoption weglassen, indem Sie javax.annotation.processing.Processor zu ~~ src-> main-> resource-> META-INF-> services bringen. ~~

Methode (2) Geben Sie den Prozessor in den Einstellungen an.

Ja, das ist mein Favorit.

Öffnen Sie Datei-> Einstellungen-> Erstellen, Ausführen, Bereitstellen-> Compiler-> Anmerkungsprozessor.

Wählen Sie Standard und aktivieren Sie die Option Anmerkungsverarbeitung aktivieren.

Wählen Sie unter Generierte Quellzuordnungen an folgendem Speicherort speichern den Modulinhaltsstamm aus.

Dadurch wird beim Erstellen Code in src / main generiert.

Die Ordner generierte und generierte Tests werden jedoch noch nicht als Quellen erkannt.

Bearbeiten Sie daher build.gradle so, dass es als Quellordner erkannt wird.

· Reverse Manual: Verwendung von Anmerkungsprozessoren mit IntelliJ IDEA

build.gradle


apply plugin: 'idea'

idea {
    module {
        sourceDirs += file('src/main/generated')
        generatedSourceDirs += file('src/main/generated')
        testSourceDirs += file('src/test/generated_tests')
    }
}

Ich denke jetzt sind alle Fehler weg.

Schließlich

Es dauerte ungefähr anderthalb Wochen, bis die Einstellung Methode (2) erreicht war, die in 30 Sekunden abgeschlossen zu sein scheint.

Wenn Sie so etwas haben, schreiben Sie bitte einen Artikel und lassen Sie es mich wissen.

Reduzieren wir die Anzahl der Personen, die die gleichen Schwierigkeiten haben!

P.S.

Das Selbststudium mit Netzquellen ist immer schwierig

Recommended Posts

Führen Sie JVM-Math-Language als Gradle-Projekt aus
Erstellen eines Java-Projekts mit Gradle
Führen Sie modulare Projekttests in Gradle aus (JUnit5 + TestFX).
Führen Sie ein Spring Boot-Projekt mit VS-Code aus
Führen Sie JUnit und Spock in einem Maven-Projekt aus
Java-Tipps - Erstellen Sie mit Gradle ein Spring Boot-Projekt
Fügen Sie mit Gradle ein Projekt in einen beliebigen Ordner ein
Führen Sie autossh als systemd-Dienst unter CentOS aus
So führen Sie die SpringBoot-App als Dienst aus
Java11: Führen Sie Java-Code unverändert in einer einzelnen Datei aus