什么是程序

程序是一系列指令,告诉计算机如何完成一个任务。
计算机本质上时数字电路组成的计算工具。只能识别二进制数字,也就是高低电平。所以一切程序本质上就是二进制数字,事实上,最初的计算机工作者就是用二进制数字来编程,被称为机器语言。但是因为这种编程方式太过繁琐,可读性太差。于是使用各种助记符去代替机器语言的二进制机器代码,这就是汇编语言。汇编语言和机器语言是一一对应的,只不过是用符号去代替了01序列,在想要运行时让汇编器去查找符号所对应的机器语言,进行替换。
高级语言是更为抽象的语言,它和汇编以及机器语言并不是一一对应的关系,运行时需要编译器先把高级语言源程序编译成汇编语言源程序,再由汇编器生成可执行的二进制机器语言程序。

编程语言 表达形式
C语言 a=b+1;
汇编语言 mov 0x804a01c,%eax
add $0x1,%eax
mov %eax,0x804a018
机器语言 a1 1c a0 04 08
83 c0 01
a3 18 a0 04 08

高级语言的分类

  • 编译执行的语言:是指程序的源程代码通过编译器编译成为一个可执行文件,然后再由机器运行可执行文件。比如:C/C++
  • 解释执行的语言:不需要编译生成一个可执行文件,把程序的每一行解释执行,解释完了,程序也就执行完了。常见的一些脚本语言。只要不是最终生成一个可直接执行的文件的都可以称作“解释性语言”。比如:Java/Perl/Python。Java虽然有编译的过程,比如,在生成jar包的时候,就需要将源程序编译成为字节码,但是在运行时,是由jvm解释字节码运行。
  • 两者的优缺点

    • 编译型语言:
      • 优点:执行效率高,因为生成可执行文件,不需要每次都执行编译的过程。而解释型语言每次执行时都需要解释。所以编译型语言更适合复杂程序。
      • 缺点:可移植性稍微差一点,因为有些程序的写法和操作系统关联,没有一个统一的标准,编译器不能编译出同样的机器码。
    • 解释性语言:
      • 优点:可移植性更好,因为大多数解释型语言与操作系统相关性不大。
      • 缺点:执行效率低,需要边解释边执行。

        可移植性的概念

        可移植性是指同样的代码在不同架构的机器以及不同的操作系统上都可以运行并且实现同样的功能。
        几个重要的概念:
  • 指令集(ISA):可以认为是一本规范手册。规定了计算机硬件需要具有的功能,可以理解为任务书,而工作人员需要根据指令集去设计cpu来实现这些功能。比如常说的X86指令集和arm指令集,还有最近很火的risc-v指令集。

  • 处理器架构:也称为微架构,是对指令集的具体硬件实现,同一个指令集可以由不同的微架构来实现,就像同样功能译码器,可以由不同的硬件电路来实现。比如ARM公司设计出了CoItex-A7、Cortex-A8、CortexA9等不同的微架构。它们之间的区别可能是晶体管排列方式不同,但是都是对arm架构的实现。

在讨论可移植性时,我们关心的是指令集的不同,因为指令集是指导硬件设计和软件编写的规范手册,所以说指令集是硬件与软件的接口。而可移植性是由编译器来实现的,不同的指令集有着不同的编译器,可以将同样的高级语言源程序编译成适合各自指令集的二进制机器语言。
所以程序开发人员可以不关心不同平台指令集的不同,而专心在程序算法的实现上。
image.png