官术网_书友最值得收藏!

1.1 程序設計與程序設計語言概述

計算機程序設計是一個復雜的問題,涉及許多概念,存在著不同的設計哲學和設計方法。目前存在眾多的程序設計語言用以設計計算機程序。本節介紹計算機程序設計的有關概念和程序設計語言的基本情況。

1.1.1 計算機程序設計的概念

程序(Procedure)指特定的一系列動作、行動或操作,這些活動、動作或操作必須以相同方式運行于相同環境時得出相同的結果。

計算機程序Computer Program)是指計算機或其他具有消息處理能力的裝置為完成某項任務或解決某個問題而按一定邏輯組織的動作指令的集合。在基于最常見的馮·諾依曼體系結構(又稱普林斯頓結構)的計算機上,程序通常存儲在計算機的外部存儲設備(通常是硬盤)中。運行程序時,由加載器將程序代碼加載入內存,可能還要加載數據,從而初始化成一個開始狀態,之后指令序列順序執行,直到執行一條跳轉或轉移指令,或者出現一個中斷。在大多數計算機中,操作系統(例如Windows、Linux等)會加載并且執行很多程序。馮·諾依曼體系結構的計算機是由運行程序驅動其工作的。

數據可以定義為被程序處理的信息。程序在運行過程中一般需要進行一系列的數據處理,這些數據包含使用者需要程序完成的任務或需要解決的問題的有關對象的描述及信息。

算法是指解決某個問題的嚴格方法,通常還需輔以某種程度上的運行性能分析。計算機程序可以實現為在計算機上解決問題而設計的算法。一個算法在理論上有效可行,但是有可能浪費寶貴的內存、CPU執行時間及輸入輸出設備等計算機資源,因此需要衡量和測試其性能。

計算機軟件(Software)是一系列按照特定順序組織的計算機數據、計算機程序及其文檔,是計算機中的非有形部分。計算機中的有形部分稱為硬件,由計算機的外殼、各個零件及電路組成。計算機軟件在計算機硬件上執行,計算機硬件在計算機軟件的控制下運作,從而完成需要計算機系統執行的操作和實現的功能。

軟件開發是根據用戶要求建造出軟件系統或者系統中的軟件部分的過程,包括需求捕捉與分析、系統設計、實現和測試等工作階段。

計算機程序設計(Computer Programming)或稱程序設計(Programming)是指給出利用計算機解決特定問題的計算機程序的過程,包括分析、設計、編碼、測試、排錯等不同階段。在計算機技術發展的早期,軟件開發主要就是程序設計。隨著技術的發展,軟件系統越來越復雜,軟件開發的內容越來越豐富。程序設計是軟件開發過程中的重要步驟,此外還包括數據庫設計、用戶界面設計、通信協議設計和復雜的系統配置過程。

計算機程序設計需要在硬件存儲空間、程序運行時間以及程序的可維護性等各種條件限制和相互矛盾的需求之間尋求平衡。在計算機技術發展的早期,由于機器資源比較昂貴,如何縮小存儲空間往往是設計人員關心的首要重點;而隨著硬件技術的飛速發展,計算機中數據存儲媒體的價格降低,存儲空間不再是考慮的第一要點,一些較耗時的運算也漸漸發展出以空間換取時間的模式,此時如何提高程序效率、縮短程序運行時間成為程序員的共同目標。隨著硬件性能進步,效率差距縮小,現在的軟件規模與復雜度卻日益增加,程序的結構、可維護性、重復使用性、彈性等因素顯得更加重要。

編程范型編程范式(Programming Paradigm)是指從事軟件開發的一類典型的風格,提供了(同時決定了)程序員對程序執行的看法。主要的編程范型包括指令式編程、函數式編程、過程式編程、面向對象編程等。例如,在面向對象編程中,程序員認為程序是一系列相互作用的對象,而在函數式編程中一個程序會被看作是一個無狀態的函數計算的序列。

1.1.2 程序設計語言的概念

