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

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(使用前将#替换为@)

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

  • 安装 Ta-lib 会产生 gcc 错误

    当我尝试在我的 mac 上将 Ta lib 作为全局包安装时 出现 gcc 错误 我收到以下错误 gcc Wno unused result Wsign compare Wunreachable code DNDEBUG g fwrapv
  • 编译器在函数名称前添加下划线前缀的原因是什么?

    当我看到 C 应用程序的汇编代码时 如下所示 emacs hello c clang S O hello c o hello s cat hello s 函数名称以下划线作为前缀 例如callq printf 为什么这样做以及它有什么优点
  • malloc和gcc优化2

    while count lt 30000000 malloc 24 count 上面的代码在我用 gcc O0 编译的计算机上运行大约需要 170 毫秒 但是 使用 Ox 其中 x gt 0 进行编译时 优化器会巧妙地发现所请求的内存永远不
  • 将代码拆分为多个 .cpp 会减少编译时间吗?

    假设我正在处理一个相当复杂的课程 一半的方法已经完成并经过测试 但我仍在开发另一半 如果我将完成的代码放在一个 cpp 中 将其余代码放在另一个 cpp 中 那么当我仅更改 正在进行的 cpp 中的代码时 Visual Studio 或任何
  • 如何编译而不将警告视为错误?

    问题在于 在 Windows 上编译良好的相同代码无法在 Windows 上编译Ubuntu https en wikipedia org wiki Ubuntu 28operating system 29 每次我收到此错误时 cc1 警告
  • 编译器之间的重载分辨率不同

    我构建了以下我的问题的最小示例 include
  • 如何使用现代 GCC 抑制“-fpermissive”错误?

    我正在尝试编译一些不合格的代码C 17 https en wikipedia org wiki C 2B 2B17 但我遇到了以下问题 pragma GCC diagnostic push pragma GCC diagnostic ign
  • C++x0 unique_ptr GCC 4.4.4

    我正在尝试使用 C x0 中的 unique ptr 方法是 include
  • 在 '*' 标记之前编译“错误:预期 ')' 时出现多个相同错误

    我正在尝试用 C 语言编程 当我使用以下参数进行编译时 gcc D BSD SOURCE Wall ansi pedantic g tokenizer c FileOccur c WordList c wordstat c indexer
  • 全局变量在函数调用之间是否刷新?

    我正在编写嵌入式固件 发现有时很难决定何时需要易失性 当我有一个等待中断更改某个布尔标志的函数时 很明显该标志需要是易失性的 因为否则该函数将永远等待 因为编译器没有意识到该值可以通过打断 但是 当我有一个只检查第一行中的标志的短函数时 我
  • 学习在 Xcode 中编译 C++

    我已经开始在学校广泛使用 C 现在我的程序已经达到了拥有超过 1 个文件 即头文件 驱动程序 实现文件 的地步 我对软件开发了解不够 无法通过查看苹果的指南来理解或掌握如何设置构建过程 有人可以指导我如何在 xcode 中编译一个带有头文件
  • 为什么我的多线程 C 程序在 macOS 上无法运行,但在 Linux 上却完全正常?

    我用 C 语言编写了一个多线程程序 使用 pthreads 来解决 N 皇后问题 它使用生产者消费者编程模型 一位生产者创建所有可能的组合 一位消费者评估该组合是否有效 我使用一个共享缓冲区 一次可以保存一个组合 一旦我有 2 个以上的消费
  • 从内存加载动态库

    是否可以从内存而不是从 mac gcc 上的文件系统加载库 在 Windows 中 我使用 MemoryModule 但它显然不跨平台兼容 首先 要做到这一点 我建议您阅读OS X ABI 动态加载器参考 https developer a
  • 与 SSE 比较 16 字节字符串

    我有 16 字节的 字符串 它们可能更短 但您可能会假设它们在末尾用零填充 但您可能不会假设它们是 16 字节对齐的 至少不总是 如何编写一个例程将它们与 SSE 内在函数进行比较 是否相等 我发现这个代码片段可能会有帮助 但我不确定它是否
  • 在 gcc 中强制执行 C++98 标准

    我有一项学校作业应该用符合 C 98 的代码编写 我怎样才能强迫g 仅接受遵循此标准的代码 将要 std c 98做这个技巧还是我需要添加额外的标志 Per GCC 标准文档 http gcc gnu org onlinedocs gcc
  • 由于符号链接错误,无法在 Mac OSX 10.8.1 中安装 ruby​​-1.9.2

    首先 我尝试了常见的rvm安装 rvm安装1 9 2 但是 显示了以下错误 The provided compiler usr bin gcc is LLVM based it is not yet fully supported by r
  • 与 glib-2.0 链接时,cygwin gcc 4.3 中的参数顺序很重要

    我正在尝试使用 cygwin 编译适用于 os x 和 linux 的代码 然而 我发现 gcc 的参数顺序给出了意想不到的结果 例如 以下情况会失败 gcc std gnu99 I usr include glib 2 0 I usr l
  • gcc 没有小字符串优化吗?

    Most std string实现 包括 GCC 使用小字符串优化 例如 有一个answer https stackoverflow com a 21710033 2640636讨论这个 今天 我决定检查我编译的代码中的字符串在什么时候被移
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么

随机推荐

  • 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 个不同的操作系