用编程语言实现算法

课程导言

【用流程图描述算法,可以与用户更好地交流。如果需要算法在计算上运行,就需要把算法用编程语言编写为程序。在程序与算法课程中,给出了计算长方形面积算法的伪代码,伪代码比较直观地描述了算法的执行过程,但它不能在计算机上直接运行,需要把伪代码用一种编程语言转换为程序。本篇和同学们探讨如何用编程语言来实现算法以及编程语言的发展过程。通过本篇的学习,你将了解到编程语言是如何由二进制语言逐步发展为高级语言的,以及用Java语言如何实现计算长方形面积的算法。】

 

语言是人类交流的工具,是人们沟通的主要表达方式。不同的民族有不同的语言,每种语言有自己的语法规则和词汇,只有在规定的语法规则和词汇范围内,人们才可以相互理解之间的对话和语句文字要表达的内容。超出这个范围,就会出现语言理解困难现象,例如:不同语言之间的人对话就会发生理解问题,就需要翻译人员的协助才能完成正常交流。

编程语言是人类与计算机的交流工具,为了让计算机能够准确无误地完成任务,人们需要使用计算机能够读懂的语言与之交流,编制任务指令交给计算机,计算机才能够按部就班地执行指令,完成人们交给的任务,编写计算机指令的语言就是编程语言。

编程语言和人类语言一样,不是先天就有的,是随着科技和计算机技术的发展,人们为了更好地控制计算机,帮助人们完成更多任务,提高编程和工作效率而不断对语言进行创新、完善和改进而来的。最初的编程语言是机器语言,也是计算机唯一能直接读懂的语言。计算机只能识别二进制代码,所以机器指令也是由二进制代码组成的,所谓的机器语言,就是直接用二进制代码编写计算机的指令序列(程序)。

假设编写一个计算直线方程的程序,给出方程的斜率、变量系数和变量X的值,求Y值,将计算结果存储到以Y为地址的存储单元中。

直线方程为 Y = AX + B,其中A、X、B已经分别存储到A、X、B存储单元,机器指令可以直接寻址到该存储单元。A单元的存储地址为26H,X的存储地址为34H,B的存储地址为36H,Y的存储地址为56H,其中26H、34H、36H、56H均为16进制,该算法流程图见下图。 

 

0099.png

 

图1 计算直线方程流程图

根据流程图编写的机器指令序列(参考了IBM-PC指令集,可能有出入,主要是为了说明编程语言的演变过程):

1

2

3

4

5

6

7

8

9

10

11

11011  AX  26H     

存取指令,读取指定地址26H的存储内容到AX寄存器;

21001  34H

乘法指令,将34H存储地址的内容与AX寄存器内容相乘;

31011  26H  AX

存取指令,将AX寄存器内容存储到26H地址的存储单元;

41011  AX  36H

存取指令,读取指定地址36H的存储内容到AX寄存器;

50011  AX  26H

加法指令,将AX寄存器内容和26H地址存储内容相加;

61011  56H  AX

存取指令,将AX寄存器内容存储到56H地址的存储单元。

上面就是用机器语言编写的计算直线方程的计算机指令序列,是不是特别难记、难懂,完全是看天书的感觉。为了提高编程的工作效率,在1949年,人们将助记符和机器代码关联起来,并编写了转换程序,转换程序可以把助记符转换为机器代码,这就是汇编语言。

根据流程图编写的汇编程序指令序列(参考了IBM-PC指令集,可能有出入,主要是为了说明编程语言的演变过程):

1

2

3

4

5

6

7

8

9

10

11

(1)    MOV  AX  A

存取指令,读取A地址的存储内容到AX寄存器;

(2)    IMUL  X

乘法指令,将X存储地址的内容与AX寄存器内容相乘;

(3)    MOV  A   AX

存取指令,将AX寄存器内容存储到A地址的存储单元;

(4)    MOV  AX  B

存取指令,将B地址的存储内容读取到AX寄存器;

(5)    ADD  AX  A

加法指令,将AX寄存器内容和A地址存储内容相加;

(6)    MOV   Y  AX

加法指令,将AX寄存器内容存储到Y地址的存储单元;

用助记符代替了机器码,编程是不是相对简单了一些,转换程序可以帮助编程人员从繁重的机器码编写劳动中解脱出来,转换程序也称之为汇编编译程序,其工作原理如下图所示: 

 

 blob.png

图2 汇编编译程序原理图

汇编代码完成后,需要运行编译程序,将汇编代码转换为机器代码。由于不同CPU架构的计算机,其提供的指令集不同,支持运行的机器代码也不同,因此,要运行在不同CPU架构的计算机上,就需要运行支持该CPU架构的汇编编译程序。例如IBM-PC机采用了Intel  X86系列处理器,单片机一般采用ARM架构的系列处理器,如果要让编写的汇编程序运行在IBM-PC机上,就需要调用支持IBM-PC指令集的汇编编译程序,如果要让编写的汇编程序运行在ARM架构的计算机上,就需要调用支持ARM指令集的汇编编译程序。

