繁体   English   中英

JVM如何区分Scala字节码和Java字节码?

[英]How JVM distinguish between Scala bytecode and Java bytecode?

因为Scala还生成字节码并由JVM执行。 我想知道JVM如何区分Scala字节码和Java字节码。 有人可以解释一下吗?

 Scalac Myprogram.scala
 java Myprogram

所以这句话完全没问题?

我想知道JVM如何区分Scala字节码和Java字节码。

它没有。 没有Scala字节码这样的东西。 Scala编译器编译为JVM字节码。 就像Java编译器也编译为JVM字节码一样。

JVM对Scala一无所知。 它对Java也一无所知。 它也不知道有关Groovy,Clojure,Kotlin,Ceylon,Fantom,Ruby,Python,ECMAScript或任何其他约400种编程语言的内容,这些语言在JVM上有实现。

JVM只知道一种语言:JVM字节码。

请注意,这与任何其他计算机(虚拟或非虚拟)没有什么不同。 CLR只知道CIL,它对C#,VB.NET或F#一无所知。 英特尔酷睿CPU只知道AMD64和x86机器代码,它对C,C ++,Objective-C,Swift,Go,Java,Python一无所知。 CPython VM只知道CPython字节码,它对Python一无所知。

它没有。 Scala编译为与Java相同的字节码。

scalacjavac生成字节码。 JVM并不关心字节码是如何产生的,它与JVM完全相同。

但是, scalajava以不同的方式设置引导CLASSPATH,因此如果您的代码包含Scala运行时库调用,并且很可能,它需要由scala而不是java运行。

可以使用java手动设置启动CLASSPATH,如果你必须这样做,但为什么要经过所有额外的工作,当scala会为你做这件事?

一张图片胜过千言万语

Scala运行时

Scala编译为普通的Java字节码,因此JVM似乎没有任何区别。 Java所具有的Scala的额外功能是通过编译时传递和运行时辅助函数的组合来实现的。 如果你反汇编生成的Scala类,你可能会看到很多调用Scala运行时的东西,比如装箱和拆箱参数。

在执行者的观点中,标准中定义的字节代码是相同的。 但是当您使用调试器时,需要更多信息来匹配正确的语言和源文件。

指示生成JVM字节码的源代码的唯一方法是通过可选的类属性SourceFile (来自Java 1.0.2)和SourceDebugExtension (来自Java 5.0)。 https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.7.10和11

附加信息将给出源LineNumberTable各种对象的行号,这也是可选的。 https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.7.12

您可以找到其他JVM规范的等效项。

IDE使用它们来获取JVM类的上下文,但它们是可选值,调试信息取决于编译器。

所以它可以是一个知道编译器是什么的信息,但你不能依赖它作为确定的信息。 如果已定义,则应该在编译器定义中。

使用scalac,您可以使用-g选项切换信息存储,与javac相同,除了Java不管理TCO的notc

g:{none,source,line,vars,notc} "none" generates no debugging info, "source" generates only the source file attribute, "line" generates source and line number information, "vars" generates source, line number and local variable information, "notc" generates all of the above and will not perform tail call optimization.

默认line

要使ClassLoader从类文件中检索信息,您可以使用开源库ASM: http//asm.ow2.org/

您也可以自己解析类文件或内部存储,检索类属性并不是很困难。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM