根据Ed Nather的这个了不起的描述,显然它曾经是。今天怎么样?也就是说,是否有可能,对 CPU/FPU/GPU/等有足够的了解。架构,以编写比主流汇编程序(nasm、GAS 等)生成的机器代码更有效的机器代码,在任何情况下?GPU内核怎么样?
编辑:“没有建设性”?请。这个问题产生了@Pointy 的答案,这对于不熟悉汇编程序如何工作的人来说非常有启发性。有人收藏了。Pointy 可爱地是最接近投票者之一的事实是一个很好的接触,但是嘿,如果这是最好的答案,它就会被接受。
根据Ed Nather的这个了不起的描述,显然它曾经是。今天怎么样?也就是说,是否有可能,对 CPU/FPU/GPU/等有足够的了解。架构,以编写比主流汇编程序(nasm、GAS 等)生成的机器代码更有效的机器代码,在任何情况下?GPU内核怎么样?
编辑:“没有建设性”?请。这个问题产生了@Pointy 的答案,这对于不熟悉汇编程序如何工作的人来说非常有启发性。有人收藏了。Pointy 可爱地是最接近投票者之一的事实是一个很好的接触,但是嘿,如果这是最好的答案,它就会被接受。
两件事情:
没有一种叫做“汇编语言”的东西。汇编程序是将特定架构的指令文本编码转换为适合执行的形式的程序。一个特定的汇编器究竟暴露了哪些设施取决于它的设计者。许多 CPU 架构都有多个可用的汇编器。
因为汇编器的工作是为人们提供一种“友好”的方式来请求精确的机器指令序列(以及程序的其他方面,例如初始化的内存位置、保留的存储块、运行时执行程序的指令等) ,如果可以手动生成某个特定的汇编程序无法生成的程序,那么这实际上仅意味着您的汇编程序不合适。英特尔为 iAPX 86 系列开发的汇编器(不是微软的masm,它是一个弱模仿者)有一个相当典型的宏工具,它还有一种“微宏”工具,可以允许操作码助记符字典(事物像MOV
, ADD
,BNE
等) 任意扩展。使用这样的汇编程序,显然可以创建您想要的任何代码。
编程中真正需要关注的话题是,让程序员负责选择一种策略来让计算机完成极其详细的工作,这是否值得提高性能。这个问题当然没有单一的答案,因为有很多可能的情况,很多不同的计算设备,而且主要是因为事情一直在变化。例如,在 1959 年,将 FORTRAN 等高级语言翻译成机器代码的计算任务本身就是计算机的一项重大工作量。对编程语言应该如何工作的理解还处于起步阶段。
那么,今天,了解“机器语言”(并注意“语言”这个词并不准确)的唯一原因是在没有可用(或方便的)汇编程序时创建指令序列。这是假设出于某种原因显式创建特定指令序列比使用高级语言更好。即使那样,通常情况下,如果您现在这样做,您会用某种高级语言编写软件来发出所选指令序列;也就是说,您将有效地为某些任务创建一个“特定于域的汇编程序”。一个很好的例子是虚拟机解释器中的代码,它可以即时构建机器语言块,如 Java 或 JavaScript VM。
汇编器采用汇编语言并将其转换为机器代码。理想情况下,但并非总是如此,汇编语言与机器代码指令具有一对一的关系。 大多数情况下,指令和机器代码的汇编语言语法的翻译将是相同的,无论是汇编程序执行还是手动完成。自然不时会有一些无关位,并且汇编程序和人类可能会选择不同的无关位,因此结果不必是位匹配的位,但在纵向和速度上它们将是相同的,根本没有区别。
人类和汇编程序软件之间的差异(如果有的话)将是汇编语言与机器代码不是一对一的关系,和/或出于各种原因程序员希望汇编程序处理某些事情。这可能是伪指令、宏或与外部定义的变量有关的东西。
汇编语言是一个加载的术语,因为它是由特定的汇编程序定义的,对于同一个处理器,您可以有许多不同且不兼容的汇编语言。并且您可以使用汇编语言,在某些情况下,该语言不能完全描述选择特定指令所需的所有信息,例如对于某些带有一些汇编程序的指令集的远近跳转。
因此,如果您想将苹果与苹果进行比较,则手工组装代码和软件组装代码之间没有区别。苹果对苹果意味着有问题的代码编写得当,不会含糊不清,因此软件和人工组装者可以组装它。如果您确实发现除了无关位之外的差异,那么它可能与与人类汇编程序更改代码有关的优化有关,以使其公平,可以/应该更改匹配的汇编语言以匹配。这种差异与人类与汇编语言的汇编程序无关,而是一个程序员与另一个程序员相比。基本上,您可以/将使用软件汇编器在汇编语言中获得相同的结果。
“根据埃德·纳瑟(Ed Nather)的精彩报道,显然它曾经是。”
我记得几十年前读过这样一个故事。它已经循环了很长时间。
二十一点是一种点缀,但代码在正确的位置退出,并且花了数周时间试图弄清楚它是如何工作的,直到一分钱最终掉下来,这确实敲响了一个非常古老的钟声
一个以非常特定的运行时环境为目标的熟练汇编语言程序员可能会生成比编译器生成的代码运行得更好的代码。根据代码的性质,相对于所需的工作量而言,性能改进可能显着也可能不显着。
另一方面,Java 或 .NET 等框架允许程序员将软件编译为“中间”形式,可以根据需要将其翻译成机器代码,其中包括针对实际运行环境的特定优化。编译为在“任何平台”上运行的代码,当由为其运行的平台手动调整的框架引擎运行时,可能无法像为该平台手动调整的汇编代码那样运行,但比代码更好这是手动调整以优化其他平台上的性能。