编译器实际上会生成机器代码吗?

2024-01-07

我一直在读到,在大多数情况下(如 gcc),编译器以高级语言读取源代码并吐出相应的机器代码。现在,机器代码的定义是处理器可以直接理解的代码。因此,机器代码应该仅依赖于机器(处理器)且独立于操作系统。但这种情况并非如此。即使 2 个不同的操作系统在同一处理器上运行,我也无法在这两个操作系统上运行相同的编译文件(对于 Windows 为 .exe,对于 Linux 为 .out)。

那么,我错过了什么? gcc 编译器(和大多数编译器)的输出不是机器代码吗?或者机器代码不是最低级别的代码,操作系统将其进一步转换为处理器可以执行的一组指令?


你混淆了一些事情。我的可重定向编译器(如 gcc 和其他通用编译器)将文件编译为对象,然后链接器稍后根据需要将对象与其他库链接起来,以生成所谓的二进制文件,然后操作系统可以读取、解析、加载可加载块并开始执行。

理智的编译器作者将使用汇编语言作为编译器的输出,然后编译器或用户在其 makefile 中调用创建对象的汇编器。这就是 gcc 的工作原理。以及 clang 的工作方式,但 llc 现在可以直接制作对象,而不仅仅是组装的组件。

生成可生成原始机器代码的可调试汇编语言更有意义。您确实需要一个像 JIT 这样的充分理由来跳过这一步。我会避免直接进入机器代码的工具链,因为它们可以,但它们更难维护,并且更有可能出现错误或需要更长的时间来修复错误。

如果架构相同,那么您就没有理由不能使用通用工具链为不兼容的操作系统生成代码。例如,gnu 工具就可以做到这一点。操作系统差异不是在机器代码级别定义的,大多数是在高级语言级别的 C 库,您可以创建 GUI 窗口等,与机器代码或处理器架构无关,对于某些操作系统来说是相同的操作系统特定的 C 代码可以在 mips、arm、powerpc 或 x86 上使用。架构变得具体的是调用实际系统调用的机制。经常使用特定的指令。机器代码最终会被使用,但没有理由不能在实际或内联汇编中进行编码。

然后这导致库,甚至 fopen 和 printf 这些通用 C 调用最终也必须进行系统调用,因此库支持代码可以采用跨系统兼容的高级语言,因此需要一个系统和架构最后一英里的特定代码。您应该在 glibc 源代码中看到这一点,或者在其他库解决方案中挂钩到 newlib 中。作为例子。

对于 C++ 等其他语言也是如此。解释型语言具有额外的层,但它们的虚拟机只是位于相似层上的程序。

低级编程并不意味着机器语言或汇编语言,它只是意味着您使用的任何编程语言都可以在较低级别进行访问,例如应用程序下方或操作系统下方等......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编译器实际上会生成机器代码吗? 的相关文章

