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

程序设计语言基础知识

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)

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

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

  

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

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

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

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

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

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

    

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

      中间代码的形式

      目标代码的形式

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

      寄存器的分配

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

      计算次序的选择

        

解释程序的基本原理

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

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

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

  

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

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

     第一种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