【软考】【软件设计师】【知识模块】【第2章:程序设计语言基础知识】

旧时模样 提交于 2019-12-02 17:04:01

程序设计语言基础知识

 

2.1 程序设计语言概述

  2.1.1  程序设计语言基本概念

    低级语言,面向机器的语言,如汇编语言、机器语言;

      特性:进行程序设计效率低,程序的可读性差,难以修改、维护,优势是运行速度特别快;

    高级语言,面向各类应用的程序设计语言。如C、C++ 、Java、Python、Delphi 、Pascal、Php

    

    语言处理程序:负责将高级语言翻译成计算机能理解的0和1的程序;

    语言之间的翻译基本方式:

      汇编、解释、编译;

      汇编:对使用汇编语言写成的源程序进行翻译成目标程序(机器可直接执行)的过程;

      解释:将源程序翻译成中间代码(需要配合专有解释器才可执行)的过程;

      编译:将源程序翻译成机器可直接执行的目标程序的过程;    

      

    解释和编译的区别在于:

      对源程序进行编译后的目标程序可以在机器上直接执行,不需要源程序和编译程序配合执行;机器上运行的是与源程序等价的目标程序。

      对源程序进行解释后的中间代码,需要源程序和解释程序(解释器)配合执行;

       

    程序语言的定义涉及的三个范畴:

      语义、语法、语用;

    所谓高级语言,即不依赖机器硬件的;

    所谓通用的程序设计语言:能够应用与范围广泛的问题求解过程中的;

 

    计算机程序语言的发展史:

    1957年:Fortran语言;第一个被广泛用来进行科学和工程计算的高级语言

      一个Fortran程序由一个主程序和若干个子程序组成。

      最大的特性是:接近数学公式的自然描述,具有很高的执行效率。

        广泛应用于并行计算和高性能计算机领域;

    1960s:ALGOL语言;在晶体管计算机流行的年代

    1970年:Pascal;过程式、结构化程序设计语言;

    1980s:C语言;通用程序设计语言;

      Unix及其上的软件均使用C编写的;

      兼顾高级语言和汇编语言的特点;

      提供了高效的执行语句

      允许程序员直接访问操作系统和底层硬件;

      在实时处理应用开发中有普遍应用;

    1980s:C++语言;与C兼容,比C多了封装和抽象

        与C相比,增加了类机制(使C++成为面向对象程序设计语言)

        C++编译器能够编译任何C程序

        C++不可以省略函数原型,C可以;

    1980s:C#语言,Microsoft 公司开发的

        面向对象的高级语言

        运行于.NET Framework

        相对C++,部分方面进行限制和增强;

        仅支持单一父类继承,不支持多重继承;

    1980s :Objective-C 语言,由C衍生,继承C的语言特性;

        面向对象

        由Apple公司维护,是MAC系统下的主要开发语言;

        仅支持单一父类继承,不支持多重继承;

     1990s:Java语言,

        保留了C++的基本语法、类、继承等概念;

        删掉了C++的一些不好的特征;

        与C++相比,Java更简单、语法和语义更合理;

    1993:Ruby语言,松本行弘设计的

        解释型语言,面向对象,动态类型、脚本语言;

        任何东西都是对象

        每个过程和函数都是方法

        变量没有类型

        任何东西都有值

    1990s:PHP语言,服务器端执行的、嵌入HTML文档的脚本语言。

        语言风格类似C

        网站编程方向广泛使用

        可快速执行动态网页,语法混合C、Java、Perl,部分为PHP自创语法;

        PHP可以充分利用服务器的 性能

        PHP支持几乎所有流行的数据库以及操作系统。

     1990s:Python 面向对象   解释型程序设计语言,脚本语言,

        可编写独立应用程序、复杂应用的圆形;

        Python支持对操作系统的底层访问

        胶水语言,可以使用C、C++、Java等进行扩展。

     1990s:JavaScript语言,脚本语言,广泛应用于WEB开发

        常见JavaScript脚本嵌入在HTML中

     1990s: DelPhi语言,Windows环境下使用,在Linux环境下是Kylix;

     1990s:Visual Basic.NET  语言,基于Microsoft .NET Framework 

        面向对象,

        被编译的中间代码不能在操作系统上直接执行;程序运行需要借助与.NET  Framework  ;

     

程序设计语言的演化从最开始的

机器语言  ——>  

汇编语言  ——>  

各种结构化高级语言  ——>  

支持面向对象技术的面向对象语言  ;

 

