Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
同一个Scala源文件能否编译成包含不同@ScalaSignature注释的类文件?_Scala - Fatal编程技术网

同一个Scala源文件能否编译成包含不同@ScalaSignature注释的类文件?

同一个Scala源文件能否编译成包含不同@ScalaSignature注释的类文件?,scala,Scala,我有两个类文件,我试图证明它们是从同一个Scala源代码生成的 将类文件反编译成Java后,我得到了两个语义完全相同的Java文件。但是,它们内部有不同的@ScalaSignature注释。在类文件上运行“javap-verbose”时,我得到了以下输出: ... SourceFile: "ABC.scala" ScalaSig: length = 0x3 05 00 00 Signature: #140 // <T:Ljava/lang/

我有两个类文件,我试图证明它们是从同一个Scala源代码生成的

将类文件反编译成Java后,我得到了两个语义完全相同的Java文件。但是,它们内部有不同的@ScalaSignature注释。在类文件上运行“javap-verbose”时,我得到了以下输出:

...
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;