概述
2.1.1 程序语言的演化
1、程序设计语言的萌芽
(1)爱达与最早的程序设计
爱达:分析机可以像提花机那样进行编程。
爱达设计了世界上第一个计算机程序。
爱达提出了循环、子程序等概念。
爱达参与了巴贝奇对分析机的设计。
(2)弗雷格与程序设计
1879年,德国数学家弗雷格提出了用语法规则构造形式语言。
弗雷格的 “概念文字”是现代程序设计语言的萌芽。
数理逻辑创始人,创建第一个谓词逻辑系统。
弗雷格《概念文字》著作中的人工语言:
【例】Func(R)∧xR'y∧xR'z→yR'z∨zR'y∨y=z 【命题133】
(3)哥德尔与程序设计
1931年,哥德尔提出:可以将命题符号与自然数相对应。
【例】对逻辑表达式:(∀????) ((∃????)????(????,????)→????(????))
按照哥德尔的思想,假设符号与十进制数的编码如下:
以上逻辑表达式可编码为:638766497168097526877。
对逻辑命题用数字编码,为程序的二进制数运算提供了设计思想。
(4)图灵机与程序设计
1936年,图灵指出:对应于每种行为还要有一个指令表,…它应当执行什么指令,以及完成这些指令后,机器应处于哪种状态。
图灵机的指令表就是一种计算机程序。
【例】早期的编程—电路插接板。
1934年,IBM推出了405型会计机。这种设备能够根据穿孔卡片编制、印刷包含字母和数字信息的报表。
电路插接板是IBM-405型会计机里的“软件”。企业有装满了插接板的机架,每块接插板用于编制特定类型的数据,如工资单、营收报表、库存控制等。穿孔卡片也会作为会计机的输入和输出,存储了员工工作时间、销售额和订单等各种数据。由于会计机没有固定存储器,因此它们仍然属于制表设备,而不是计算机。
【例】早期的程序:打孔纸带
【补丁程序】早期计算机用机器语言编程,程序是纸带上有规律的小孔。程序员先将计算机指令或数据换算成二进制数字编码,然后按编码用打孔机在专用纸带上打出小孔,每一行孔代表一个字符编码,几十行小孔形成一条指令或数据,读带机将纸孔转换为电信号。如果程序打孔出现错误,就需要将打孔纸带剪断,将新修改的程序纸带粘贴进去,这段程序称为“补丁程序”。
2、现代程序设计语言的发展
(1)汇编程序语言
1951年,霍普设计了第一个编译程序A-0,标志汇编语言的诞生。
(2)第一个高级程序设计语言
1954年,巴科斯发明了第一个高级程序设计语言FORTRAN。
(3)程序语言的演化
FORTRAN(现仍在使用)
COBOL
ALGOL (最经典的语言)
LISP
3、为程序设计做出杰出贡献的科学家
(1)艾伦·佩利与程序设计语言
1958年主持设计ALGOL程序语言;
在ALGOL60设计中,提出区分语法和语义;
最早将程序设计引入大学课堂;
1960年代,在卡内基-梅隆大学建立最早的计算机科学系;
ACM首任主席,第一个图灵奖获得者。
【名言】
如果你给别人讲解程序时,看到对方点头了,那你就拍他一下,他肯定是睡觉了。
—— 艾伦·佩利
(2)迪科斯彻与结构化程序设计
1960年,参与开发ALGOL 60编译器;
提出“Goto语句有害论”(广泛用于程序设计);
解决“哲学家就餐”问题(广泛用于操作系统);
发明图论中最短路径算法(广泛用于路由算法);
图灵奖获得者。
【名言】
编程的艺术就是处理复杂性的艺术。
简单是可靠的先决条件。
计算机会不会思考这个问题就像问潜水艇会不会游泳一样。
—— 迪科斯彻
(3)高德纳与数据结构
创建了算法分析领域;
开创了数据结构体系;
《计算机程序设计艺术》是计算领域最经典的参考书;
开发了KMP算法(字符串查找);
开发了TEX论文排版程序。
图灵奖获得者。
【名言】
如果我们有再三思考的机会,几乎没有一件事情是不能被简化的。
虽然计算机科学非常美妙,但它也不可能包办一切!
—— 高德纳
【例】中国最早的程序员。
董铁宝,1945-1952年在伊利诺伊大学参与了早期计算机伊利亚克的设计、编程和使用。
1952年,华罗庚在普林斯顿大学做研究,他和冯·诺伊曼有过密切交往。回国后,华罗庚组织成立了中国第一个计算机科研小组,最早有三人:闵乃大、夏培肃、王传英。
夏培肃,1951年英国爱丁堡大学博士后毕业回国,1952年加入计算机科研小组。
张绮霞,1958年进入计算所程序设计室,她设计的打孔纸带程序都是“一次通过,从无bug”!我国第一颗人造卫星的地面跟踪程序就出自她的手笔。
夏培肃主编的中国第一套
《计算机原理》大学教材(1956年)
【例】1956 年,上海交通大学抽调电机专业高年级学生,到清华大学新成立的计算机专业,1957年中国第一批计算机专业学生毕业。
4、程序设计语言的特征
程序语言已超过上千种;
试图创建通用程序语言的尝试没有成功。
(1)多种程序语言的原因
没有一种程序语言可以解决所有问题;
环境变化时,需要新程序语言适用它;
编程新手与高手之间的技术差距非常大;
不同程序语言的运行效率和开发成本不同。
(2)程序语言的发展趋势
程序语言结构变化很少,设计框架和设计工具改进很大。
编程范式:
过程式编程,如:C、Fortuan、Matlab等;
面向对象编程,如:Java、C++、C#等;
动态语言编程,如:Python、JavaScript、PHP等;
函数式编程,如: Haskell、F#、LISP等;
声明式编程,如:Prolog、SQL等;
并行编程,如:MPI、Go等。
(3)程序设计语言的学习
学习编程语言的方法:
多阅读优秀源程序;
多练习编写程序;
多思考如何解决身边的问题。
2.1.2 程序语言的类型
程序语言是计算机指令执行流程的形式化语言。
程序语言规范:
数据类型和数据结构;
指令类型和指令控制;
调用机制和库函数;
以及不成文的规定,如,递进书写、变量命名等。
【名言】
计算机是一台快速,笨拙的机器,只有有限的能力。只能进行基本的数学运算与逻辑比较。必须由程序来指示它做什么事。
—— George Beekman
计算机是一台笨拙的机器,具有从事令人难以置信的聪明工作的能力,...计算机程序员则是一些聪明的人,具有从事令人难以置信的笨拙工作的能力。简而言之,计算机与程序员实现了完美的配合。
—— Jamie Shiers
1、程序语言的分类
按程序功能分类:
算法描述型语言,如:C、Java、Python等;
数据描述型语言,如:HTML、XML、正则表达式等。
按编程难易分类:
低级语言,如:汇编语言、机器语言;
高级语言,如:C、Java等。
按执行方式分类:
解释型语言,如:Python;
编译型语言,如:C++。
2、机器语言
机器语言是以二进制代码表示的指令。
优点:占用内存少、执行速度快;
缺点:难编写、难阅读、难移植。
3、汇编语言
汇编语言用助记符表示二进制代码指令。
不同CPU的机器指令不同,它们的汇编语言也不同。
【例】汇编语言与机器语言指令。
4、高级程序语言
【表】IEEE发布2020年流行程序语言
【例】 CNNIC 2020年中国程序员调查报告。
2.1.3 编程环境与平台
1、程序语言的基本组成
(1)指令及指令流程控制
程序由多条语句组成。
语句有规定的关键字和语法结构。
(2)程序语言基本组成
数据成分,如:数值、字符、数组等;
运算成分,如:四则运算、逻辑运算等;
控制成分,如:选择、循环、调用等;
传输成分,如:实参与形参、返回值等。
【名言】
世界上只有两种编程语言:要么充满抱怨,要么没有人使用。
—— 本贾尼,C++之父
2、程序运行平台
运行平台指程序运行时需要的硬件环境和操作系统环境。
如:C#、F#、 VB等程序,只能支持x86系列CPU硬件环境。
程序运行在不同硬件环境下时,需要对源程序进行重新编译。
如:C程序用VC编译后,生成的exe文件可以在Windows下运行。
如:C程序用GCC编译后,生成的bin文件可以在Liunx下运行。
Windows下的应用程序,在Linux系统中不能运行;
苹果智能手机中的程序,在安卓智能手机中也不能运行。
程序开发时,需要调用操作系统底层接口程序实现某些功能。
如,在Windows编程时,需要调用各种子程序接口。如窗口,对话框,菜单等。
3、程序集成开发环境
IDE是一个综合性工具软件。
IDE功能:
程序编辑器,关键词检查器,程序调试器等;
有些IDE包含编译器或解释器,如:Microsoft Visual Studio;
有些IDE不包含编译器,如:Eclipse、SharpDevelop等;
其他:类浏览器、物件检视器、物件结构图等。
【例】Microsoft Visual Studio集成开发环境(for C/C++/C#)。
【例】Eclipes集成开发环境(for Java)。
【例】Eric6集成开发环境(for Python)。
【例】EditPlus集成开发环境(for HTML/JavaScript )。
【例】Android Studio智能手机开发平台
2.1.4 程序解释与编译
1、源程序的翻译
程序语言编写的指令序列称为“源程序”;
源程序必须翻译成机器指令,计算机才能识别和执行;
翻译方式:解释执行方式和编译执行方式。
2、程序的解释执行方式
(1)程序执行过程
语言解释器一般包含在软件或操作系统内。
如IE浏览器,Python解释器等。
(2)解释程序的优点
实现简单,交互性较好。
(3)解释程序的缺点
程序运行效率低;
程序独立性不强;
代码保密性不强。
简单测试表明,同一功能用不同语言编写时,运行时间如图:
【例】Python程序的解释执行过程。
图片转自:https://www.sohu.com/a/490303176_121118999
3、程序的编译执行方式
程序编译过程:
源程序→预处理→词法分析→语法分析→语义分析→生成中间代码→代码优化→生成目标程序→程序连接→生成可执行程序。
以上过程不一定是顺序进行。
图片转自:http://m.mamicode.com/info-detail-2933597.html
【例】 从不同层次深度看GCC编译过程。
(1)编译符号表
源程序信息保存在不同表格里;
语法分析时,符号表内容用于语法分析检查;
语义分析时,符号表内容用于语义检查和产生中间代码;
目标代码生成时,符号表是地址分配的依据。
(2)预处理
编译器:将预处理、汇编、编译、连接等集成在一起的软件。
预处理目的:加快编译速度。
预处理内容:宏定义,文件包含,条件编译等。
(3)词法分析
目的:分析和识别程序语句中的单词(分词)。
方法:编译器扫描源程序的字符串,根据词法规则识别出单词。
单词类型:
关键字或保留字,如:for、if、def等;
标识符,如:x、i、list等;
常数,如:PI值等;
运算符和分界符,如:+、-、*、/、=、;、{ }等。
【例】对表达式:X1=(2.0+0.8)*C1进行词法分析。
(4)语法分析
语法分析是生成语法树,并进行语法正确性检查;
语法树是程序结构的树形表示;
编译器利用语法树进行语法规则分析,并且生成中间代码。
【例】对表达式:X1=(2.0+0.8)*C1进行语法分析。
【例】条件语句:if x= =2 then {x=a+b} 的语法分析树。
(5)语义分析
静态语义审查,上下文相关性审查,类型匹配审查,数据类型转换,常量折叠等。
程序语句按语法正确,但是它不符合语义规则。
如:使用了没有声明的变量;
如:调用函数时参数类型不合适;
如:参加运算的两个变量类型不匹配等。
常量折叠就是对常量表达式计算求值。
如:s = 1 + 2,折叠后为常量3。
(6)生成中间代码
中间代码:介于源语言和目标语言之间的中间形式。
目的:中间代码很容易生成目标程序。
形式:四元式、三元式、逆波兰表达式等。
【例】X1=(2.0+0.8)*C1
四元式方式生成的中间代码如表所示。
(7)代码优化
目的:为了得到高质量的目标程序。
【例】对常量表达式可以在编译时计算出它的值,并存放在临时单元(T1)中。
优化后的中间代码如表所示。
(8)生成目标程序
汇编过程实际上是把中间代码翻译成目标机器指令的过程。
(9)链接程序
将目标文件和函数库连接,生成能执行的机器代码。
(10)生成可执行程序
将前面各步骤生成的信息转化成机器代码,并且写入磁盘文件。
4、编译失败的主要原因
完美的程序不会一次就写成功,需要反复修改、调试和编译。
研究人员分析了2600万次编译,指出编译失败的常见原因:
编译失败率与开发者经验无关;
大约65%的Java编译错误与依赖有关,如包文件不存在;
在C++编译中,53%的编译错误是使用了未声明的标识符和不存在的类变量。
下一篇:【06】2.2 Python编程基础
最后
以上就是小巧百褶裙为你收集整理的【05】2.1 程序语言特征的全部内容,希望文章能够帮你解决【05】2.1 程序语言特征所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复