演化过程,反映的是一条  抽象机制不断提高  的演化道路

 

 

 

  程序设计语言的分类:

    命令式和结构化程序设计语言【如Fortran、Pascal、C 】
      基于动作的语言,计算机被看成动作的序列;

      结构特性:

        自顶向下逐步精化的方法编程;

        按模块组织的方法编程;

        程序只包好顺序、判定(分支)及循环构造;

            

        结构简单清晰、模块化强、描述方式接近人们习惯的推理式思维方式;

        程序可读性强,

    面向对象程序设计语言【如C++、Java、Smalltalk】

       面向对象程序设计语言都必须支持新的程序设计技术,如  数据隐藏、数据抽象、用户定义类型、继承、多态  等;

       面向对象程序设计的创建,归功于Simula,从模拟领域发展起来的,提出了对象和类的概念。

    函数式程序是设计语言 【如LISP,常见的还有Haskell、Scala、Scheme、APL】

       1958年专为AI设计的语言;

       映射的概念,定义域和值域的一对一和多对一映射关系;

       LISP中大量使用递归;  

       

    逻辑型程序设计语言  【如Prolog】

       以形式逻辑为基础的语言

       建立在关系理论和一阶谓词理论基础上的

       Prolog是一系列事实、数据对象、事实间的具体关系和规则的集合

       Prolog有很强的推理功能,适用于编写自动定理证明、专家系统、自然语言理解等问题的程序。

 

    等;

 

  程序设计语言的基本成分:

    数据、运算、控制、传输、函数

    数据:

      常量、变量  (引入 左值和右值的概念;)

      全局量、局部量  (引入作用域的概念)

      数据类型

        数据类型一般有:基本类型、用户定义类型、构造类型、其他类型

    

 

 

      

      数据的一些属性:

          类型(说明数据占用内存的大小和存放形式;)

          存储类别(说明数据在内存中的位置和生存期)

          作用域(可使用数据的代码范围)

          生存期(说明数据占用内存的时间特点)

          名称(通过标识符命名;)

 

      (数据所涉及到的:)命名、

        标识符组成:如字母大小写a/A --z/Z  ;数字0-9;  下划线_

        标识符命名规则,如开头只能以_  和字母构成等;

    

    

    运算

      算术运算

      逻辑运算

      关系运算

       位运算

 

      运算符的优先级、结合性等特性;

    

    控制

      顺序结构

      选择结构

      循环结构

        组成部分:初始化、循环体、循环条件

         while类型(先判断,条件成立则执行)

        do-while类型(先执行,后判断,条件成立则继续循环)

      C、C++ 提供的控制语句

        复合语句,利用“{  }” 来控制语句结构

        利用if     Switch  来实现双分支和多分支选择结构;

        还有一些控制流跳转语句,如continue、break、 goto;

 

    传输

      赋值处理、数据的输入、输出;

    

    函数

      三个概念:函数的定义、声明、和调用;

      函数的值调用

      函数的引用调用

 

 

 

 

