[JAVA] Exécutez JVM-Math-Language comme un projet Gradle à portée de main

J'écrirai un article pour la première fois depuis longtemps.

TCG n'est pas motivé, je ne peux donc pas l'écrire pour le moment.

Les phrases les plus utiles sont [Méthode 2] Spécifiez le processeur à partir des paramètres. ](# Méthode 2 Spécifiez le processeur dans les paramètres), alors ignorez-le.

Abstrait

J'ai laissé tomber le langage JVM-Math et je l'ai déplacé.

~~ Il pourrait être exécuté avec l'option -processor au moment de la compilation. ~~

Lorsque le processeur d'annotations a été défini à partir des paramètres, le code source était associé au projet.

déplacé.

Motivation

Je voulais créer un langage de programmation qui fonctionne sur Graal VM en utilisant Truffle.

Le SL de Graal n'était pas aussi simple que ce à quoi je m'attendais, j'ai donc décidé d'implémenter mon langage basé sur un interpréteur plus simple.

Graalvm / simplelanguage

Diapositives du didacticiel sur les truffes

J'ai également écrit une petite traduction des diapositives avant.

Truffle Tutorial Slides Personal Translation Memo ①

Qu'est-ce que JVM-Math-Language?

JJUG CCC 2017 Fall J'essaierai de créer un langage Oreore JVM (seules quatre règles sont calculées), qui a été introduit dans la session. Un langage de programmation créé avec ANTLR + Truffle.

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.

Il semble que ce soit l'interpréteur AST (abstract syntax tree) de Truffle qui peut exécuter quatre règles.

Créer un projet

Créez un projet.

Dans le projet Gradle, le compilateur utilise JDK 1.8. Je l'ai utilisé.

L'EDI utilise IntelliJ.

Je vais omettre la méthode, mais j'ai écrit un article similaire avant, donc je pense que vous pouvez le regarder.

Ensuite, fermez le dossier du projet à partir de GitHub. (Cloner ou télécharger)

Après la décompression, déposez le dossier src directement sous le projet.

JVM-Math-Language ressemble à un projet Maven, vous devez donc écrire build.gradle.

A titre d'exemple, j'ai porté à peu près pom.xml de JVM-Math-Language (dépendances écrites uniquement) ) Laisse-le tranquille.

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'
    //Nécessaire pour exécuter ANTLR
    compile group: 'org.antlr', name: 'antlr4-runtime', version: '4.7'
    //Nécessaire pour exécuter Truffle
    compile group: 'org.graalvm.truffle', name: 'truffle-api', version: '1.0.0-rc12'
    //Requis pour générer du code à partir des annotations
    compile group: 'org.graalvm.truffle', name: 'truffle-dsl-processor', version: '1.0.0-rc12'
}

En passant, il semble que si vous utilisez bien Gradle depuis la console, vous pouvez générer un projet (et bien sûr build.gradle) à partir de pom.xml.

Plus précisément, entrez la commande suivante dans le répertoire (qui sera le répertoire du projet) où pom.xml est placé.

gradle init --type pom

Erreur de compilation

À propos, pour le moment, environ 6 erreurs de compilation se produisent dans des endroits tels que build .....

Au fait, il y a aussi une ligne rouge.

Quand je le vérifie, il semble que les classes suivantes manquent.

・ Jvmmathlang.truffle.JvmMathLangTypesGen

・ Nodes.ops.AddNodeGen (package omis ci-dessous)

・ DivNodeGen

・ MulNodeGen

・ SubNodeGen

~~ Qu'est-ce que la classe Gen?

Ces classes utilisent JSR 269: API de traitement des annotations enfichables et le processeur Truffle DSL. Semble être le code généré automatiquement par.

En gros, si vous créez une classe abstraite avec une annotation spécifique, son implémentation sera générée automatiquement.

Maintenant, il y a une erreur de compilation car rien n'est défini autour de la génération.

