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

机器码和目标码在哪些情况下生成?

袁山
2023-03-14
    null

有人能解释一下目标代码和机器代码这两个概念之间的区别吗?这些是在哪些情况下产生的?

共有1个答案

何甫
2023-03-14

不同的编译器工具链做不同的事情。正如在对您最初问题的注释中所讨论的,一些编译器将源代码直接转换为机器代码,而另一些编译器将源代码转换为汇编代码(作为中间表示),然后通过汇编器运行该汇编代码以生成机器代码。我的经验主要是使用做前者的编译器,但Peter Cordes正确地指出GCC做后者。实际的实现大多是无关紧要的,除非您正在处理编译器本身。任何一个都将产生正确的结果,并且都不会对使用编译器的人产生任何相关的影响。

实际上,在这两个模型之间还有另一个概念上适合的替代方案。Clang(更具体地说,LLVM)就是一个例子。它将源代码编译成中间语言,但它不使用特定于体系结构的汇编语言作为中间表示,而是使用IR(中间表示)。事实上,这是LLVM编译模型的一大创新。该工具链分三个阶段实现:前端将源代码解析为IR代码,优化器对IR代码进行优化传递,后端将IR代码转换为特定CPU的机器代码。

这种设计允许为各种源语言编写各种前端,以及针对任何CPU的各种后端。然而,位于中间的优化器在所有情况下都是相同的,因为它处理的是始终相同的中间IR代码。

顾名思义,机器代码是特定于机器的。机器码的x86将只运行在x86处理器上;ARM机器码只在ARM处理器上运行;等等。

这是由编译器作为输出的最后阶段生成的。它生成一个目标文件,其中包含目标代码,而目标代码实际上只是打包到目标文件中的机器代码。然而,目标文件通常不仅仅包含机器代码--它们还包含内部和外部符号的表、常量数据、调试信息等。链接器在从这些目标文件生成最终的可执行映像时会使用所有这些。

虽然您没有特别询问它,但汇编代码只是机器代码的人类可读形式。机器代码是二进制格式,可以由处理器直接执行,而汇编代码使用助记符,程序员更容易读写。例如,在x86上,目标代码可能包含字节0x74,但在汇编语言中,这将由助记符je表示(或者等效地,jz)。汇编程序是将汇编语言助记符转换成二进制机器代码的程序。

 类似资料:
  • 问题- 蒙克喜欢在数组上预制不同的操作,因此作为哈克地球学校的校长,他给他的新学生米什基布置了一个任务。Mishki将被提供一个大小为N的整数数组A和一个整数K,在这里她需要将数组向正确的方向旋转K步,然后打印结果数组。由于她是新来的,请帮助她完成任务。 输入: 第一行将由一个表示测试用例数的整数T组成。对于每个测试用例: 第一行由两个整数N和K组成,N是数组中的元素数,K表示旋转的步数。 下一行

  • 远程类加载是指加载未在执行位置显示的类。 例如,JavaApplet需要将类从服务器加载到本地并在本地执行。 一些包含URLClassLoader的程序需要从网络加载类,并在本地执行。 RMI怎么样?我找到了一个名为RMIClassLoader的类?是远程类加载吗?

  • 问题内容: 该函数将与关联的终结器设置为。 默认情况下会终结哪种对象? 默认情况下终结那些对象会导致哪些意外陷阱? 问题答案: 默认情况下,完成以下对象: os。File:当对象被垃圾回收时,文件自动关闭。 os。流程:完成将释放与流程相关的任何资源。在Unix上,这是空操作。在Windows上,它关闭与进程关联的句柄。 在Windows上,程序包似乎可以自动关闭网络连接。 除了上述对象之外,Go

  • 我想知道Java中的一些情况(或者更广泛地说:在编程中),在布尔表达式中,使用无条件的()而不是条件版本()是可取的。 我知道它们是如何工作的,但我无法考虑使用单个是否值得。

  • 本文向大家介绍vue边界情况有哪些?相关面试题,主要包含被问及vue边界情况有哪些?时的应答技巧和注意事项,需要的朋友参考一下 @Yanhua67 https://cn.vuejs.org/v2/guide/components-edge-cases.html

  • 本文向大家介绍栈溢出有哪些情况?相关面试题,主要包含被问及栈溢出有哪些情况?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 1)、局部数组过大。当函数内部的数组过大时,有可能导致堆栈溢出。 2)、递归调用层次太多。递归函数在运行时会执行压栈操作,当压栈次数太多时,也会导致堆栈溢出。3)、指针或数组越界。这种情况最常见,例如进行字符串拷贝,或处理用户输入等等。