Java 关键字是如何以二进制形式表示的?
关键字是如何以二进制形式表示的? 对于java中的ex::如何用二进制表示Java 关键字是如何以二进制形式表示的?,java,assembly,binary,computer-science,keyword,Java,Assembly,Binary,Computer Science,Keyword,关键字是如何以二进制形式表示的? 对于java中的ex::如何用二进制表示sin()?sqrt()和其他函数是如何表示的 如果不仅仅用java,用任何语言,它是如何表示的??因为最终一切都被转换成二进制,然后转换成开关信号 提前感谢。sin()是一个函数,因此它表示为代码块所在的内存地址。 关键字(如for)不表示为二进制,例如for被转换为跳转指令列表,这些跳转指令被编译成以二进制表示的汇编指令 我的观点是,您不能将大多数关键字直接转换为二进制。您可以将它们展开为字节码,然后将其转换为本机机器
sin()
?sqrt()
和其他函数是如何表示的
如果不仅仅用java,用任何语言,它是如何表示的??因为最终一切都被转换成二进制,然后转换成开关信号
提前感谢。sin()
是一个函数,因此它表示为代码块所在的内存地址。
关键字(如for
)不表示为二进制,例如for
被转换为跳转指令列表,这些跳转指令被编译成以二进制表示的汇编指令
我的观点是,您不能将大多数关键字直接转换为二进制。您可以将它们展开为字节码,然后将其转换为本机机器码和二进制,但不能直接转换为二进制
在这里,在您理解了它之后,继续讨论字节码是如何转换为本机代码的
关键字和功能
也就是说,Java(和大多数语言)中的关键字是一个保留字,如for
,而或return
,但您的示例不是关键字,它们是函数名,如sin()
和sqrt()
sin()
是一个函数,因此它被表示为代码块所在的内存地址。
关键字(如for
)不表示为二进制,例如for
被转换为跳转指令列表,这些跳转指令被编译成以二进制表示的汇编指令
我的观点是,您不能将大多数关键字直接转换为二进制。您可以将它们展开为字节码,然后将其转换为本机机器码和二进制,但不能直接转换为二进制
在这里,在您理解了它之后,继续讨论字节码是如何转换为本机代码的
关键字和功能
也就是说,Java(和大多数语言)中的关键字是一个保留字,如for
,,而或return
,但您的示例不是关键字,它们是函数名,如sin()
和sqrt()
,首先,sin
在Java中不是关键字。它是一个标识符。关键词是类似于if
,class
,等等
这取决于你什么时候询问
- 在源代码中,
sin
标识符表示为字符,这些字符表示为位(即二进制)。。。。如果你想这样看的话
- 在
javac
编译器输出的类文件中,单词sin
在常量池中表示为字符串。(JVM规范非常详细地指定了类文件的格式。)
- 当JVM首次加载类文件时,单词
sin
将成为JavaString
对象
- 当JVM链接代码时,对
字符串的引用被解析为对方法的某种引用。(详细信息是特定于实现的。您需要阅读JVM源代码以了解更多信息。)
- 当代码是JIT编译器时,对方法的引用(通常)会变成JIT编译方法的第一条本机指令在内存中的地址。(严格来说,这不是“汇编语言”。但是本地指令可以表示为汇编语言。汇编语言实际上只是指令的“人性化”文本表示。)
那么,计算机如何知道,当sin被写入时,它必须做一个数字的正弦
发生的事情是Java运行时加载包含该方法的类。然后在它加载的类中查找sin(double)
方法。通常情况下,命名方法解析为一些字节码,这些字节码是告诉运行时该方法应该做什么的指令。但是在sin
的情况下,该方法是本机
方法,并且这些指令实际上是本机指令,是JVM本机库的一部分
如果不是方法,我们能用二进制表示关键字吗??比如int和float等
这取决于实际的关键字。但一般来说,真正的Java关键字由编译器转换成一种形式,这种形式对单个关键字没有明确/离散的表示。首先,sin
不是Java中的关键字。它是一个标识符。关键词是类似于if
,class
,等等
这取决于你什么时候询问
- 在源代码中,
sin
标识符表示为字符,这些字符表示为位(即二进制)。。。。如果你想这样看的话
- 在
javac
编译器输出的类文件中,单词sin
在常量池中表示为字符串。(JVM规范非常详细地指定了类文件的格式。)
- 当JVM首次加载类文件时,单词
sin
将成为JavaString
对象
- 当JVM链接代码时,对
字符串的引用被解析为对方法的某种引用。(详细信息是特定于实现的。您需要阅读JVM源代码以了解更多信息。)
- 当代码是JIT编译器时,对方法的引用(通常)会变成JIT编译方法的第一条本机指令在内存中的地址。(严格来说,这不是“汇编语言”。但是本地指令可以表示为汇编语言。汇编语言实际上只是指令的“人性化”文本表示形式。)
48 01 F7 48 89 F8 C3
add rdi, rsi
mov rax, rdi
ret
int64_t foo_or_whatever(int64_t x, int64_t y)
{
return x + y;
}
48 = 01001000 encoding REX.W, meaning this instruction is 64bit
01 = 00000001 encoding add rm64, r64 in this case
D1 = 11010001 encoding the operands rdi and rsi
lea rax, [rdi + rsi]
ret