1

Java 構文にいくつかの変更を加えたいと思います。たとえば、演算子「+」を使用してベクトルを追加したいとします。だから私はこのコードが欲しい:

public class Vector2 {
    public float x, y;
    public Vector2(float x, float y) {this.x = x;this.y = y;}
    public String toString() {...}

    public static Vector2 operator+(Vector2 a, Vector2 b) {
        return new Vector2(a.x + b.x, a.y + b.y);
    }

    public static void main(String[] args) {
        Vector2 a = new Vector2(3, 6);
        Vector2 b = new Vector2(2, 8);
        System.out.println(a + b);
    }
}

この標準の Java コードに変換されます。

public class Vector2 {
    public float x, y;
    public Vector2(float x, float y) {this.x = x;this.y = y;}
    public String toString() {...}

    public static Vector2 operator_plus(Vector2 a, Vector2 b) {
        return new Vector2(a.x + b.x, a.y + b.y);
    }

    public static void main(String[] args) {
        Vector2 a = new Vector2(3, 6);
        Vector2 b = new Vector2(2, 8);
        System.out.println(Vector2.operator_plus(a, b));
    }
}

独自のコンパイラを作成するのと同じように、Java 構文を簡単に拡張するための適切で安全な方法はありますか?

(演算子のオーバーロードだけでなく、本質的に Java 構文を拡張するための優れた方法でもあります。)

4

6 に答える 6

6

Java は演算子のオーバーロードをサポートしていないため、その構文が本当に必要な場合は、言語を変更する必要があります。

于 2012-12-12T12:06:54.047 に答える
2

Project Lombokのソース コードを参考にしてください。彼らはかなりクールな変換を行います。

于 2012-12-12T12:18:21.670 に答える
1

それは本当にあなたがしたい拡張機能のタイプに依存します. 関数型言語に典型的な拡張が必要な​​場合は、OOP と関数型パラダイムの両方を組み合わせたscalaを使用できます。あなたの拡張機能は、 AspectJとアノテーションを組み合わせて解決できるかもしれません。最後のリソースでは、プリコンパイラを使用できますが、拡張機能が Java の目的から少し外れていると思われる場合は、現在のニーズに最適な別の言語を使用することを検討してください。

于 2012-12-12T12:34:40.627 に答える
1

あなたはプリプロセッサについて話しています。答えはノーです。Java には言語を拡張する機能がありません。しかし、 MPSを見ることをお勧めします。これは、トランスレータと DSL を作成するためのツールです。ただし、Java 言語 ( video ) を拡張する例がいくつか含まれています。また、MPS の主な利点の 1 つは、IntelliJ IDEA 用のプラグインがあることです。そのため、作成した拡張機能をこの IDE に簡単にアタッチして、シンタックス シュガーとして使用できます。

于 2012-12-12T12:17:34.583 に答える
1

私はこの方法を提案します:

  1. 自分で書くか、簡単にするプリプロセッサを入手してください
  2. 置換は、プリプロセッサを呼び出して一時ファイルを作成するスクリプトを作成します
  3. これらの一時ファイルを Java コンパイラでビルドします
于 2012-12-12T12:37:39.883 に答える
0

Java 文法の範囲内にとどまることができる場合は、注釈プロセッサ(javac プラグイン) を作成して、必要なことを行うことができます。注釈プロセッサは、基本的にコンパイル時に実行される Java コードです。(注釈プロセッサは注釈と関係がある必要がないことに注意してください)

注釈プロセッサのコードでいくつかのハック (基本的にキャスト) を使用すると、javac の内部 AST にアクセスできます。これには、コンパイル時の AST の書き換えが含まれます。

良い紹介: The Hacker's Guide to Javac

プラグインを使用するためにユーザーがしなければならないことは、javac でコンパイルするときにクラスパスに .jar を含めることだけなので、非常に使いやすいです。(おそらく IDE プラグインもやりたいでしょう)

これは、「Java-OO」 javac-plugin が演算子のオーバーロードを Java に追加するために行うことです (演算子のオーバーロードは文法の変更を必要としないため、注釈プロセッサで問題なく動作します)。人気のあるProject Lombokも同様です。


ただし、javac の内部にアクセスするために必要なハックは「文書化されていない/サポートされていない」ため、javac の新しいリリースで動作しなくなる危険性が常にあります。

于 2016-03-17T22:47:48.060 に答える