需要理解的是,汇编(或者编译)的过程是不一定需要由计算机来完成的。人类设计的最早的电子计算机的计算过程是由电缆的插拔来实现的,后来为了方便操作人们开始使用纸带来实现对计算机的计算过程的抽象,这里纸带上所记录的内容我们就可以理解为机器语言,机器语言本身是机器的指令,可以实现对计算机的直接控制。

一段时间之后,人们觉得直接写机器指令实在是太过于繁琐和低效。所以人们就把机器指令进行总结和分类,把机器指令分为计算、跳转、复制等等的类别,之后给每个分类冠以相应的伪码。这样一来,程序员就不再需要直接手写机器指令,整个编码过程分为如下三步:

  • 用汇编指令(即伪码)书写程序;
  • 人工的把写好的汇编代码翻译成相应的机器指令;
  • 再把机器指令输入到计算机中让计算机执行;

点击这个链接可以看到人们是如何在纸上书写汇编语言的。

汇编语言极大地提高了程序员的开发速度,因为相比于毫无意义的机器指令,汇编语言更容易让人理解,开发起来也就更加的容易。

人类的需求是没有止境的。一段时间之后,人们觉得每次都是人工的把汇编语言翻译成机器指令,这样既繁琐也容易出错,而且这种翻译本质上是十分机械的工作。所以人们开始尝试用现有的汇编语言写一个汇编器,这个汇编器可以使用计算机来自动的把汇编语言转化为机器语言。

到这里我们就明白了,世界上第一个汇编器并不是由机器指令写的,它本身是由汇编语言写的。在第一个汇编器实现了之后,后面的汇编语言就都可以使用这个汇编器来实现汇编了。需要注意的是,这个汇编器只能支持某一个特定类型的计算机。不论是汇编器本身的执行还是汇编器工作时汇编语言到机器指令的转化,它们都及其依赖于目标机器的指令集。

不过,在之后每当有拥有新的指令集的计算机被设计出来之后,我们可以在已经拥有汇编器的计算机上实现新的指令集计算机的汇编器,新的指令集的编码过程分为如下三步:

  • 设计新指令集的汇编语言,使用该汇编语言书写程序;
  • 在旧的指令集计算机上实现新指令集的汇编器,使用汇编器对汇编语言进行汇编得到机器指令;
  • 在新的指令集计算机上执行机器指令;

当然,即使是新指令集的计算机你也可以像最早的那样手动的去实现一个汇编器,没有任何问题。

到这里我们就发现了,汇编语言的汇编器是独立于计算机的,它的目的在于转化而非执行,而在这里转化的载体是人还是机器或者说是什么样的机器其实并不重要。

顺便说一下,计算机科学本身是来自于数学的,个人认为这主要体现在两个地方:

  • 计算硬件以及相关的计算理论皆来自于数学;
  • 编程语言在设计时很多理论参考了数学中的相关的理论;

但事实上,在编程语言高度抽象的今天,大部分程序员都不再需要关注计算机本身,更不需要关注于数学,更多的程序员打交道最多的其实是“逻辑”。也就是说,程序员的大部分工作其实是把现实世界的一些东西抽象成逻辑并且用计算机语言把它们实现出来,之后把程序交由计算机去执行。

参考:
How was the first assembler programmed?
History_of_programming_languages
第一个计算机语言编程程序是怎么做出来的?
1985年程序员是如何写代码的