当前位置: 首页 > 知识库问答 >
问题:

JIT编译实际上如何在运行时执行机器代码?

焦宏硕
2023-03-14

我在操作系统或编译器优化方面没有深厚的背景,也没有直接使用机器代码,但我开始探索它。我已经开始在assembly中玩了一圈,看看像NASM这样的东西如何将汇编代码编译成机器代码(可执行文件),然后您可以从命令行调用它,比如./my-executable

但是JIT编译器实际上是如何在运行时做到这一点的呢?它是像流机器代码到stdin或什么,或者它是如何工作的?如果您能提供一个示例或一些伪代码,说明一些程序集(或类似的东西,但不像C那样高级)是如何演示基本流的,那也将是令人惊讶的。

共有1个答案

赏高格
2023-03-14

你提到过你玩过汇编,所以你知道它是如何工作的,很好。假设您编写了分配缓冲区的代码(例如:地址为0x75612D39)。然后,您的代码将程序集ops保存到缓冲区,以便从堆栈中弹出一个数字,程序集调用打印函数打印该数字,然后程序集“返回”。然后将数字3推入堆栈,并调用/跳转到地址0x75612D39。处理器将服从指令打印您的数字,然后再次返回您的代码,并继续。在组装层,它实际上非常简单。

我不知道任何“真正的”汇编语言,但这里有一个从我知道的字节码拼凑而成的“示例”。此计算机有2个字节指针,字符串%s位于地址6a,函数printf位于地址1388

void myfunc(int a) {
    printf("%s", a);
}

此函数的程序集如下所示:

OP Params OpName     Description
13 82 6a  PushString 82 means string, 6a is the address of "%s"
                     So this function pushes a pointer to "%s" on the stack.
13 83 00  PushInt    83 means integer, 00 means the one on the top of the stack.
                     So this functhtml" target="_blank">ion gets the integer at the top of the stack,
                     And pushes it on the stack again
17 13 88 Call        1388 is printf, so this calls the printf function
03 02    Pop         This pops the two things we pushed back off the stack
02       Return      This returns to the calling code.

因此,当抖动读入void myfunc(int a){printf(“%s”,a);}时,它为该函数分配内存(例如:地址为0x75612d39),并将这些字节存储在该内存中:13 82 6a 13 83 00 17 13 88 03 02 02。然后,要调用该函数,它只需跳转/调用地址为0x75612D39的函数。

 类似资料:
  • 问题内容: 我最近意识到我不完全了解Java的字符串编码过程。 考虑以下代码: 由于Windows-1252和ISO-8859-1之间的控制字符解释不同,因此我选择了char作为测试对象。 现在,我使用不同的文件编码,UTF-8,windows-1252和ISO-8859-1对其进行编译。两者都编译为完全相同的东西,由验证。 然后,我运行程序: 无论使用哪种编码,它都能正确输出。 好的,它仍然输出

  • 请注意,我的问题是关于JVM解释器,而不是JIT编译器。JIT编译器将java字节码转换为本机代码。因此,这必须意味着JVM中的解释器不会将字节码转换为机器码。因此,问题是:从本质上讲,口译员做什么?如果有人能帮我用一个简单的字节码示例来回答这个问题,相当于1 1=2,即解释器在执行这个加法操作时做了什么?(我的隐含问题是,如果解释器不翻译为机器代码,那么哪个CPU执行添加操作,那么该操作是如何执

  • 以下java代码在eclipse中执行时,给出了正确的输出(即打印出'ClassB'),但根据java规范,代码无法编译(因为超类构造函数需要参数,编译器提供给类B的构造函数包括对超类no arg构造函数的调用,未定义),并且在命令行中尝试使用javac命令编译文件时,只编译超类即类a,失败,出现以下编译错误: 以下是java文件内容: 有人能解释一下eclipse是如何在没有bieng的情况下执

  • 问题内容: 我在一个项目上使用JAXB。JAXB的吸引力在于它与JDK捆绑在一起,我一直在命令行上使用xjc.exe从架构生成.java文件。我似乎找不到JAXB ant任务,请确保在http://jaxb.java.net上有下载,但是我想使用捆绑到JDK中的JAXB,是否有某种方法可以从ant调用JAXB? xjc.exe调用的类? 问题答案: 刚刚在tools.jar中打猎,并在com.su

  • 主要内容:JIT编译器语法,JIT编译器的风险和假设JIT 编译器是用 C++ 编写的,用于将 Java 转换为字节码。现在 Java 10 可以选择启用基于 Java 的实验性 JIT 编译器 Graal 来代替标准的 JIT 编译器。Graal 正在使用 Java 9 中引入的 JVMCI,即 JVM 编译器接口。 Graal 在 Java 9 中也可用。使用 Java 10,我们可以启用 Graal 来测试和调试实验性 JVM 编译器。 JI

  • 问题内容: 当以下Java代码在eclipse中执行时,它会提供正确的输出(即打印“ Class B”),但是根据Java规范,该代码无法编译(因为超类构造函数需要一个参数,并且构造函数由B类的编译器包括对超类no arg构造函数的调用(未定义),并且当尝试在命令行中使用javac命令编译文件时,它仅编译超类(即A类),并因以下编译而失败错误: 以下是java文件的内容: 有人可以解释eclips