我用的Java像6-7岁,然后在几个月前,我发现Groovy中,并开始节省大量的输入..然后我不知道某些事情如何引擎盖下工作(因为常规的表现真的很差),并了解,给你动态类型每一个Groovy的对象是MetaClass处理所有的JVM不能由自己来处理事情的对象.当然,这会在您编写的内容和执行的内容之间引入一层,从而减慢所有内容.
然后有一天我开始得到一些关于Scala的信息.这两种语言在字节码翻译中的比较如何?他们添加到普通Java代码可以获得的正常结构中有多少东西?
我的意思是,Scala是静态类型的,因此Java类的包装应该更轻,因为在编译期间会检查很多东西,但我不确定内部存在的真正差异.(我不是在谈论Scala的功能方面与其他方面相比,这是另一回事)
有人可以开导我吗?
从WizardOfOdds评论好像是得到更少的输入和相同性能的唯一方法是写在翻译的东西中间翻译的Java代码(让的javac编译)不alterating事情是如何执行的,只是增加synctatic糖全无关心语言本身的其他后备.
当你new Object()在Java中执行时,jvm是使用无锁算法来分配内存还是需要锁定?
在这种情况下我指的JVM是Hotspot VM.从我所知道的一点点来看,它只需要增加一个指针以超快地分配内存.但是在多线程的情况下,这种增量是否需要锁定或CAS?
它让我感觉很好(即在编译时间方面),Python解释器将创建字节码.pyc文件.我相信python使用某种哈希来确定源是否已更改然后重新编译.
这对Perl来说是个好主意吗?(关于具有许多依赖性的较大项目等).
这两个指令都使用静态而非动态分派.似乎唯一重要的区别在于invokespecial,作为第一个参数,它总是具有一个对象,该对象是调度方法所属的类的实例.但是,invokespecial实际上并没有将物体放在那里; 编译器负责通过在发射之前发出适当的堆栈操作序列来实现这一点invokespecial.因此,更换invokespecial与invokestatic不应该影响运行栈/堆被操纵的方式-虽然我预计这将导致VerifyError违反规范.
我很好奇制作两个截然不同的指令背后可能的原因.我看了一下OpenJDK解释器的来源,它似乎invokespecial和invokestatic处理几乎相同.有两个单独的指令有助于JIT编译器更好地优化代码,还是帮助类文件验证器更有效地证明某些安全属性?或者这只是JVM设计中的一个怪癖?
我一直在阅读有关新的ruby 2.0功能,并发现它将支持字节码导入/导出:
Ruby 2.0有望简化将预编译的Ruby脚本保存到字节码表示中,然后直接运行它们.
我已经安装了ruby-2.0.0-p0,但是我没有找到任何关于如何导出字节码的信息(或者通常是关于这个问题的文档).此功能是否已实施,如果已实施,我该如何使用它?
我也想知道一些细节.YARV字节码是否应该与平台无关?所有宝石都自动包含在字节码中吗?
根据这篇文章http://slurp.doc.ic.ac.uk/pubs/observing/linking.html#assignment:
由于Java代码和字节码之间的信息不同(字节码不包含局部变量的类型),验证者不需要检查子类型以分配局部变量或参数.
我的问题:为什么字节码不包含局部变量的类型信息,而它确实包含参数和返回值的类型信息?
在进行java代码的性能测试时,您需要测试JIT编译的代码,而不是原始的字节码.要使字节码被编译,必须通过多次执行代码来触发编译,并且还允许后台线程有足够的产生时间来完成编译.
我正在寻找一个可以安全应用于任何现代操作系统的门槛,比如Mac OS或Windows用于开发环境,Linux用于CI /生产.
这是我的源代码:
public class Koray {
public static void main(String [] args) {
System.out.println("This is a sample program.");
}
}
Run Code Online (Sandbox Code Playgroud)
当我编译它时,我得到字节码.当我用十六进制查看器查看字节码时,我看到部分:
19 54 68 69 73 20 69 73 20 61 20 73 61 6D 70 6C 65 20 70 72 6F 67 72 61 6D 2E
Run Code Online (Sandbox Code Playgroud)
可以读作
This is a sample program.
Run Code Online (Sandbox Code Playgroud)
如果字节被解释为字符.
而当我这样做
javap -c Koray.class
Run Code Online (Sandbox Code Playgroud)
我拆开这个课我看到:
Compiled from "Koray.java"
public class Koray {
public Koray();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static …Run Code Online (Sandbox Code Playgroud) 我已经阅读了关于将Scala代码转换为Java代码的问题的答案.它说:
我不认为将scala转换回标准java是可能的,因为Scala做了一些相当低级别的字节码操作.我90%肯定他们做了一些不能完全转换回普通Java代码的东西.
那么Scala语句或代码可以产生无法转换为java的字节码?
PS我通常同意这个答案,但想要一个具体的例子用于学习目的.
我正在尝试自学python字节码是如何工作的,所以我可以通过操作函数的代码来做一些事情(只是为了好玩,而不是用于实际用途)所以我从一些简单的例子开始,例如:
def f(x):
return x + 3/x
Run Code Online (Sandbox Code Playgroud)
字节码是*:
(124, 0, 0, 100, 1, 0, 124, 0, 0, 20, 23, 83)
Run Code Online (Sandbox Code Playgroud)
因此,它是有道理的,我认为124是LOAD_FAST字节码,并且正在加载的对象的名称是f.__code__.co_varnames[0]这里0后是多少124.并100表示LOAD_CONST加载f.__code__.co_consts[1]在那里1是在数字后100.但是有一堆辅助零,比如第二个,第三个和第五个零,似乎没有任何意义,至少对我而言.他们表示什么?
文本字节码:
>>> dis.dis(f)
2 0 LOAD_FAST 0 (x)
3 LOAD_CONST 1 (3)
6 LOAD_FAST 0 (x)
9 BINARY_DIVIDE
10 BINARY_ADD
11 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)
*注意:在Python 3中(字节码可能与上面不同),可以通过以下方式找到字节码:
>>> list(f.__code__.co_code)
[124, 0, 100, 1, 124, 0, 27, 0, 23, 0, 83, 0]
Run Code Online (Sandbox Code Playgroud)