1. 程式人生 > >Linux C 編程學習筆記-01-程序和編程語言

Linux C 編程學習筆記-01-程序和編程語言

任務 筆記 output 3rd Language sse 讀書 執行文件 低級語言

程序和編程語言

《Linux C 編程一站式學習》是亞嵌教育的宋勁杉老師編寫的開源 C 語言學習書籍,筆者從中收獲了很多知識,以下是筆者的讀書筆記。

計算機是人們為了計算復雜的數學運算而被制造出來的。其工作流程為,先從程序員那獲取計算任務,之後將計算任務分析、計算,最後將計算結果輸出給程序員。

那程序員是如何將計算任務告知給計算機的呢?

答案是通過編寫一個程序(Program)。程序員通過使用編寫程序的方式來告訴計算機應該如何來完成一個計算任務。而程序由一系列的指令(Instruction)組成,指令是指示計算機做某種運算的命令,指令的類型有:

  • 輸入(Input)

    從鍵盤、文件或者其他設備獲取數據

  • 輸出(Output)

    把數據顯示到屏幕,或者存入一個文件,或者發送給其他設備

  • 基本運算

    執行最基本的數學運算和數據存取

  • 測試和分支

    測試某個條件,然後根據不同的測試結果執行不同的後續指令

  • 循環

    重復執行一系列的操作

那程序員是用什麽來編寫程序的呢?

答案是編程語言(Programming Language)。我們知道,計算機是由數字電路組成的運算機器,它只能對數字進行運算。因此,在計算機內部,符號、圖片、音頻、視頻包括指令都是以數字的形式存在的。

編程語言分為低級語言(Low-level Language)和高級語言(High-level Language)。

機器語言(Machine Language)和匯編語言(Assembly Language)屬於低級語言,這兩種語言直接使用計算機指令來編寫程序。

而 C、C++、Java、Python 等屬於高級語言,這些語言使用語句(Statement)來編寫程序。

語句是對計算機指令的抽象。例如,在 C 語言中一條 a = b + 1; 語句在匯編和機器語言中的表示形式如下:

在 C 語言中:

a = b + 1;

在匯編語言中:

mov     0x804a01c, %eax
add     $0x1, %eax
mov     %eax, 0x804a01c

在機器語言中:

a1 1c a0 04 08
83 c0 01
a3 18 a0 04 08

由於計算機只能理解數字,因此早期的程序員只能使用機器語言來編寫程序,但是使用這種語言來編寫程序很麻煩,因為需要查找大量的表格來確定每個數字代表著什麽意思,所以匯編語言出現了。在匯編語言中,每一種指令都對應著一個相應的助記符(Mnemonic),程序員通過使用助記符的方式來編寫匯編程序,之後將編寫好的匯編程序提交給匯編器(Assembler),由匯編器來查表將助記符替換成數字,從而將匯編語言翻譯成機器語言。

但是使用匯編語言編寫的程序有一個缺點,那就是不具有可移植性(Portable)。因為不同的計算機平臺可能對應著不同的計算機體系結構,而不同的計算機體系結構對應著不同的指令集(Instruction Set)。這意為著如果一個程序要在體系結構不相同的計算機平臺上運行,那麽程序員就需要為每一種平臺編寫一個符合該平臺指令集版本的程序。

因此,高級語言出現了。與低級語言直接使用機器指令來編寫程序不同,高級語言使用語句來編寫程序。語句是對機器指令的抽象,因此使用高級語言編寫的程序更具有可讀性。而且高級語言還具有低級語言所不具有的可移植性或平臺無關性(Platform Independent)。要實現可移植性,只需要在每種計算機平臺上提供相應的高級語言編譯器即可。

以 C 語言為例,其編譯執行過程如下:

  1. 程序員使用 C 語言編寫程序

  2. 將寫好的 C 程序提交給 C 編譯器

  3. C 編譯器將 C 程序編譯成可執行文件

  4. 操作系統的加載器加載運行新生成的可執行文件

在編程語言的發展過程中,機器語言被稱為第一代編程語言(1GL,1st Generation Programming Language),匯編語言被稱為第二代編程語言(2GL,2nd Generation Programming Language),C、C++、Java、Python 等被稱為第三代編程語言(3GL, 3rd Generation Programming Language),目前還有 4GL 或 5GL 的概念。3GL 的編程語言屬於命令式(Imperative)語言,4GL 和 5GL 的編程語言屬於聲明式(Declarative)語言。命令式語言使用語句告訴計算機每一步具體怎麽做,而聲明式語言更多描述的是要做什麽,至於怎麽做,由編譯器決定。

Linux C 編程學習筆記-01-程序和編程語言