为什么Truffle DSL在添加@Specialization注解时会报错?

Why does Truffle DSL makes an error when adding @Specialization annotations?

我正在尝试将 Truffle 框架实现到现有语言 (INI) 中,并且我设法 运行 具有基本功能和 Truffle 的语言。但是,当我尝试向我的方法添加 @Specialization 注释时,编译器崩溃并输出此消息:

src/main/java/ini/eval/function/PrintFunction.java:[17,17] Not enough child node declarations found. Please annotate the node class with addtional @NodeChild annotations or remove all execute methods that do not provide all evaluated values. The following execute methods do not provide all evaluated values for the expected signature size 1: [executeGeneric(VirtualFrame), executeNumber(VirtualFrame), executeBoolean(VirtualFrame), executeChar(VirtualFrame), executeString(VirtualFrame)]

但是,当我删除 @Specialization 注释时,它工作正常

这是我唯一设置专业化的 class :

@NodeInfo(shortName = "print")
@GenerateNodeFactory()
public abstract class PrintFunction extends BuiltInExecutable {

    public PrintFunction(IniParser parser, String name, String[] parameterNames) {
        super();
    }

    private static final PrintStream out = System.out;

    @Specialization
    public Number print(Number value) {
        doPrint(value);
        return value;
    }

    @TruffleBoundary
    private static void doPrint(Number value) {
        out.print(value);
    }

    ... More specializations for other types (boolean, and String)

    @Specialization
    public Object print(Object value) {
        doPrint(value);
        return value;
    }

    @TruffleBoundary
    private static void doPrint(Object value) {
        out.print(value);
    }
}

所有节点(AstElement)的superclass有方法executeGeneric(VirtaulFrame)和executeNumber、executeBoolean、executeChar和executeString。所以 class PrintFunction 也有这些方法

那么,您认为导致错误消息的真正原因是什么,或者至少是什么意思?

我从使用 Truffle 实现的 Mumbler Language 和 SimpleLanguage 中获得灵感。

我从 Graal Slack 上的一位伟人那里得到的答案

value 需要来自某个地方。 Truffle 希望您有一种表达形式作为打印函数的子节点。标准方法是在 class 定义中添加类似 @NodeChild(value = "receiver", type = ExpressionNode.class) 的内容 Stefan Marr 等了 10 分钟 如果 value 不应来自子节点,即子节点,您可以改为定义抽象 execute(Object value) 方法,DLS 将使用特化

为您实现该方法