我认为您没有指定处理器。不同的答案取决于处理器和环境。一般的答案是肯定的,它仍然完成,它肯定不是过时的。一般的原因是编译器,有时它们在一般优化方面做得很好,但对于特定目标却不是很好。有些人在一个目标上非常擅长,而在其他目标上却不太擅长。大多数时候它已经足够好了,大多数时候你想要可移植的 C 代码而不是不可移植的汇编程序。但是您仍然会发现 C 库仍然会手动优化 memcpy 和其他编译器根本无法弄清楚有一种非常快速的方法来实现它的例程。部分原因是这种极端情况不值得花时间让编译器优化,只需在汇编程序中解决它,如果该目标使用 C 如果该目标使用 asm,则构建系统有很多如果该目标使用 C,如果该目标使用 asm。所以它仍然会发生,我认为必须在某些领域永远持续下去。
X86 是自己的野兽,有很多历史,我们正处于这样一个阶段,你真的不能以实际的方式编写一个总是更快的汇编程序,你绝对可以优化特定机器上特定处理器上的例程一天,然后执行编译器。除了某些特定情况外,它通常是徒劳的。有教育意义,但总的来说不值得花时间。还要注意处理器不再是瓶颈,所以一个草率的通用 C 编译器就足够了,在别处找到性能。
其他平台,通常意味着嵌入式、arm、mips、avr、msp430、pic 等。您可能正在运行操作系统,也可能不运行操作系统,您可能运行也可能不运行缓存或桌面具有的其他类似的东西。所以编译器的弱点就会显现出来。另请注意,编程语言继续远离处理器而不是向它们发展。即使在 C 被认为是低级语言的情况下,它也不匹配指令集。总会有一些时候,您可以生成优于编译器的汇编程序段。不一定是您的瓶颈部分,但在整个程序中,您通常可以在这里和那里进行改进。您仍然必须检查这样做的价值。在嵌入式环境中,它可以而且确实决定了产品的成败。
真正的嵌入式是一个拥有专业工程师的专业市场。另一个嵌入式市场,你的嵌入式 linux roku、tivo 等。嵌入式手机等都需要有便携式操作系统才能生存,因为你需要第三方开发人员。所以这个平台必须更像一个桌面而不是一个嵌入式系统。埋在提到的 C 库或操作系统中可能会有一些汇编程序优化,但是对于桌面,您想尝试投入更多硬件,以便软件可以移植而不是手动优化。如果第三方成功需要汇编程序,您的产品线或嵌入式操作系统将失败。
我最担心的是这些知识正在以惊人的速度丢失。因为没有人检查汇编程序,因为没有人用汇编程序编写代码,等等。没有人注意到编译器在生成代码时没有得到改进。开发人员通常认为他们必须购买更多硬件,而不是意识到通过了解编译器或如何更好地编程,他们可以使用相同的编译器将性能提高 5% 到数百%,有时使用相同的源代码。5-10% 通常使用相同的源代码和编译器。gcc 4 并不总是产生比 gcc 3 更好的代码,我保留两者,因为有时 gcc3 做得更好。目标特定的编译器可以(并不总是)围绕 gcc 运行,有时使用相同的源代码不同的编译器可以看到百分之几的改进。这一切从何而来?仍然费心寻找和/或使用汇编程序的人。其中一些人在编译器后端工作。前端和中间当然是有趣和有教育意义的,但后端是你决定或破坏最终程序的质量和性能的地方。即使您从不编写汇编程序,而只是不时查看编译器的输出(gcc -O2 -s myprog.c),它也会使您成为更好的高级程序员并保留其中的一些知识。如果没有人愿意知道和编写汇编程序,那么根据定义,我们已经放弃编写和维护用于高级语言和软件的编译器一般将不复存在。这一切从何而来?仍然费心寻找和/或使用汇编程序的人。其中一些人在编译器后端工作。前端和中间当然是有趣和有教育意义的,但后端是你决定或破坏最终程序的质量和性能的地方。即使您从不编写汇编程序,而只是不时查看编译器的输出(gcc -O2 -s myprog.c),它也会使您成为更好的高级程序员并保留其中的一些知识。如果没有人愿意知道和编写汇编程序,那么根据定义,我们已经放弃编写和维护用于高级语言和软件的编译器一般将不复存在。这一切从何而来?仍然费心寻找和/或使用汇编程序的人。其中一些人在编译器后端工作。前端和中间当然是有趣和有教育意义的,但后端是你决定或破坏最终程序的质量和性能的地方。即使您从不编写汇编程序,而只是不时查看编译器的输出(gcc -O2 -s myprog.c),它也会使您成为更好的高级程序员并保留其中的一些知识。如果没有人愿意知道和编写汇编程序,那么根据定义,我们已经放弃编写和维护用于高级语言和软件的编译器一般将不复存在。前端和中间当然是有趣和有教育意义的,但后端是你决定或破坏最终程序的质量和性能的地方。即使您从不编写汇编程序,而只是不时查看编译器的输出(gcc -O2 -s myprog.c),它也会使您成为更好的高级程序员并保留其中的一些知识。如果没有人愿意知道和编写汇编程序,那么根据定义,我们已经放弃编写和维护用于高级语言和软件的编译器一般将不复存在。前端和中间当然是有趣和有教育意义的,但后端是你决定或破坏最终程序的质量和性能的地方。即使您从不编写汇编程序,而只是不时查看编译器的输出(gcc -O2 -s myprog.c),它也会使您成为更好的高级程序员并保留其中的一些知识。如果没有人愿意知道和编写汇编程序,那么根据定义,我们已经放弃编写和维护用于高级语言和软件的编译器一般将不复存在。c) 它会让你成为一个更好的高级程序员,并且会保留一些这些知识。如果没有人愿意知道和编写汇编程序,那么根据定义,我们已经放弃编写和维护用于高级语言和软件的编译器一般将不复存在。c) 它会让你成为一个更好的高级程序员,并且会保留一些这些知识。如果没有人愿意知道和编写汇编程序,那么根据定义,我们已经放弃编写和维护用于高级语言和软件的编译器一般将不复存在。
以 gcc 为例,编译器的输出是汇编,它被传递给汇编器,汇编器将其转换为目标代码。C 编译器通常不会生成二进制文件。对象组合到最终二进制文件中时,由链接器完成,链接器是另一个由编译器调用的程序,而不是编译器的一部分。编译器将 C 或 C++ 或 ADA 或其他任何东西转换为汇编器,然后汇编器和链接器工具将其完成剩下的工作。动态重新编译器,例如 tcc,必须能够以某种方式动态生成二进制文件,但我认为这是例外而不是规则。LLVM 有自己的运行时解决方案,如果您将其用作交叉编译器,则可以非常明显地显示内部代码到目标代码到二进制路径的高级别的。
所以回到正题,是的,它已经完成了,比你想象的更频繁。主要与不直接与指令集比较的语言有关,然后编译器并不总是产生足够快的代码。如果您可以说在 malloc 或 memcpy 等大量使用的功能上得到数十倍的改进。或者想在没有硬件支持的情况下在手机上拥有高清视频播放器,平衡汇编器的优缺点。真正的嵌入式市场仍然相当多地使用汇编程序,有时全是 C,但有时软件完全用汇编程序编码。对于桌面 x86,处理器不是瓶颈。处理器是微编码的。即使您在表面上制作漂亮的汇编程序,它也不会在所有系列的 x86 处理器上运行得非常快,草率的、足够好的代码更有可能全面运行大致相同的代码。
我强烈建议学习用于非 x86 ISA 的汇编程序,例如 arm、thumb/thumb2、mips、msp430、avr。具有编译器的目标,尤其是具有 gcc 或 llvm 编译器支持的目标。学习汇编程序,学习理解 C 编译器的输出,并通过实际修改输出和测试来证明你可以做得更好。这些知识将有助于使您的桌面高级代码在没有汇编程序的情况下变得更好、更快、更可靠。