同一个Scala源文件能否编译成包含不同@ScalaSignature注释的类文件?
我有两个类文件,我试图证明它们是从同一个Scala源代码生成的 将类文件反编译成Java后,我得到了两个语义完全相同的Java文件。但是,它们内部有不同的@ScalaSignature注释。在类文件上运行“javap-verbose”时,我得到了以下输出:同一个Scala源文件能否编译成包含不同@ScalaSignature注释的类文件?,scala,Scala,我有两个类文件,我试图证明它们是从同一个Scala源代码生成的 将类文件反编译成Java后,我得到了两个语义完全相同的Java文件。但是,它们内部有不同的@ScalaSignature注释。在类文件上运行“javap-verbose”时,我得到了以下输出: ... SourceFile: "ABC.scala" ScalaSig: length = 0x3 05 00 00 Signature: #140 // <T:Ljava/lang/
...
SourceFile: "ABC.scala"
ScalaSig: length = 0x3
05 00 00
Signature: #140 // <T:Ljava/lang/Object;>Lcom/xyz/ABC;Lscala/ScalaObject;Lscala/Product;
Lscala/Serializable;
RuntimeVisibleAnnotations:
0: #141(#142=s#143)
minor version: 0
major version: 49
flags: ACC_PUBLIC, ACC_SUPER
---
。。。
源文件:“ABC.scala”
ScalaSig:length=0x3
05 00 00
签名:#140//Lcom/xyz/ABC;Lscala/ScalaObject;Lscala/产品;
Lscala/可串行化;
运行时访问说明:
0:#141(#142=s#143)
次要版本:0
主要版本:49
旗帜:ACC_公共、ACC_超级
---
从一个文件和另一个文件:
...
SourceFile: "ABC.scala"
ScalaSig: length = 0x3
05 00 00
Signature: #140 // <T:Ljava/lang/Object;>Lcom/xyz/ABC;Lscala/ScalaObject;Lscala/Product;
Lscala/Serializable;
RuntimeVisibleAnnotations:
0: #141(#142=s#143)
minor version: 0
major version: 49
flags: ACC_PUBLIC, ACC_SUPER
...
。。。
源文件:“ABC.scala”
ScalaSig:length=0x3
05 00 00
签名:#140//Lcom/xyz/ABC;Lscala/ScalaObject;Lscala/产品;
Lscala/可串行化;
运行时访问说明:
0:#141(#142=s#143)
次要版本:0
主要版本:49
旗帜:ACC_公共、ACC_超级
...
这两个类文件是否可能是从同一个Scala源获取的,是否可以使用相同的ScalaSig、签名等进行注释,并且是否可以使用不同的@ScalasSignature注释
谢谢。两个scala源文件可能以相同的字节码结尾(除了sig)。事实上,是sig告诉您原始源文件是不同的。因此,不可能证明两个类文件来自同一个scala源 例如,如果两个类具有相同的方法但具有不同的类型参数,那么您将获得相同的字节码,但不同的SIG 作为一个简单的示例,请查看以下类:
class Foo {
def fn1(t: String) = "" + t
def fn2[T <: String](t : T) = "" + t
}
我还没有看过ASMU的帖子,但在你的位置上,我会询问编译器的版本。特别是如果这些版本中的一些在开发分支中。谢谢佩德罗。。。非常确定没有使用开发分支编译器,只是使用了Scala编译器的不同最终版本。我只提到了开发分支,因为如果您使用trunk,很容易忘记,每次将一些代码提交到编译器中时,您都在处理新的编译器版本。+1对于细节,但是OP的要求正好相反:同一个源文件,经过多次编译,是否可以生成具有不同ScalaSignature的类文件。或者换句话说,编译器中是否存在某种非确定性?特别是Régis,我想知道使用不同版本的maven scala插件或scala-library.jar是否会导致同一个scala源被编译成包含不同@ScalaSignature注释的类文件。对不起,我的帖子不清楚;我并没有想到非决定论,尽管知道是否可以排除非决定论是件好事。@scala_是很棒的,答案是肯定的。不同版本的scala编译器将存储不同的数据。我不知道具体存储了什么,但根据定义它是特定于版本的。我不会指望的,谢谢你,马修!你能不能也排除雷吉斯提出的非决定论?不过,我没有看到任何非决定论。如果Scala编译器版本发生变化,只要编译的Scala代码保持不变,则希望ScalaSignature注释将保持稳定。如果Scala应用程序的代码库的不同部分是用不同的Scala编译器版本编译的,您能评论一下会发生什么吗?它是否会对应用程序的性能产生影响,或者在调试过程中导致问题(例如,断点未命中、意外抛出信号5等)?提前感谢您,很抱歉问了这么多问题。。。让我知道我是否应该发布单独的问题。。。
public java.lang.String fn1(java.lang.String);
Code:
Stack=1, Locals=2, Args_size=2
0: aload_1
1: invokestatic #12; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
4: areturn
LineNumberTable:
line 2: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LFoo;
0 5 1 t Ljava/lang/String;
Signature: length = 0x2
00 12
public java.lang.String fn2(java.lang.String);
Code:
Stack=1, Locals=2, Args_size=2
0: aload_1
1: invokestatic #12; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
4: areturn
LineNumberTable:
line 3: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LFoo;
0 5 1 t Ljava/lang/String;