随机推荐

  • ionic v3 中的自定义组件

    我想创建一个简单的组件并将其包含在页面上 我用它创建了ionic g component my header ionic cli v3 beta 修复了IonicPageModule bug 然后添加到另一个页面 然后我得到这个错误 Err
  • 我应该多久关闭一次数据库连接?

    目前 我正在应用程序的初始化中打开数据库连接 这是一个相当小的应用程序 PHP 如果相关的话 我是否应该连接到数据库 进行调用 然后关闭并为我编写的每个数据库函数重复此过程 例如 我有以下函数 它从我的应用程序的初始化中获取 db 变量 f
  • 导入错误:Linux Ubuntu 上没有名为 sceneDetect 的模块

    我正在尝试在 python 上使用 pysceneDetect 库来播放视频 但在使用 python 界面时出现此错误 并且在使用命令行界面时出现错误 ModuleNotFoundError 没有名为 cv2 的模块 即使我相信我根据文档正
  • 如何使用我的实体框架代码忽略 DbUpdateConcurrencyException?

    有什么方法可以告诉 EF 不要担心行数DELETE or UPDATE做还是不做 我试图从数据库中删除一行 但由于该行不存在 EF 抛出异常 DbUpdateConcurrencyException 说0 行受到影响 这是正确的 gt 没有
  • 在 Woocommerce 中选择的运输方式更改时显示或隐藏 html 元素

    我正在尝试根据所选的运输方式显示 隐藏结账页面中的一些元素 我试图显示 隐藏的页面元素来自另一个插件 因此我尝试更改它们的显示属性 我看过很多线程 例如 根据 Woocommerce 3 中的运输方式显示或隐藏结帐字段 https stac
  • C++ STL 迭代器接口

    我知道STL库使用不同类型的迭代器来遍历他的容器 输入 输出 正向 双向和随机访问 我还知道迭代器抽象了经典的 C 指针接口 因此迭代器类必须具有 运算符等 以充当指针 每种迭代器的接口是否都以某种规范编写 这个接口只是 STL 库中使用的
  • 在 os.path.isfile() 中使用通配符

    我想检查一下是否有 rar目录中的文件 它不需要是递归的 使用通配符os path isfile 这是我最好的猜测 但它不起作用 那我能做什么呢 glob http docs python org library glob html就是你所
  • float 到 int 意外行为

    您能解释一下这个程序的 O P 行为吗 int main float a 12 5 printf d n a printf d n int a return 0 您可以检查一下代码吗http codepad org AQRlAzkC htt
  • 是否可以按插入/访问的顺序迭代番石榴缓存?

    我正在尝试使用 Guava Cache 作为替代品并发链接哈希映射 https code google com p concurrentlinkedhashmap 然而我发现 虽然 ConcurrentLinkedHashMap 允许我按插
  • List 为何不实现 Add(object value)?

    我认为这是相当愚蠢的 我有点不好意思问这样的问题 但我仍然找不到答案 我正在看班级List
  • 在黑色和蓝色之间切换 NSToolbarItem

    我想制作一个带有自定义图像的 NSToolbarItem 该图像在黑色和蓝色之间切换 就像 Xcode 5 主窗口右上角的图标一样 Peter Hosey 在这个答案中建议 这就像将图像设置为模板一样简单 https stackoverfl
  • 更改应用程序主题后,材质组件主题对话框按钮变得浮肿

    今天我正在尝试新的材质组件 其安装的一部分是您需要更改应用程序的父级以从 Theme MaterialComponents 继承 所以我这样做是因为我想使用具有更好波纹的底部导航 但在那之后 应用程序中的几乎所有按钮都变得更加浮肿 我应该怎
  • javascript osc 库?

    是否存在用于 JavaScript 的开放声音控制库 我似乎找不到任何这方面的信息 在我的客户端实现KievII http kievii net index html图书馆 这是一个链接code https github com janes
  • 在 Python 中使用 lambda

    我正在尝试使用 lambda 对列表进行排序 我想做的是根据坐标与初始位置的曼哈顿距离对坐标进行排序 我知道我已经掌握了大部分语法 但似乎我遗漏了一些小东西 谢谢 while len queue gt 0 queue sort queue
  • Django:在 Django Admin 中过滤或显示模型方法

    我有一个带有到期日期字段的模型 我想设置一个管理过滤器 允许用户在 未过期 和 任何 之间切换 模型方法是相当简单的日期比较 没问题 然而 在 AdminForm 中将其分配为字段或过滤器参数并不是自动的 这样的事情可能吗 如果不可能 明智
  • OpenCV:如何使用5点算法根据来自不同相机的两个图像之间的特征匹配来计算基本矩阵?

    基本上我想做与此功能相同的事情 https docs opencv org master d9 d0c group calib3d html ga13f7e34de8fa516a686a56af1196247f https docs ope
  • HTML5 / js - 如何为两个坐标之间的直线设置动画?

    足够简单的问题 可能是错的 我希望使用 HTML5 和 或 Jquery 在直线上的两点之间制作动画 ctx beginPath ctx moveTo 0 0 a ctx lineTo 100 100 b ctx stroke http j
  • 如何设置QGraphicsScene/View到特定的坐标系

    我想在a中绘制多边形QGraphicsScene但多边形具有纬度 经度位置 在等距柱状投影中 坐标来自 90 180 gt 180 90 我怎样才能设置QGraphicsScene QGraphicsView这样的预测 非常感谢 Carlo
  • 使用 Google App Engine Blobstore 下载的文件名

    我正在使用 Google App Engine Blobstore 来存储一系列文件类型 PDF XLS 等 并尝试找到一种机制 通过该机制可以使用上传文件的原始文件名 存储在 blob info 中 来命名下载的文件 即用户在保存对话框中
  • 编译器实际上会生成机器代码吗?

    我一直在读到 在大多数情况下 如 gcc 编译器以高级语言读取源代码并吐出相应的机器代码 现在 机器代码的定义是处理器可以直接理解的代码 因此 机器代码应该仅依赖于机器 处理器 且独立于操作系统 但这种情况并非如此 即使 2 个不同的操作系