Configurons maintenant le processeur d'annotations.

De plus, concernant l'API de traitement des annotations, l'article suivant était facile à comprendre.

Mémo d'utilisation de l'API de traitement des annotations enfichable

** La méthode ① fonctionne uniquement avec CompileJava, mais CompileJava semble réussir à compiler sans spécifier aucune option. (Cela n'a pas de sens) **

** Cependant, j'ai eu du mal à accéder à l'article qui explique l'option -processor et comment la définir avec gradle, je vais donc laisser le texte lui-même. ** **

~~ Méthode (1) Spécifiez dans l'option de compilation. ~~

~~ Le compilateur Java a une option pour compiler avec une classe de processeur spécifiée. ~~

javac -processeur Nom de classe complet,Nom de classe complet,Nom de classe complet

~~ De plus, dans le projet Gradle, les options de compilation sont décrites dans le script de construction. ~~

~~ ・ L'histoire à laquelle j'étais accro lors de la génération automatique avec le processeur d'annotation #Source code génération automatique ~~

build.gradle


compileTestJava.options.compilerArgs += ['-processor', 'Nom de classe complet,Nom de classe complet,Nom de classe complet']

~~ Ici, un problème se pose. ~~

~~ Je n'ai pas de liste de classes de processeurs. ~~

~~ Mais heureusement, c'était à portée de main. ~~

Il existe un fichier appelé javax.annotation.processing.Processor dans le service META-INF-> dans ~~ truffle-dsl-processor-1.0.0-rc12.jar. ~~

~~ Il contient une liste complète des noms de classes. ~~

: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

~~ Appliquez ceci à build.gradle plus tôt. ~~

build.gradle


//Abréviation
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']

~~ Vous pouvez le faire à partir de Gradle-> Tâches-> compiler Java dans la barre latérale. ~~

~~ De plus, si vous écrivez tous les noms de classe dans Gradle, la visibilité sera mauvaise, donc ~~

Vous pouvez omettre l'option de compilation en amenant javax.annotation.processing.Processor aux services ~~ src-> main-> resource-> META-INF->. ~~

Méthode (2) Spécifiez le processeur à partir des paramètres.

Oui, c'est mon préféré.

Ouvrez File-> Settings-> Build, Run, Deploy-> Compiler-> Annotation Processor.

Sélectionnez Par défaut et cochez Activer le traitement des annotations.

Dans Enregistrer les associations de sources générées à l'emplacement suivant, sélectionnez la racine du contenu du module.

Cela générera du code dans src / main au moment de la construction.

Cependant, les dossiers generated et generated_tests ne sont pas encore reconnus comme sources.

Par conséquent, modifiez build.gradle afin qu'il soit reconnu comme un dossier source.

· Manuel inversé: Comment utiliser les processeurs d'annotation avec 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')
    }
}

Je pense que maintenant toutes les erreurs ont disparu.

finalement

Il a fallu environ une semaine et demie pour atteindre le paramètre appelé méthode (2), qui semble être terminé en 30 secondes.

Si vous avez une telle chose, écrivez un article et faites-le moi savoir.

Réduisons le nombre de personnes qui ont la même difficulté!

P.S.

L'auto-apprentissage Netsource est toujours difficile

Recommended Posts

Exécutez JVM-Math-Language comme un projet Gradle à portée de main
Construire un projet Java avec Gradle
Exécuter des tests de projet modulaire dans Gradle (JUnit5 + TestFX)
Exécuter un projet Spring Boot avec VS Code
Exécutez JUnit et Spock dans un projet maven
Conseils Java - Créez un projet Spring Boot avec Gradle
Ajouter un projet dans n'importe quel dossier avec Gradle
Exécutez autossh en tant que service systemd sur CentOS
Comment exécuter l'application SpringBoot en tant que service
Java11: exécuter le code Java dans un seul fichier tel quel