用編程語言實現算法

課程導言

【用流程圖描述算法,可以與用戶更好地交流。如果需要算法在計算上運行,就需要把算法用編程語言編寫爲程序。在程序與算法課程中,給出了計算長方形面積算法的僞代碼,僞代碼比較直觀地描述了算法的執行過程,但它不能在計算機上直接運行,需要把僞代碼用一種編程語言轉換爲程序。本篇和同學們探討如何用編程語言來實現算法以及編程語言的發展過程。通過本篇的學習,你將瞭解到編程語言是如何由二進制語言逐步發展爲高級語言的,以及用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編譯器的作用什麼?

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