语言处理程序基础

  语言处理程序,是一类系统软件的总称,主要作用是将高级语言/汇编语言  编写的源代码程序翻译成某种机器语言程序,目的使程序可以在计算机上运行。

 

  根据源程序类别,语言处理程序也可以分为汇编程序、编译程序、解释程序   这三种基本类型。

  

  汇编程序基本原理

    汇编源程序的构成:指令语句、伪指令语句、宏指令语句

      指令语句分类:(指令语句又称机器指令语句,汇编后产生相应的机器代码)

        传送指令、算术运算指令、逻辑运算指令、移位指令、转移指令、处理机控制指令等类型;

      伪指令语句:

        用于指示汇编程序在汇编源程序时,完成某些工作。(也就是说伪指令语句是在汇编源程序的过程中辅助使用的,不参与最终的执行环节)

          如,为变量分配存储单元地址

          

      伪指令语句与指令语句的 区别:

          伪指令语句经 汇编后,不产生机器代码,指令语句会产生代码

          伪指令语句的操作在汇编的过程中被执行;指令语句的操作在最终程序执行的过程中使用。

      宏指令语句

        汇编程序允许用户将  多次重复使用的程序段定义为  宏;

        每个宏都有名字

        程序任意的位置都可以使用宏;

        宏指令语句就是宏的应用。

 

    汇编语言的特性:

      汇编程序,一般需要两次扫描源程序,才能完成翻译工作。

        因为汇编指令中,形成操作数地址的部分可能出现后面才会定义的符号,如宏可以在程序的任意位置被“引用”

        汇编程序,第一次扫描的主要工作是定义符号的值,并创建一个符号表ST

        有一个固定的机器指令表MOT1;(记录了每条机器指令的记忆码,和指令的长度)

         设立一个位置计数器   或  单元地址计算器LC(Location Counter)   (初始值为0)

             为了计算各汇编语句标号的地址。

          LC的值,是随着扫描源程序的进度,逐渐累加;

      

        第二次扫描源程序,是为了产生目标程序(也就是物理计算机可以直接执行的代码程序)

          需要使用到机器指令表 MOT2

            MOT2表中,含有机器指令助记符、机器指令的二进制操作码、格式、长度

          需要设定一个伪指令表POT2,供第二次扫描时使用;

            POT2的每个元素仍然有两个域:伪指令记忆码   和  相应的子程序入口

            第二次扫描时,伪指令有着完全不同的处理方式:

          可执行汇编语句会被翻译成对应的二进制机器代码指令

            一、将   机器指令助记符  转换成    二进制机器指令操作代码

            二、求出操作数区  各操作数的值(用二进制表示)    (通过查找MOT2表来实现。)

 

 

   编译程序基本原理   【这个章节比较难,且内容 比较多】

    六个阶段

     || 源程序  ——>  词法分析

        ——>  语法分析

        ——>  语义分析

        ——>  中间代码生成

        ——>  代码优化

        ——>  目标代码生成

          ——>  目标代码  ||

     在这六个阶段中,不论哪个阶段都会涉及到    符号表的管理、 出错处理  

 

    需要说明的是,中间代码生成后,就与物理机器无关,这是一个分水岭。

    中间代码,是与汇编语言的指令非常相似的三地址码(其实现方式常用四元式)

 

    代码优化阶段,优化的过程,可以在中间代码生成阶段进行、也可以在目标代码生成阶段进行。

    

     词法分析,涉及到有限自动机、(确定的有限自动机DFA  和不确定的有限自动机  NFA)

      有限自动机,用于识别装置的抽象概念。它能准确地识别正规集。

      正规集、正规表达式   的概念引入;

    

    中间代码的优化和目标代码的生成

      优化是对程序的等价交换,使得从变换后的程序能够生成更有效的目标代码;

        所谓的等级,是不修改程序的执行结果;

        所谓的有效,是指目标代码的执行时间较短,占用的存储空间较少;

      优化可以在编译的各个阶段进行;

      最主要的优化,是目标代码生成之前,对中间代码进行的优化,这类优化,不依赖具体的计算机硬件。

      

      代码生成需要考虑的问题;

        中间代码的形式

        目标代码的形式

          分为两大类:汇编语言形式、机器指令形式

        寄存器的分配

          寄存器资源远远优于内存,但资源数量少;

        计算次序的选择

          

 

  解释程序的基本原理

    解释程序,在词法、语法、语义分析方面,与编译程序的工作原理基本相同;

    在运行用户程序时,解释程序直接执行源程序或源程序的中间表示形式;

    解释程序不产生源程序的目标程序;(这个是解释程序与编译程序的主要区别;)

    

     解释程序实现高级语言的三种方式

      

 

 

     第一种A:解释程序直接对源程序执行,特点:

      逐个字符检查,反复扫描源程序,运行效率低;

    第二种和第三种,BC之间的区别,在于中间代码的级别,是否更接近于机器代码;

      APL、SNOBOL4都是采用这种方法的;

    高级代码和中间代码间存在着1-n的对应关系;

    中间代码更接近于机器代码,则可移植性更好;(待确认这句话是否理解正确)

      

    解释程序的基本结构;

      分析部分

        对源代码进行  词法分析、语法分析、语义分析,经过语义分析,将源代码翻译成中间代码;

      解释部分

        对分析部分产生的中间代码进行解释执行,

 

  高级语言,编译与解释的比较:

    效率

      一般编译比解释的效率更高;

        解释程序执行过程中需要反复扫描程序;

        解释程序相比较编译程序,需要更多的内存空间,因为系统在执行用户程序时,还需给解释程序分配内存资源;

      

        编译程序在编译过程中,所需时间比较长,因为不但需要将源程序进行语法语义分析,还需要对目标代码进行优化;

          编译程序比机器语言的源程序,运行时间更长,占用存储空间更多。

          一次编译后,用户程序可以多次使用;

  

    灵活性

      解释程序需反复检查源程序,甚至可在程序执行过程中修改源程序;

      可直接定位程序执行错误的地方;

    可移植性;

      解释器也是一种程序语言编写的,只需要对解释器进行重新编译,就能适应不同的环境;

 

    由于编译和解释各有优缺点,现在的部分编译系统也同时提供解释功能;

      如java虚拟机上发展的一种Compiling-just-in-time技术;

 

 

————————(我是分割线)————————

 

考纲有关本章节的要求:

 

 


————————(我是分割线)————————

 

本章节需要深入了解的知识点有:

 

 

 

 

 

 

————————(我是分割线)————————

参考:

1. 《软件设计师教程》(第五版,清华大学出版社,禇华、霍秋艳 主编)

2.  赛迪网校 :www.ccidedu.com(教学视频资源)

3. 美河学习在线团购组:www.eimhe.com (教学视频来源)

 

备注:

初次编辑时间:2019年10月17日20:29:20

第一次修改时间:2019年10月28日23:04 

环境:Windows 7   / Python 3.7.2

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!