汇编语言相对机器语言来说,编程效率和可读性都有了较大提高。但编写程序还是过于繁琐,并且汇编语言对应一条条指令集,当指令集改变时,就得修改相应汇编语言,导致其可移植性和维护性很差,不能跨平台使用。为了解决这个问题,计算机工程师们继续创新和改进编程语言,随着计算机技术和科技的发展,计算机对语言的处理能力进一步提高,计算机工程师试图用人们能够容易识别和易懂的语言去编写程序,在20世纪50年代,出现了第一批高级语言,包括FORTRAN 、LISP、COBOL等语言,随后相继出现了C语言、C#、Java、PHP、Perl等高级语言。

高级语言的优点是其语法和结构更类似汉字或者普通英文,并且由于远离对硬件的直接操作,使得一般人经过学习之后都可以掌握编程技术。

●  根据计算直线方程流程图编写的C语言程序:

1

2

3

4

5

void  line(double a,double,x,double y)

{

     a = ax;

y = a + b;

}

●  根据计算直线方程流程图编写的Java程序:

1

2

3

4

5

6

7

8

public  class  LineQuation 

{

void  line(double a,double,x,double y)

{

a = ax;

y = a + b;

}

}

Java语言和C语言都属于高级语言,其语法和规则有相同之处,但也有很大的不同,Java是面向对象的语言,C语言是函数式语言,Java是编译兼解释性语言,C语言是编译性语言,关于语言的特性后面会有陆续介绍。

我们写程序用的是高级语言,要让我们写好的程序能够在计算机上运行,就必须要把高级语言转换成计算机能够理解的机器语言,该转换程序称为该语言的编译程序,例如C语言的转换程序可以称之为C语言编译程序,C语言编写的程序编译为Windows程序的工作过如下图所示:

blob.png

 图3 编译性语言编译过程

编写完成的C语言源代码,首先经过编译预处理器规范代码和预编译,然后通过编译器转换为汇编代码,再由汇编器转换为机器代码,最后由链接器将有关的机器代码文件进行相互链接,构建Windows程序。

Java语言编写的程序编译为Windows程序的工作过如图3-11所示,Java代码是文本文件,可以用记事本等文本编辑器直接编辑Java文件。代码编写完成后运行Java编译器,将Java源代码文件编译为class文件(字节码文件),JVM(Java虚拟机)的类装载器加载class文件,由解释器解释执行。

blob.png

图4 Java语言编译过程

程序与算法课程中,给出了计算长方形面积算法的伪代码,下面给出用Java编程语言实现算法的代码,算法的流程图参见用流程图描述算法一课。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

import java.util.Scanner;

public class RectangularArea {

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        //声明num1、num2变量

        int num1,num2;

        //声明Scanner变量,并用new运算符实例化Scanner

         Scanner sc = new Scanner(System.in);

         //提示用户输入长方形长度

         System.out.println("请输入长方形的长度");   

        //调用Scanner方法nextInt()获取用户输入

         num1 = sc.nextInt();

         //提示用户输入长方形宽度

         System.out.println("请输入长方形的宽度");   

        //调用Scanner方法nextInt()获取用户输入

         num2 = sc.nextInt();

         //判断num1和num2是否小于0,如果小于零提示用户并退出程序

         if( num1 <=0 || num2 <=0 )

         {

          System.out.println("输入的长度和宽度不能小于0");

          //退出程序

          System.exit(0);

         }

        //计算num1和num2的乘积

         int result = num1 * num2;

         //输出长方形的面积

         System.out.printf("长方形的面积为:%d",result);

    }

}

编程语言是人们与计算机的交流工具,各种编程语言语法规则虽有不同,但其核心思想都是人们通过编程语言来控制计算机,让计算机帮助人们解决各类问题。学习编程语言的目的是掌握利用计算机解决问题的能力,包括分析问题、算法设计、数据架构等能力,有了这些能力,只要学会一种编程语言,其它语言都可以无师自通。

 

课程小结

1、明确了解决问题的算法,也用流程图绘制了算法的详细步骤,下一步就要用编程语言将算法编写为程序。最早的编程语言是二进制语言,也是计算机唯一能识别的语言,就是用0和1两个数字写出的代码,计算机能够识别二进制语言,是因为计算机的指令就是用二进制来描述的,关于二进制的概念后面的课程会有讲述。

2、二进制语言都是0和1,代码晦涩难懂。假设现在让编程人员用二进制语言编写程序,估计都要疯掉。好在现在有Java、C#、python等高级语言了,写的代码类似英语,简单易懂。从二进制语言到高级语言也是逐步发展的过程,为了摆脱繁重的二进制编程劳动,提高编程效率,编程语言专家在二进制语言的基础上发明了汇编语言,汇编语言用助记符表示计算机指令,例如,用add表示两数相加指令。用的加法指令时,就可以直接使用add,而不必写一长串0和1的数字了。后来,人们又在汇编语言的基础上发明了高级语言,高级语言已经接近于人们可以直接理解的语言了。

思考与练习

1、请简要叙述高级语言、汇编语言、机器语言的区别。

2、相对二进制语言来说,汇编语言的助记符为什么能提高编程效率?

3、Java编译器的作用什么?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章