第一章 引言

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/smilewsw/article/details/50999858
1.1 什麼是程序設計語言(Programming Language)

定義:程序設計語言是一套表達 計算 過程的符號系統,其表達形式能夠同時被 計算機 和  所 理解
計算:計算機能夠完成的任何操作
機器可讀:語言結構簡單,以便於翻譯成機器語言。
                  翻譯——有一個確定的,無二義性的算法來實現語言編譯;翻譯算法的複雜性不能太高
                  上下文無關文法
人類可讀:語言能夠對計算機的各種操作進行高度抽象,使得一個對底層硬件一無所知的人也能夠用它編寫程序。


1.2 程序設計語言中的抽象(Abstraction)

數據抽象:對計算機各種數據屬性的抽象,也就是數據類型。常見的有字符串、數、搜索樹等。
                  這些數據類型都是進行計算的對象。
控制抽象:對計算機執行的動作序列的抽象。常見的有循環、分支轉移、子程序調用等。

還可以根據所包含的信息量將抽象劃分成各個層次。
基本抽象包含最小的局部計算信息;
結構抽象則包含更多的全局信息,能反映程序的某種結構;
單元抽象(unit abstraction)則包含整個程序或程序包的信息,它能被其他程序所使用。

1.2.1 數據抽象

基本抽象——對數據在計算機內部的具體表現方式進行抽象
例如:整數在計算機內部通常使用反碼錶示,整數的加法和乘法運算由相應的機器指令直接處理。
           數據在內存中存儲地址通常被抽象成一個標識符(變量)
           數據類型被抽象成一個名詞,如int, integer, real, float等
結構抽象——將各種相關的數據抽象爲一種數據類型
例如:結構體,數組
單元抽象——大型軟件項目中,相關的程序代碼通常被封裝成一個個功能模塊
這種抽象包括了代碼訪問權限的設置——數據封裝或者信息隱藏    例如:“類”
軟件重用  例如:被做成函數庫,供其他程序調用的各種圖形界面的控件和容器

1.2.2 控制抽象

基本抽象——典型的控制抽象就是將幾句相關的機器指令組合成能夠被人類理解的抽象語句
例如:x=x+3 表示把x標識的內存區域中的數據取出,加上3後再賦值給由x標識的內存區域
結構抽象——將程序分解成指令集合,並嵌套於管理他們執行的測試語句之中
例如:if-then-else語句,case語句,switch語句
好處:各種控制結構能夠相互嵌套
一個更強的結構控制機制——過程/函數/子程序調用     過程聲明與過程激活
單元抽象——進一步將一組相關的過程組合起來構成一個獨立的單元    模塊、包
單元抽象是對程序的控制機制進行抽象,而數據抽象則是對數據在計算機內部的存儲和運算進行抽象。

值得一提的是,幾乎所有抽象機制的目的都是爲了讓人能更容易地讀懂程序
如果某種程序設計語言只是爲了描述計算的話,那麼它只需要包含圖靈機上的那些操作就夠了。
圖靈機能夠完成任何計算機上所執行的運算任務。圖靈完備只需要很少的語言機制即可實現。
一個語言是 圖靈完備 的,如果它包含整型變量、算術運算和順序執行語句,其中後者包括賦值、選擇和循環語句。


1.3 計算範例

程序設計語言始於對計算機指令的模擬和抽象。因此,計算機的體系結構總是影響着計算機上運行的程序。
馮 · 諾依曼體系結構:有一個能逐條執行存儲在內存中的指令序列的中央處理器。
所以基於馮 · 諾依曼體系結構的語言都有一種典型的特徵,就是用變量代表內存中的數據,用賦值對內存中的數據進行操作。
命令式語言/過程式語言:同時具有這三種特性,即順序執行使用變量表示內存中的數據 和 以賦值語句改變內存數據
馮 · 諾依曼瓶頸命令式語言的這種 串行執行  對單一內存變量進行賦值 的特性 限制了語言對 並行計算 的表示能力。我們無法使用命令式語言對許多數據同時進行計算,也無法處理那些與執行次序無關的運算。

函數式範例——來源於數學中的lambda演算
邏輯式範例——來自符號邏輯

1.3.1 面向對象程序設計(C++,JAVA)

