1. 学习内容

程序指的就是一系列指令,用来告诉计算机做什么,而编写程序的关键在于,我们需要用计算机可以理解的语言来提供这些指令。

编程语言(programming language)可以简单的理解为一种计算机和人都能识别的语言。一种计算机语言让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动

1.1 编程语言的发展历史

机器语言,汇编语言,高级语言。

1.2 机器语言(第一代)

机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合。它是计算机的设计者通过计算机的硬件结构赋予计算机的操作功能。

不同“指令集体系结构”的计算机的机器语言是不相通的。例如苹果手机一般使用ARM64,联想的笔记本一般使用x86-64体系架构。同样一个加法运算,在不同指令集的计算机上,就要写不同的程序。

例如,”000000 00001 00010 00110 00000 100000”是MIPS指令集中的一个指令,解释为将寄存器1和寄存器2的两个数相加后,存储到寄存器6中。具体解释如下。

[  op   |  rs  |  rt  |  rd  |shamt|  funct]
    0      1      2      6      0      32     decimal
 000000  00001  00010  00110  00000  100000   binary

备注:上面第一行表示指令可以拆分成几个部分理解。

  • decimal 十进制
  • binary 二进制

1.3 汇编语言(第二代)

不难看出机器语言作为一种编程语言, 灵活性较差可阅读性也很差。

为了减轻机器语言带给软件工程师的不适应,人们对机器语言进行了升级和改进:用一些容易理解和记忆的字母,单词来代替一个特定的指令。

通过这种方法,人们能相对容易地去阅读已经完成的程序,理解程序正在执行的功能。

这种语言就是我们所说的汇编语言, 即第二代计算机语言。

下面是汇编语言的例子,打印出”Hello, World”。虽然还是比较难懂,但相比机器语言,人类能更容易理解和记忆。

; ----------------------------------------------------------------------------------------
; Writes "Hello, World" to the console using only system calls. Runs on 64-bit Linux only.
; To assemble and run:
;
;     nasm -felf64 hello.asm && ld hello.o && ./a.out
; ----------------------------------------------------------------------------------------

          global    _start                  ; 程序开始

          section   .text                   ; 程序指令部分
_start:   mov       rax, 1                  ; system call for write (译:下一个指令是输出)
          mov       rdi, 1                  ; file handle 1 is stdout (译:输出的位置是标准输出)
          mov       rsi, message            ; address of string to output (译:输出的字符串的地址)
          mov       rdx, 13                 ; number of bytes (译:字符串的长度)
          syscall                           ; invoke operating system to do the write (译:执行该指令)
          mov       rax, 60                 ; system call for exit (译:下一个指令是退出程序)
          xor       rdi, rdi                ; exit code 0 (译:返回0)
          syscall                           ; invoke operating system to exit (译:执行该指令)

          section   .data                   ; 数据部分
message:  db        "Hello, World", 10      ; note the newline at the end

1.4 高级语言(第三代)

高级语言主要是相对于汇编语言而言的,它是较接近自然语言和数学公式的编程,基本脱离了机器的硬件系统,用人们更易理解的方式编写程序。编写的程序称之为源程序。

高级语言设计的程序必须经过“翻译”以后才能被机器执行。“翻译”的方法有两种,一种是解释,一种是编译。

  1. 解释是把源程序翻译一句,执行一句的过程。(例如后面示例中使用python hello.py执行)
  2. 编译是源程序翻译成机器指令形式的目标程序的过程。(例如g++命令)
1.4.1 编译性语言

C++就是典型的编译性语言,通过g++会直接生成可执行程序。

1.4.2 解释性语言
Python示例

保存如下为文件hello.py

print("Hello, World!")

不用像C++那样编译,可以直接用解释器python程序执行。

python hello.py
Java示例
class HelloWorld
{
    // Your program begins with a call to main().
    // Prints "Hello, World" to the terminal window.
    public static void main(String args[])
    {
        System.out.println("Hello, World");
    }
}

在命令行中执行:

javac HelloWorld.java  #用javac命令编译,会生成HelloWorld.class
java HelloWorld        #用java命令解释执行

Java语言也需要先编译。Java编译程序生成字节码(byte-code)的class文件,而不是通常的机器码。运行时,这个class文件还需要java命令做解释才能执行。

所以,Java语言,既需要编译,也是一种解释性语言。

1.5 高级语言中的面向对象

1.6 一些高级语言的发展历程

一些主要的高级语言的时间表

  1. 1957 – FORTRAN
  2. 1970 – Pascal (编译性语言)
  3. 1972 – C (编译性语言)
  4. 1980 – C++ (在C语言上增加面向对象, 在1983重新命名为C++,编译性语言)
  5. 1990 – Python(面向对象,解释性语言,不需要编译)
  6. 1995 – Java(面向对象,解释性语言,但需要编译)
  7. 2000 – C#(面向对象,编译性语言)

2. 作业

1、

【CSP 2020 入门组第一轮 q02】编译器的主要功能是( )。
A. 将源程序翻译成机器指令代码  
B. 将源程序重新组合  
C. 将低级语言翻译成高级语言  
D. 将一种高级语言翻译成另一种高级语言  

2、关于程序设计语言,下面哪个说法是正确的:

 A. 加了注释的程序一般会比同样的没有加注释的程序运行速度慢。
 B. 高级语言开发的程序不能使用在低层次的硬件系统(如:自控机床)或低端手机上。
 C. 高级语言相对于低级语言更容易实现跨平台的移植。
 D. 以上说法都不对。

3、Pascal语言、C语言和C++语言都属于( )。

 A. 面向对象语言      B. 脚本语言
 C. 解释性语言        D. 编译性语言
4、

【NOIP 2014 普及组初赛 q01】以下哪个是面向对象的高级语言( )。
A. 汇编语言   B. C++   C. Fortran   D. Basic  

5、下列不属于面向对象程序设计语言的是( )。

A. C     B. C++     C. Java    D. C#