计算机语言是用于人和计算机沟通的语言,所有的软件包括操作系统和编译器都是由各种计算机语言编写的程序生成的。计算机语言按产生的时间顺序,一般分为三大类:机器语言、汇编语言和高级语言,如图1.17所示。
图1.17
机器语言是计算机可以直接识别并运行的语言,它由一系列指令构成,每条指令完成一个具体操作,比如加法指令、减法指令、跳转指令等。
计算机内部的一切数据都是由二进制数表示的,指令也不例外。例如,0100 0001 0010可以作为一条机器指令,如图1.18所示,其中0100表示这条指令是加法指令,0001表示R1寄存器,0010表示R2寄存器,这条指令的功能是将R1寄存器中的数和R2寄存器中的数相加,结果存到R1寄存器中。
图1.18
使用机器语言编写的程序是一个巨大的由0和1组成的串码。早期的程序员将这些串码标记在打孔纸带上,数字1打孔,数字0不打孔,如图1.19所示。打孔纸带最终经过光电输入机将数据输入计算机,以供运行。
图1.19
复杂的计算机会有成百上千条指令,要记住这些指令的功能和每条指令的二进制格式,不是一件简单的事情。现在除了计算机生产厂商中的少数专业人员,几乎没有人需要用机器语言编写程序。
汇编语言是机器语言的另外一种形式,它用英文字母或单词的缩写作为指令,也可以认为汇编语言给每条指令起了一目了然的名字。例如,机器指令0100 0001 0010可以用ADD R1 R2代替,其中ADD代表加法指令,R1和R2是参与运算的两个寄存器的名字。
用汇编语言编写的程序不能在计算机上直接运行,需要先由编译器“翻译”成机器语言,再让计算机运行。这个翻译的过程通常称为编译,编译后的程序称为可执行程序,如图1.20所示。
图1.20
高级语言是多种编程语言的统称,它的语言风格更接近于人类的自然语言。用高级语言编写代码时可以使用英文字母、英文单词和一些数学符号。编程人员可以在不了解计算机的硬件和CPU结构的情况下编写程序。例如,计算两个数的和,在许多高级语言中可以写成a = a+b,这里的a和b是两个变量,至于这两个变量在计算机中是怎么处理的、怎么存储的,编程人员不需要知道,全部交给计算机去处理即可。
图1.21展示了用机器语言(左)、汇编语言(中)和高级语言(右)编写的计算两数之和的程序。
图1.21
用高级语言编写的程序不能在计算机上直接运行,需要将其编译成计算机可以识别的机器语言才行。按照编译的方式不同,高级语言又可以分为编译型语言和解释型语言。
编译型语言需要用编译器将源程序一次性编译成机器语言,然后在计算机上运行。例如,NOI选手在Windows系统上用C++语言编写的源程序,需要经过编译器(Dev-C++、CodeBlocks等)的编译,生成一个扩展名为.exe的文件,才能在计算机上运行。编译型语言主要有C、C++、Pascal、Object Pascal(Delphi)等。这种编译好的可执行程序实际上就是由机器指令组成的二进制程序,由于不同类别计算机的机器指令集是不同的,因此这个可执行程序不能在其他类别计算机上直接运行。
解释型语言不需要将源程序一次性编译出一个可执行文件,而是在运行的时候,由一个解释程序边解释边运行,逐条将源代码翻译成机器语言来运行。例如,Python就是典型的解释型语言,要在一台计算机上运行Python程序,必须要安装Python解释器。运行一个Python程序,实际上就是运行这个Python源程序,然后由Python解释器逐条扫描Python源程序,边扫描、边翻译、边运行。解释型语言主要有Python、PHP、ASP、JavaScript、VBScript、Perl、Ruby、MATLAB等。
编译型语言和解释型语言的区别见表1.11。
表1.11
按照解决问题的方法步骤的不同,高级语言又分为面向过程的语言和面向对象的语言。
面向过程的语言在解决问题时,会将整个问题划分成若干个步骤,然后从第一步开始,一步步地将问题解决。
面向对象的语言在解决问题时,会将整个问题分解成若干个对象——每个对象都有自己的属性和行为方式,然后将这些对象逐一实现,最后再按这些对象的关系组合在一起将问题解决。
面向过程的语言与面向对象的语言的区别见表1.12。
表1.12
在以往的NOI系列比赛中,选手可以使用的语言有C、C++和Pascal。从2022年开始,只能使用C++语言。
1. 【2020年第2题】编译器的主要功能是( )。
A.将源程序翻译成机器指令代码
B.将源程序重新组合
C.将低级语言翻译成高级语言
D.将一种高级语言翻译成另一种高级语言
【解析】 编译器用来将源程序翻译成机器指令代码。
【答案】 A
2. 【2021年第1题】以下不属于面向对象程序设计语言的是( )。
A.C++
B.Python
C.Java
D.C
【解析】 C语言是面向过程的语言。
【答案】 D
3. 【2022年第1题】以下哪种功能没有涉及C++语言的面向对象特性支持?( )
A.C++中调用printf函数
B.C++中调用用户定义的类成员函数
C.C++中构造一个class或struct
D.C++中构造来源于同一个基类的多个派生类
【解析】 C++中类、基类、派生类相关特性都与C++语言的面向对象特性有关。
【答案】 A
4. 【2024年第15题】编译器的主要作用是什么?( )
A.直接执行源代码
B.将源代码转换为机器代码
C.进行代码调试
D.管理程序运行时的内存
【解析】 编译器的功能是进行翻译,就是把高级语言编写的源代码进行翻译,翻译成计算机可以执行的机器代码。
【答案】 B
1. 关于程序设计语言,下面哪种说法是正确的?( )
A.高级语言比汇编语言更“高级”,是因为它的程序运行效率更高
B.高级语言相对于低级语言更容易实现跨平台的移植
C.加了注释的程序一般会比没有加注释的程序运行速度慢
D.C语言是一种面向对象的高级计算机语言
【解析】 相比汇编语言,高级语言的语法特性更容易理解和实现;高级语言比汇编语言更容易移植;程序的注释并不影响程序的运行效率,因为注释的内容并不会被编译器或解释器执行;C语言是面向过程的编程语言。
【答案】 B
2. Python语言、C语言和C++语言都属于( )。
A.面向对象语言
B.脚本语言
C.解释型语言
D.以上3个选项都不对
【解析】 三种编程语言中,C语言不是面向对象的,所以选项A错误;C语言和C++语言都不是脚本语言,也不是解释型的,故B、C错误,答案应为D。
【答案】 D
3. 下列不属于解释型程序设计语言的是( )。
A.Python
B.C++
C.JavaScript
D.PHP
【解析】 C++语言是编译型语言。
【答案】 B
4. 编译器的主要功能是( )。
A.将两个源文件合并成一个新的文件
B.将低级语言翻译成高级语言
C.将源程序翻译成机器指令代码
D.将汇编语言翻译成高级语言
【解析】 编译器的主要功能是将源程序翻译成机器指令代码。
【答案】 C
5. 以下哪个选项不属于面向对象编程语言的特性?( )
A.封装性
B.便携性
C.多态性
D.继承性
【解析】 便携性不是面向对象编程语言的特性。
【答案】 B