gpt4 book ai didi

Java - 如何克服自动生成代码中的最大方法大小

转载 作者:搜寻专家 更新时间:2023-10-31 20:18:26 25 4
gpt4 key购买 nike

我有一个不寻常的要求:我的应用程序从一个很长的脚本(用动态类型语言编写)自动生成 Java 代码。脚本太长了,我打了the maximum method size of 65k of the JVM .

该脚本仅包含有关原始类型的简单指令(除了数学函数外不调用其他函数)。它可能看起来像:

...
a = b * c + sin(d)
...
if a>10 then
e = a * 2
else
e = a * abs(b)
end
...

...转换为:

...
double a = b * c + Math.sin(d);
...
double e;
if(a>10){
e = a * 2;
}else{
e = a * Math.abs(b);
}
...


我克服方法大小限制的第一个想法如下:

  • 将所有局部变量转化为字段
  • 在不同的方法中每 100 行拆分一次代码(如果需要,如果有 if/else block ,可以更长)。

类似于:

class AutoGenerated {

double a,b,c,d,e,....;

void run1(){
...
a = b * c + sin(d);
...
run2();
}

void run2(){
...
if(a>10){
e = a * 2;
}else{
e = a * Math.abs(b);
}
...
run3();
}

...
}

你知道还有其他更有效的方法吗?请注意,我需要代码尽可能快地运行,因为它将在长循环中执行。我不能求助于编译为 C,因为互操作性也是一个问题......

我也非常感谢指向可能对我有帮助的库的指针。

最佳答案

尽管其他人提到了它的缺点,但我们在其中一个项目中使用了类似的方法。我们像 @Marco13 建议的那样从单个启动器方法调用多个生成的方法。我们实际上(非常精确地)计算生成的字节码的大小,并仅在达到限制时才启动一个新方法。我们翻译成 Java 代码的数学公式可以作为 AstTree 获得,我们有一个特殊的访问者,它计算每个表达式的字节码长度。对于这样简单的程序,它在 Java 版本和不同的编译器中是相当稳定的。所以我们不会创建不必要的方法。在我们的例子中,直接发出字节码非常困难,但您可以尝试使用 ASM 或类似库为您的语言执行此操作(当然,这样,ASM 会为您计算字节码长度)。

我们通常将数据变量存储在单个 double[] 数组中(我们不需要其他类型)并将其作为参数传递。这样您就不需要大量的字段(有时我们有数千个变量)。另一方面,与索引高于 127 的字段访问相比,本地数组访问可能需要更多的字节码字节。

另一个问题是常量池大小。我们通常在自动生成的代码中有很多 double 常量。如果您声明了很多字段和/或方法,它们的名称也会采用常量池条目。所以有可能达到类常量池限制。有时我们会碰到它并生成嵌套类来克服这个问题。

其他人也建议调整 JVM 选项。请谨慎使用这些建议,因为它们不仅会影响这个自动生成的类,还会影响所有其他类(我假设其他代码也在您的案例中的同一 JVM 中执行)。

关于Java - 如何克服自动生成代码中的最大方法大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32201074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com