程序通常用某種程序設計語言編寫。

程序設計語言編程語言(Programming Language)是一組用來定義計算機程序的語法規則,以標準化的交流形式和技巧向計算機發出指令。一種計算機編程語言讓程序員能夠準確地定義計算機所需要使用的數據,并精確地定義在不同情況下所應當采取的行動。

計算機硬件能夠直接識別和執行的是計算機指令序列,而程序員使用編程語言能夠在更高的層次高效準確地表達他們所想表達的目的、定義算法和數據結構。使用高級程序設計語言所編制的計算機程序,通過解釋或編譯程序轉換為計算機能夠直接識別的程序——計算機指令序列。

每一種程序設計語言都會提供一套包含語法、詞匯和含義的正式規范。這些規范通常包括數據和數據結構、指令及流程控制、引用機制和重用以及設計哲學。大多數廣泛使用或經久不衰的語言,都有負責標準化的組織以創造及發布該語言的正式定義,并討論擴展或貫徹現有的定義。

1. 數據和數據結構

現代計算機內部的數據都只以二元方式儲存,即開-關(on-off)模式。現實世界中代表信息的各種數據,例如名字、銀行賬號、度量以及二元數據,都要由程序設計語言表示為高層次的概念,例如字符串、長整數、浮點數及邏輯值。程序設計語言中專門處理數據的系統稱為程序語言的類型系統,可以分為靜態類型系統和動態類型系統。靜態類型系統又可以分為聲明形態的語言和隱式類型。大多數程序設計語言能夠在內置類型基礎上組合出復雜的數據結構形態。

2. 指令及流程控制

確定了數據之后,必須告知計算機如何對這些數據進行處理。較簡單的指令可以使用關鍵字或定義好的語法結構來完成。不同的語言利用序列系統來獲取或組合這些語句。此外,一個語言中有專門的指令來控制處理的過程(例如分支、循環等)。

3. 引用機制和重用

當程序運行時,程序代碼及數據就會加載到內存。計算機內部對內存的識別和存取是使用內存地址進行的。但是,同一個程序在不同的計算機系統運行及在同一個計算機系統的不同時間運行,所分配到的內存地址一般是不同的,一般在編寫程序時是無法確定的。直接訪問內存地址既不方便,可能操作系統也不允許。因此,許多程序設計語言采用引用機制來間接使用內存。最常見的引用方法是在程序中命名變量和程序段名字(宏、函數、過程和方法等),然后交由程序加載器和運行時系統自動為這些變量和程序段名字分配內存并確定其地址。程序中只需通過名字重復使用變量和程序段所分配的內存。

4. 設計哲學

匯編語言和機器語言程序都是直接對硬件操作,只是匯編語言采用了英文縮寫標識符代表機器指令而更容易識別和記憶。編程者需要將每一步具體的操作用命令的形式寫出來。匯編程序的每一句指令只能對應實際操作過程中的一個很細微的動作。總之,匯編語言和機器語言采用了面向計算機硬件指令的設計哲學,使編程者采用與計算機內部工作原理和工作過程相同的思維方式,直接使用計算機硬件指令設計程序。

結構化高級程序設計語言,如FORTRAN、C和Pascal等采用了三種重要控制結構及一些基本數據類型,將許多相關的機器指令合成為單條程序語言指令,且去掉了與具體操作有關但與完成工作無關的細節,例如使用堆棧、寄存器等,大幅度簡化了程序中的指令,使編程者可以脫離機器層次,在更抽象的層次上表達意圖,使程序員采用一般性的解題步驟而非計算機內部工作步驟的方式,設計數據結構和實現算法。此類程序設計語言采用的是面向問題解決過程和一般步驟的設計哲學,注重算法的設計,并圍繞算法設計數據結構。

