编程语言简介
计算机就是人类的打工仔。这个打工仔干活麻利,不知疲倦,最重要的是不要工钱,只要吃点电就行。
但是,要让这个免费好用的打工仔干活,必须得有一个前提:安排!
就像老板安排打工仔、老大安排小弟、老妹安排老哥做事一样,你要让计算机做事,也得安排它。
用什么安排呢?编程语言。
就像大规模话术传播组织给成员洗脑一样,编程语言能给电脑洗脑,让电脑乖乖听咱的话。它是人用来安排电脑干活的工具。
用编程语言制造的产品,就叫“软件”。所有的软件都是编程语言造出来的,哪怕强如操作系统和编译器都是如此。
和咱们人与人交流的语言很不一样,编程语言有严谨的规则、符号和语法结构。
总体上,编程语言可分为三大类:机器语言、汇编语言和高级语言。
一、机器语言
机器语言是计算机能听懂的语言,听完马上就能去干活。这些语言的特点是清一色的祈使句,就是下命令,这些命令在计算机的世界里叫做“指令”。
老弟呀,把这两天卖麻辣烫的钱加起来,给组报个数。这是加法指令。
昨天打麻将输了520,帮姐记成店里的开支。这是减法指令。
如果隔壁吴老二再来吃霸王餐,直接给我打断腿儿。这是分支结构,也就是根据条件满足情况来决定是否执行指令。
吴老二来一次打一次。这是循环结构,重复执行指令。
计算机能听懂的指令长什么样呢?就像0100、0001这样。也就是说,机器语言清一色由0和1组成。
这么看来,机器语言就是个“二货”。
它的基本造型是:指令+数据。
这就像老大对小弟说:“干他!”
“干”就是动作,就是指令,“他”就是动作对象,就是数据。
比如,老大派出代号为R1和R2的两个小弟。R1打了他3拳,R2打了他8拳。现在老大要计算这通输出的伤害指数,于是下了一条命令:0100 0001 0010
。这就是机器语言,你看不懂,计算机却能妙懂。
0100表示这条指令是加法指令,0001表示小弟R1,0010表示小弟R2,这条指令的功能是将R1和R2打的拳头数相加,再让R1把结果记下来。现在,老大要知道赔多少医药费,就把R1叫过来问一下就行了。
打的拳数记在谁的脑子里呢?显然是是记在R1和R2这俩小弟的脑子里。这俩小弟叫做“寄存器”,存储着CPU随时要计算的数据。
早期,这些由0和1构成的机器语言被“写”在打孔纸带上,如果是1就在纸上打个孔,是0就不打孔。
把打孔纸带像传送带一样传入光电输入机,这些机器语言就被输入计算机,就能运行了。
显然,机器语言对人太不友好了,谁能记得住成百上千条类似于0100这样的指令呢?因此,基本上没有人会用机器语言编写程序。
二、 汇编语言
为了解决机器语言难以理解、记忆的问题,汇编语言出现了。
汇编语言其实就是给机器语言起名字,它将0/1数字代号替换为字母或英文单词,这样就方便理解、记忆。前面说的机器指令0100 0001 0010
就变成了ADD R1 R2
,其中ADD代表加法指令,R1和R2是参与运算的两个寄存器的名字。
咱们用汇编语言编写出程序,然后由编译器将其“翻译”成机器语言,计算机就能运行了。这个翻译过程称为编译,编译后的程序称为可执行程序。
三、高级语言
高级语言就是对机器语言的深度包装,它更接近于人类的自然语言。它可以让编程人员只考虑软件的算法,而不必了解计算机的硬件和CPU结构的。比如前面说的ADD R1 R2,虽然也能理解,但对于程序员来说,我们关心的只是将两个数相加,谁管它存在哪个寄存器。ADD这个指令显然也没有+号更直观。因此,在高级语言里,上面的代码一般都是写成a=a+b
。这种写法就与咱们平时写的数学表达式很接近了。
下图展示了用机器语言(左)、汇编语言(中)和高级语言C++(右)编写的计算两数之和的程序。可以看出,机器语言如天书,汇编语言难到哭,高级语言好舒服。
对于信息学奥赛选手来说,以前可以使用的编程语言有C、C++和Pascal。从2022年开始,只能使用C++语言。
3.1 编译型、解释型语言
和汇编语言一样,高级语言同样需要转换为机器语言才能运行。按照编译的方式不同,高级语言可分为编译型语言和解释型语言。
3.1.1 编译型语言
编译型语言和汇编语言的转换方式一样,都需要有一个专门的翻译——编译器,它将写好的程序(源程序)一次性翻译成机器语言。翻译后的程序就可以直接在操作系统上运行了,比如在Windows系统,它就是一个扩展名为.exe的文件,双击一下就能直接运行。
编译型语言主要有C、C++、Pascal、Delphi等。
翻译后的可执行程序是固定的。不同电脑上的机器指令可能是不同的,因此编好的这个可执行程序不能在其他类别的计算机上直接运行。此外,不同的操作系统上,程序也是不一样的。这就像你把一本中文小说翻译成英文,就只有会英语的人能读懂一样。
因此,由编译型语言编出来的程序就像只能在北纬30度才能生长的果树一样,可移植性低。
3.1.2 解释型语言
为了让你写的小说让所有国家的人都能读懂怎么办呢?一个办法就是将小说翻译成各个国家的语言,这工作量显然太大了。
好吃懒做的人们想出了另一个办法,就是什么时候读,什么时候翻译。
这就要找一个万能翻译,通晓所有国家的语言。你要给法国人读,就一句一句翻译成法文;要给日本人读,就一句一句翻译成日文。
这个万能翻译叫做“解释器”,它将高级语言逐条翻译成机器语言,边翻译边运行。
虽然这种方法翻译工作量降低了,但是运行时需要现运行现翻译,所以运行效率会低一些。
解释型语言主要有Python、java、PHP、ASP、JavaScript、VBScript、Perl、Ruby、MATLAB等。
编译型语言 | 解释型语言 | |
---|---|---|
是否需要编译 | 是 | 否 |
运行过程 | 直接运行编译好的可执行程序 | 由解释器直接运行源代码 |
运行环境要求 | 无 | 需要安装解释程序 |
能否跨平台 | 不能 | 能 |
代码效率 | 高 | 低 |
主要语言 | C、C++、Pascal、Object Pascal(Delphi) | Python、PHP、ASP、JavaScript、VBScript、Perl、Ruby、MATLAB |
3.2 面向对象、面向过程
按照解决问题的方法步骤的不同,高级语言又分为面向过程的语言和面向对象的语言。
3.2.1 面向过程的语言
面向过程的语言在解决问题时,会将问题分解成步骤,一步步地解决。就像把大象装冰箱,总共有三步。C语言就是典型的面向过程的语言。
3.2.2 面向对象的语言
面向对象的语言在解决问题时,将问题分解成不同的对象。把大象装冰箱,有大象和冰箱两个对象,大象有身高、体重,冰箱有长宽高,这些叫对象的属性。大象能走,能被装,冰箱能开关门、能制冷,这叫对象的方法(或叫行为)。把每个大象、冰箱的上述属性、方法都用代码写出来,把大象装进冰箱这个问题也就解决了。
C++、Python、Java等都是面向对象的语言。
面向过程的语言与面向对象的语言的区别如下表:
面向过程的语言 | 面向对象的语言 | |
---|---|---|
核心思想 | 将问题分解为步骤 | 将问题分解为对象 |
代码效率 | 高 | 低 |
代码体积 | 小 | 大 |
可维护性 | 低 | 高 |
使用范围 | 硬件配置低,对效率要求高的小系统 | 规范庞大的复杂系统 |
主要语言 | C、Pascal、Fortran | C++、C#、Python、Java、Object Pascal(Delphi) |
四、CSP-J习题
4.1 真题解析
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语言是面向过程的语言,printf函数是C语言中的函数,因此A选项不涉及面向对象特性。面向对象的特点是将事物分类,比如前面说的大象、冰箱。所以选项中含有“类”或"class"的都与面向对象特性有关。
【答案】A
4.2 相关习题
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