Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.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
Java 关键字是如何以二进制形式表示的?_Java_Assembly_Binary_Computer Science_Keyword - Fatal编程技术网

Java 关键字是如何以二进制形式表示的?

Java 关键字是如何以二进制形式表示的?,java,assembly,binary,computer-science,keyword,Java,Assembly,Binary,Computer Science,Keyword,关键字是如何以二进制形式表示的? 对于java中的ex::如何用二进制表示sin()?sqrt()和其他函数是如何表示的 如果不仅仅用java,用任何语言,它是如何表示的??因为最终一切都被转换成二进制,然后转换成开关信号 提前感谢。sin()是一个函数,因此它表示为代码块所在的内存地址。 关键字(如for)不表示为二进制,例如for被转换为跳转指令列表,这些跳转指令被编译成以二进制表示的汇编指令 我的观点是,您不能将大多数关键字直接转换为二进制。您可以将它们展开为字节码,然后将其转换为本机机器

关键字是如何以二进制形式表示的? 对于java中的ex::如何用二进制表示
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
    将成为Java
    String
    对象

  • 当JVM链接代码时,对
    字符串的引用被解析为对方法的某种引用。(详细信息是特定于实现的。您需要阅读JVM源代码以了解更多信息。)

  • 当代码是JIT编译器时,对方法的引用(通常)会变成JIT编译方法的第一条本机指令在内存中的地址。(严格来说,这不是“汇编语言”。但是本地指令可以表示为汇编语言。汇编语言实际上只是指令的“人性化”文本表示。)



那么,计算机如何知道,当sin被写入时,它必须做一个数字的正弦

发生的事情是Java运行时加载包含该方法的类。然后在它加载的类中查找
sin(double)
方法。通常情况下,命名方法解析为一些字节码,这些字节码是告诉运行时该方法应该做什么的指令。但是在
sin
的情况下,该方法是
本机
方法,并且这些指令实际上是本机指令,是JVM本机库的一部分


如果不是方法,我们能用二进制表示关键字吗??比如int和float等


这取决于实际的关键字。但一般来说,真正的Java关键字由编译器转换成一种形式,这种形式对单个关键字没有明确/离散的表示。

首先,
sin
不是Java中的关键字。它是一个标识符。关键词是类似于
if
class
,等等

这取决于你什么时候询问

  • 在源代码中,
    sin
    标识符表示为字符,这些字符表示为位(即二进制)。。。。如果你想这样看的话

  • javac
    编译器输出的类文件中,单词
    sin
    在常量池中表示为字符串。(JVM规范非常详细地指定了类文件的格式。)

  • 当JVM首次加载类文件时,单词
    sin
    将成为Java
    String
    对象

  • 当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