隨著程序規模的不斷擴大,20世紀60年代末期出現了軟件危機,在當時普遍采用的結構化程序設計模型中無法克服隨著程序代碼的擴大而錯誤也級數般擴大的問題,以致到了無法控制的地步,隨之出現了一種新的程序設計思想和程序設計模型——面向對象程序設計,相應地產生了面向對象程序設計語言,如Eiffel、C++和Java語言。面向對象程序設計語言采用了面向對象程序設計哲學,即程序是由具有各種不同屬性的對象以及對象之間的消息傳遞構成的,數據和對數據的操作都是對象的成員。這種思想符合人們的一般思維方式,例如派車去機場接某位專家來校,首先會從學校的貨車、大轎車和小轎車三類車輛中選擇小轎車類,然后派出某個具體的小轎車及其司機開車去接,而不會首先想接人的小轎車怎么加油、在哪兒停車、司機怎么駕駛這些具體細節問題。目前已經證實,面向對象程序設計提高了程序的靈活性和可維護性,并且在大型項目設計中廣為應用。面向對象程序設計方法更易于學習,使程序更加便于分析、設計和理解。

1.1.3 程序設計語言的選擇

人們發明的程序設計語言已超過上千種,可以稱得上相對“主流”(有人用、有文檔)的程序設計語言至少有600種。目前仍然不斷地有新程序設計語言出現,且許多已有程序設計語言也在不斷地革新。盡管人們多次試圖創造一種通用的程序設計語言,卻沒有一次嘗試是成功的。由于設計程序語言的初衷不同、運行成本存在差異以及語言學習曲線的追求不同,一直以來多種不同的編程語言持續存在并不斷發展。

某一種編程語言編制的程序可能需要較多的時間進行開發,另一種編程語言編制的程序可能產生的代碼較長,第三種編程語言編制的程序可能在CPU中運行的時間較長。有些語言在特定的領域十分受歡迎,例如,C語言擅長接近計算機硬件的底層編程,同時也是一種通用的結構化高級程序設計語言;COBOL語言在公司的數據中心仍相當常用,多半是在大型計算機上運行;FORTRAN語言常用在科學及工程應用方面;R語言用在大數據分析方面則十分方便。

流行程度可能是初學者選擇程序設計語言的重要參考。有許多不同的方式量測不同編程語言使用的程度:

(1)計算征集人才廣告中提到各編程語言的次數。

(2)計算講授或描述各編程語言書籍賣出的數量。

(3)統計各編程語言目前仍在使用代碼的長度。

(4)利用搜索引擎計算找到不同編程語言的次數。

TIOBE編程語言社區排行榜是編程語言流行趨勢的一個指標,每月更新。這份排行榜的排名基于互聯網上有經驗的程序員、課程和第三方廠商的數量。排名使用著名的搜索引擎(諸如Google、MSN、Yahoo!、Wikipedia、YouTube以及Baidu等)進行計算。如表1.1、圖1.1和表1.2所示是該排行榜2017年11月的部分內容。

表1.1 前10名編程語言排行榜長期走勢(1987—2017)(該位次取自12個月的平均值)

圖1.1 前108名編程語言TIOBE指數走勢(2001—2017)

表1.2 2017年11月編程語言排行榜前20名榜單

對于程序設計語言的初學者而言,需要明確自己的應用領域或期望,盡量選擇適合該領域應用的長期發展的采用先進設計哲學和方法的主流程序設計語言。

主站蜘蛛池模板: 宜章县| 仙居县| 神农架林区| 广宁县| 保山市| 天峻县| 彭州市| 江西省| 无锡市| 东乡| 常德市| 嘉兴市| 新昌县| 陕西省| 增城市| 阳原县| 岚皋县| 巴彦淖尔市| 高尔夫| 四川省| 新巴尔虎右旗| 石门县| 曲靖市| 红桥区| 林口县| 克拉玛依市| 威海市| 邻水| 扶余县| 宣恩县| 麟游县| 保定市| 偏关县| 伊金霍洛旗| 湘乡市| 屯昌县| 新巴尔虎右旗| 桃源县| 庆云县| 晋中市| 柯坪县|