所謂 對象 ,就是指一組相關的變量和操作這組變量的運算的集合,也就是數據和操作的集合。
面向對象技術將 計算 表示爲一組對象之間的交互或通信,每個對象都可以被看做是一臺虛擬的計算機,它擁有自己獨立的內存區域和操作。
類是具有相同屬性的對象的模板,對象是類的實例。

1.3.2 函數式程序設計(Ada,Scheme,Haskell)

函數式計算範例基於函數求值機制。函數式語言也成爲應用式語言
函數求值是函數式語言最基本的機制,它包括 參數傳遞計算  結果返回
函數式計算範例中 沒有 變量 和 賦值 的概念。它將注意力集中在數據和函數上,而不是內存區域。
另外,操作的重複執行 不是使用循環刻畫,而是使用 遞歸
好處:程序變得和底層計算機結構體系無關、 函數式編程由於基於數學理論,程序正確性易於證明。

一種編程語言是圖靈完備的,如果它包含 整型數據 和 關於整型數據的 算術操作,並且 能夠利用已有函數定義新函數


1.3.3 邏輯式程序設計(Prolog)

函數式計算範例基於符號邏輯
在邏輯式語言中,程序是由一組結果必須被滿足的規則,而不是一組由計算機順序執行的命令組成
純邏輯語言根本不需要諸如循環或選擇等控制結構。控制有底層系統直接支持。邏輯語言需要的只是 能夠描述計算屬性的語句
因此,邏輯編程有時候也被叫做 聲明式編程


1.4 語言定義

語言的定義大致可以分成兩個部分:語法  語義
語法:決定了一些語言要素如何組合在一起構成其他的語言要素。
           幾乎所有語言都使用上下文無關文法進行語法定義。
語義:很難精確定義。包括 操作語義指稱語義  公理語義 

1.5 語言翻譯

直接執行程序的翻譯器被稱爲 解釋器,而把程序翻譯成另外一種形式的翻譯器被稱爲 編譯器

處理機制:
1)詞法分析程序(掃描程序)將源程序從一個沒有意義的字符串變成一個有意義的記號流,記號通常包括關鍵字、標識符和常數。
2)語法分析程序對這些記號的邏輯結構進行分析。
3)語義分析程序根據語法分析的結果生成中間代碼或者目標代碼。

語言的翻譯程序還要維護 程序運行時環境,包括 變量存儲位置  過程調用堆棧 等信息。
解釋器通常將運行時環境的管理作爲它對程序執行時控制的一部分。而編譯器則通過在目標代碼中插入控制命令來間接維護運行時環境。
語言也可以有一個預編譯處理器,它負責處理一些編譯開始之前的工作。

程序有各種屬性,那些在程序開始執行之前就可以確定的屬性稱爲 程序的靜態屬性,而那些只有等到程序運行過程中纔可以確定的屬性稱爲 程序的動態屬性。包含許多動態屬性的語言就比較適合解釋執行;而包含較多靜態屬性的語言則適合編譯執行。命令式語言有許多靜態屬性,所以它們大多是編譯執行的,而函數式語言和邏輯語言有較多的動態屬性,所以他們大多是解釋執行的。

語言的靜態屬性和動態屬性對 運行時環境 也有影響。如果一種語言對所有變量內存都是靜態分配的,那麼可以使用完全靜態的運行時環境。相反,針對那些對動態屬性要求很高的語言,使用完全動態環境。介於兩者之間的就是 同時具有靜態和動態特點的堆棧結構 的運行時環境。

效率也會影響選擇:解釋器總比編譯期慢,因爲解釋器需要模擬程序在實際機器上的運行情況。編譯器可以採用 多變掃描 的方法仔細分析程序結構,從而對目標代碼進行優化和加速。

翻譯器的一個重要性能指標就是它發現源程序中錯誤的能力。
錯誤是按照它們被發現時翻譯器所處的階段進行分類的:詞法錯誤(詞法分析階段)、拼寫錯誤(語法分析階段)、語義錯誤


1.6 語言設計

設計出一種對人而言表達能力非凡且易於理解,對機器而言精確簡單且易於翻譯的語言是巨大的挑戰。
在程序設計語言中 引入抽象的主要目的是控制編程的複雜程度。人類智能同時處理一定量的工作。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章