C 汇编编译器是如何编程的

C 汇编编译器是如何编程的,c,assembly,C,Assembly,不久前我了解到,大多数asm编译器都是用C或其他语言编写的,我们说汇编语言是最快的语言。但是如果它是用C编码的,它怎么能比C本身更快呢?那么编译器做什么呢?ASM中是否有ASM编译器?我真的不明白这一切是如何运作的。。。我在网上搜索过,但我没有清楚地找到我要找的东西。。。 您能给我解释一下或提供一些链接来帮助我更好地理解汇编编译器的概念吗?这里有三个概念: 编译器的速度 处理器的速度 可执行文件的速度 首先,为了避免这种情况,编译某个可执行文件所需的时间与该可执行文件运行所需的时间几乎没有关系。

不久前我了解到,大多数asm编译器都是用C或其他语言编写的,我们说汇编语言是最快的语言。但是如果它是用C编码的,它怎么能比C本身更快呢?那么编译器做什么呢?ASM中是否有ASM编译器?我真的不明白这一切是如何运作的。。。我在网上搜索过,但我没有清楚地找到我要找的东西。。。
您能给我解释一下或提供一些链接来帮助我更好地理解汇编编译器的概念吗?

这里有三个概念:

编译器的速度 处理器的速度 可执行文件的速度 首先,为了避免这种情况,编译某个可执行文件所需的时间与该可执行文件运行所需的时间几乎没有关系。编译器可能需要更长的时间来进行仔细分析和应用优化

处理器的运行速度是另一回事。汇编语言是最接近机器语言的语言,这是处理器所理解的。机器语言中的任何给定指令都将以机器处理该指令的速度运行

根据定义,在处理器上执行的所有内容都必须在某个时候转换为机器语言,以便处理器能够理解和执行它

这就是事情变得棘手的地方。汇编程序会将您编写的代码直接翻译成机器语言,但程序不仅仅是知道如何转换成机器语言。假设您有一个复杂的值,例如一组选项。这些选项必须作为字符串、整数、浮点等进行维护。它们是如何存储的?如何访问它们

所有这些工作的完成方式可能会有所不同。您组织计划的方式可能会有所不同。这些变化会影响可执行时间

所以你可以用汇编语言写一个非常慢的程序,用解释语言写一个非常快的程序。而且,坦率地说,编译器通常比您更善于组织最终的机器代码,即使您直接使用汇编程序

因此,要说明一点:编译器的工作是将文本源代码C、汇编或任何东西转换为机器代码,这是处理器所理解的。一旦完成,就不再需要编译器了


事情远不止这些,但这是总的想法。

为什么这很重要?另一个类比是,如果一个人造了一辆比那辆车还快的车,那么这辆车很可能比这个人能走的快,那么装配是最快的语言就不是这样了。是的,对于简单的事情来说确实如此,但是优化器现在真的很好,现在几乎不可能用手工来做得更好,而对于复杂的事情来说,汇编是非常困难的……换句话说,汇编程序的速度与您在汇编程序中编写的程序的速度完全无关。如果有足够的时间,您可以手工组装代码,结果将与机器组装版本一样快。扩展哈罗德的类比,如果完全相同的汽车是由机器人或人类制造的,那么制造汽车所需的时间,而不是汽车的速度。换句话说,语言并不重要,重要的只是实现?C和汇编编程语言都为目标CPU生成本机代码。所以,如果您在汇编中编写与C编译器从C源代码为特定问题生成的代码相同的代码,比如排序,那么您就拥有相同的机器代码=相同的排序函数性能。但是在汇编语言中,程序员将指令以1:1的比例写入本机代码,因此需要聪明的程序员来生成好的机器代码,而在C语言中,需要聪明的程序员和编译器来生成好的代码。还有解释/JIT语言,它们很少能与本机代码的速度相匹配。好的,谢谢你的回答:我想创建一个好的编译器一定非常复杂……机器语言中的任何给定指令都将以机器处理该指令的速度运行。甚至这也是一种简化。现代CPU是上下文敏感的,缓存和分支预测会影响单个指令的吞吐量和延迟。即使是非内存和非分支指令也会受到周围代码的影响,例如uop缓存或其他前端瓶颈等。当然,性能不是一维的。每个指令都有延迟,x86上的前端带宽要求(以uops为单位),以及它需要哪些执行端口。@MinoTaure:您可能有兴趣深入了解手工编写的asm比编译器生成的asm慢,而不是手工编写的asm在这种情况下如何击败编译器。是的,现代编译器是极其复杂的机器,它们在大多数情况下仍然不能生成真正最优的代码。的确,这篇文章很有趣!T 再次感谢你的回答: