在某种程度上,编写高级代码变得比编写汇编代码更容易、更快。我对这种转变感到好奇——目前全职汇编程序员确实很少见,尽管仍有一些职位空缺。是否发生了行业动荡,导致一些工作一夜之间消失?是否有很多人失业了?

4

  • 二十六
    大多数程序员都乐于学习一门新语言。汇编语言不会在一夜之间“过时”,也不会有一大批未受汇编语言影响的高级语言程序员奇迹般地出现。程序员就是程序员。


    – 

  • 4
    这是基于一个误解。各种级别的语言一直都在被使用。没有所谓的“主流”


    – 

  • 8
    一些汇编程序员成为了编译器编写者。


    – 


  • 2
    语言的运行时系统通常用汇编语言编写。开发、维护或支持运行时系统通常需要汇编语言技能。


    – 


8 个解决方案
8

这不像“当汽车取代马匹时,马夫们的命运如何”。这更像是“当自动变速器越来越流行时,那些修理手动变速器的技工们的命运如何”——他们学会了如何修理自动变速器,但在需要时他们仍然修理手动变速器。

无论如何,汇编语言一直在不断变化。可以说,直到 1964 年 IBM System/360 问世之前,几乎每个重要的新系统都有一种新的汇编语言需要学习。到同一时期,FORTRAN 和 COBOL 已经很成熟,许多其他高级语言也已可用或正在开发中。

在某种程度上,编写高级代码变得比编写汇编代码更容易、更快。

可以说,那是第一批高级语言被开发出来的时期。但是“编写起来更容易、更快”并不是、现在也不是编程语言的唯一标准。如果是的话,汇编语言几十年前就完全消失了。汇编语言仍然有优势:

  • 代码量更小——这在今天不是一个大问题,但在 64k(通常要小得多)还是一个“大”系统的时候,这可是个大问题
  • 快速执行 – 编译器不断改进,但几乎总是有改进的空间。与代码大小一样,如今时钟速度以千兆赫而不是兆赫甚至千赫为单位来衡量,这不再是一个问题。
  • 低级硬件访问 – 使用某些高级语言(例如 C),可以实现低级硬件访问。使用许多其他语言,这要么很繁琐(BASIC PEEK/POKE),要么由于语言/编译器和/或操作系统中内置的刻意安全限制而无法实现。

我写过一些汇编语言(大学期间在大型机上写过一点,之后在 Intel x86 上写过一点),但最近没有。但如果需要的话,我会学习客户项目所需的任何 CPU 的汇编语言。如果我一开始就用汇编语言做所有事情,那么到现在为止,我必须学习几种新语言 – 要么是新 CPU 的汇编语言,要么是高级语言。

如果你还没有读过,你必须读一下

5

  • 5
    即使在编写 C 语言时,如果想要确保生成的代码既不会严重不理想(比相对盲目的翻译器可能生成的代码更糟糕)也不会出现错误,那么了解目标架构的指令集也会很有用。


    – 


  • 1
    可能还有一个非常重要的第三点:库和/或运行时支持。如果只是使用 C 还是汇编语言,那么基本 C 不会带来太大的优势——一旦设置了任一环境。标准 C 提供的那一点点支持在汇编语言中也可用。一旦涉及到额外的库,尤其是为 C 使用而定制的框架,事情就会变得更加困难。在这里,从 C 开始可能会节省相当多的时间——不是因为语言,而是因为随时可用的环境。否则,如果必须首先创建该应用程序特定的环境,那么竞争又开始了。


    – 

  • 5
    顺便说一句,我喜欢第一段:))


    – 

  • 2
    @Raffzahn 反过来也一样 — — 我记得我曾被一个 C 开发系统弄得很沮丧,因为它的库没有提供我需要的操作系统调用和函数的绑定。


    – 

  • 1
    (只是一条评论,因为我没有时间写答案,而且已经有 8 个了:)。不要低估当时事情的简单程度:a) 当时在生产中可用的少数 HLL 按照今天的标准非常简单;b) “软件工程”不存在,没有 OO 设计,没有“设计模式”等等。这两件事加上汇编语言程序员非常接近机器的事实- 比今天的程序员更接近机器!! – 意味着他们在理解当时的简单 HLL 时有一个非常可用的稳定模型可以作为基础。


    – 


我在英国工作过,当时整个 20 世纪 80 年代,汇编程序员都转向使用 C 语言来开发嵌入式系统。总的来说,我们这群编程工程师很快就掌握了几种汇编语言(Z80、6502、6800、68000、PIC),因为我们喜欢学习新语言。

学习 C 语言的过程是循序渐进的。我们中的许多人都是在零散的时间里出于好奇才学习这门语言的,那时我们还没有机会在工作中使用它。我们在使用 C 语言的同时继续支持汇编程序,因此我们在这两种语言上工作了很多年。后来我也学习了 Ada,但研究了所有接触到的编程语言。

当时,我们试图在有限的 CPU 速度下发挥出最大性能,因此效率非常重要。如果只是粗制滥造地编写 C 语言,而不考虑那些功能有限的编译器/优化器生成的汇编指令,那么程序通常会变得太慢和/或太大。您必须真正了解 CPU 如何做到这一点,才能编写出像样且有价值的 C 程序。

如今,与 20 世纪 80 年代/90 年代的部件相比,微控制器几乎总是拥有大量备用功能,而且额外成本极低。这取决于您的目标市场,您是否能负担得起这些额外成本,但现在更容易实现。因此,程序可以效率更低,但仍能完成其工作,这意味着程序员不再那么需要了解其 C 程序生成的 CPU 指令。而且编译器/优化器的质量也得到了显著提升。

2

  • 7
    C 语言是由已经了解汇编语言的程序员设计的,也是为那些已经了解汇编语言的程序员设计的。有 FORTRAN 背景的学生经常发现指针和位操作很难理解。


    – 

  • 3
    @JohnDoty:不幸的是,语言的发展方向被那些根本不清楚是什么让汇编语言所使用的抽象模型变得有用的人所控制。


    – 

到目前为止,观点很好,但有一个尚未提出:

大多数人只是继续进行装配工作。

毕竟,他们所服务的市场并没有消失。不是一夜之间,也不是长期内。大型机环境就是这种情况,因为大型机环境直到今天都非常稳定。这与 COBOL 仍然在大型机上蓬勃发展的原因相同。在这种环境下,新的 Assembly 开发,甚至更大规模的开发,直到 1990 年才开始。通常作为现有环境的一部分,继续使用 Assembly 比经历集成其他语言的麻烦更有效。


此外,这个问题可能基于双重但干预的误解

  • 程序员的工作机会有限,
  • 正在开发高级语言以改进现有的开发

但事实上,这两种说法都不正确。

汇编语言被广泛接受,并被认为非常适合。HLL 的真正用途在于需要比现有数量更多的程序员,并且可以进行培训。早期的两种主要第三代语言 (*1),FORTRAN 和 COBOL,都是为允许每个用户形式化他们的编程需求而开发的,而无需将他们培训为程序员 (*2,*3)。Fortran 只需编写“标准”公式,COBOL 则使用简单的英语来描述业务算法。这样,每个科学家、工程师、职员和经理都能够使用计算机,而无需程序员将他的需求转化为代码。

我们都知道这是怎么回事:接下来对 COBOL 程序员的需求巨大

当然,它们在某种程度上有所帮助,因为它们允许用户转换行业并成为程序员——在投入大量时间之后 (*4)。各种功能强大的类似 3GL 语言,如(商业)BASIC,在小型和后来的微型计算机上进行了同样的尝试,这再次创造了对更多专业程序员的需求。

70 年代末 / 80 年代初出现了大量的,从 Informix 到 ABAP,大肆宣传可以让普通人无需咨询/雇用程序员就可以使用它……但最终还是以同样的方式失败了。

我是否需要提及当今关于人工智能的炒作,它使每个人都能即时编写所需的软件 – 或者至少通过学习“快速生成”让真正的程序员摆脱困境?

让机器自己编程的愿望强烈到足以让历史一遍又一遍地重复。每次迭代都是同样的结果。再加上本应是解决方案的新语言。


*1-机器代码为第一,汇编程序为第二。

*2 – 第三个,ALGOL,以及它的所有后代,都是这个主题的异常值,因为 ALGOL 不注重易于处理,而是注重对基本编程结构的清晰和严格的支持。

*3 — 当然也存在特殊情况,从 APL 一直到 FORTH,但它们是针对非常特殊的应用案例而开发的,更多的是 DSL,而不是通用的。

*4 – 许多人可能还记得某个部门的人编写了一些超级有用的 BASIC/Excel/任何工具,这些工具必须按照管理命令与主系统链接起来。

2

  • 我敢说你仍然可以用这种语言找到工作。


    – 

  • 我知道一些汇编程序员学习 C 语言是因为它开始取代他们的部分工作 – 而且他们的汇编知识通常仍然很重要,因为(尤其是早期)C 语言在性能上并不那么接近汇编语言,而且抽象概念也有泄露。


    – 

这个问题似乎假设一个(优秀的)程序员要么是汇编级程序员,要么是高级语言程序员,而且职位描述需要其中之一。

这不符合我的实际经验。我被雇来做事情。通常,我可以决定实现语言,这个决定不是基于我的偏好,而是基于我对什么是合适的分析。

确实,我已经很久没有(专业地)用汇编语言编写过任何程序了,除了几个选定的例程,但这并没有改变这份工作的性质。专业程序员应该学会使用新工具。我嘲笑那些只雇用已经使用过特定工具的人的职位描述。

“高级语言”的全部意义在于它们应该比汇编语言更容易掌握,而且效率更高。因此,没有理由认为,如果一名已经熟练掌握汇编语言的程序员需要重新学习,那么他很难在市场上立足。

此外,“软件危机”自 20 世纪 60 年代以来一直持续,并且每年都吸引更多的人进入“编程”或与之相关的各种行业。

也就是说,总体趋势一直是朝着劳动力总量扩大的方向发展,因此从来没有出现过大量经验丰富的软件人员虽然想工作但最终却被淘汰的情况。

最后,向高级语言的过渡本身并不是突然的,而是花了几十年的时间,因此整个装配工人从未突然面临重新培训的需求。相反,纯装配行业的入门级工作萎缩了,对于最年长的只具有装配经验的工人来说,在雇主裁员后继续奋斗并留在市场上而不选择退休变得更加困难,就像 COBOL 的情况一样。

可以说,造成这种渐进主义的原因是,即使高级语言已经面世,最大的和最有经验的劳动力仍然是那些懂汇编的人,而他们的培训成本已经沉没了。

因此,如果您要开始一项大型新开发并希望有机会完成它,那么您的选择并不是在语言之间自由选择,而是在 (a) 拥有丰富的汇编语言开发经验的最广泛的劳动力(包括软件经理)和 (b) 范围更窄的劳动力(由选择涉足较不熟悉的新语言和编译器的老手以及年轻且经验不足的人组成)之间进行选择。在特定语言问世后,需要相当长的时间,劳动力市场的平衡才会发生变化。

过渡时间较长的其他原因包括仍有大量已安装的汇编代码需要维护和交互,并且有足够多的特殊情况,其中汇编超出了高级语言和编译器的性能、可靠性或全面可用性,因此多年来汇编仍然被优先用于新的开发。

1

  • 汇编语言和高级语言需要掌握不同的技能;一位汇编语言大师级程序员可能很容易就成为一位高级语言熟练程序员,反之亦然,但这并不意味着其中一种语言就一定比另一种语言难。高级语言是汇编语言生成器,你可以生成的代码比你能编写的代码多得多:在极端情况下,这就像木工和操作制造椅子的机器的人之间的区别,甚至是操作制造制造椅子的机器的机器的人之间的区别。


    – 

我用汇编语言编写了大型机的内存管理器。

然后我编写了 VB 应用程序,它们飞速发展,宏伟壮丽,非常漂亮。我为核工业编写了 3D 图形,这是 PC 上从未有人做过的。我永远不可能用汇编语言做到这一点。

在此之前,我只是一名数据结构编码员。但在 nuc 那里,所有人都是工程师,而不是程序员。我做了这些快速的一次性工作,几乎不费时间(几个月),却为我们赚了大钱

有了所有这些 VB 系统函数,我可以添加数十个无关紧要的演示细节,使程序变得更加精致和专业。摆脱了汇编语言后,我赢得了奖项,成为公司的黑客精英。

一旦被黑客入侵,将无法挽回。

我曾经在 VAX/VMS 操作系统上编写过设备驱动程序。

这是在主流编程已经过渡到高级语言之后。然而,系统编程却没有。VMS 操作系统(可能现在仍然是)主要用 DEC(制造商)发明的一种专用语言编写的。我不记得这种语言的名字了,但它比 C 语言要低级一些。然而,驱动程序是用汇编语言编写的。

汇编语言其实并不难学。难的是编码环境,任何错误都是致命的。如果你幸运的话,当你加载和使用它时系统就会崩溃。如果你不幸的话,它会导致损坏,在几秒/几分钟/几天后系统就会崩溃!

因此我预计答案是优秀的汇编程序员成为系统内部程序员,而不太优秀的汇编程序员则学习高级语言。

第三种可能性是,他们继续“下坡”转向没有 C 编译器的小型系统。编程电视遥控器或带软按钮的键盘。或者,现在,甚至是手电筒。一位同事曾经从 PDP11 小型计算机转向那些新奇的微处理器。一直到今天,您拥有像 PIC10F200 这样的东西,它具有 256 个字的 EPROM 程序存储空间和全部 16 字节的 RAM。我认为这足以编程一个手电筒来执行亮/暗/闪烁/关闭,但不使用 C。。这些六条腿和八条腿的野兽今天只需几分钱。

我退休后可能会找个理由去摆弄这些东西。

2

  • 1
    可能是您正在考虑的语言。


    – 

  • 1
    早期的 VMS 主要是用 VAX MACRO(基本上是 VAX 汇编)编写的,正如@LAK 提到的,BLISS 中也有一些。


    – 


在使用 C 语言编程时,了解目标平台的机器架构并能够判断编译器是否以合理高效且满足应用程序要求的方式处理代码通常很有用。商业编译器中的代码生成错误很少见,但确实会发生,并且如果不检查生成的代码,则无法诊断出其症状。例如,在 1990 年代,我使用过 68000 系列的编译器,它有时会错误地将堆栈指针调整 65,536,这不会影响错误函数的行为,但会破坏其调用者的堆栈框架。不懂 68000 汇编语言的人根本无法发现这个问题。

虽然免费编译器的维护者坚持认为标准允许他们以“有趣”的方式处理代码,但我怀疑任何无法阅读 ARM-Cortex M0 汇编代码的人都无法弄清楚如下函数:

uint16_t test(uint16_t *p)
{
  uint16_t temp = *p;
  return temp - (temp >> 15);
}

*p可能会返回 65535,即使某些外部进程在执行期间改变了其值。