計算機程式設計
| 一位華夏公益教科書使用者建議將競賽程式設計合併到本書中。 在討論頁面上討論是否應該進行合併。 |

計算機程式設計是編寫有用、可維護和可擴充套件的原始碼的工藝,這些程式碼可以被計算系統解釋或編譯以執行有意義的任務。 計算機程式設計可以使用多種語言執行,從高階語言到直接用低階機器碼編寫(即更直接控制計算機硬體細節的程式碼),一直到編寫微程式碼(直接控制計算機電子器件)。
使用程式語言和標記語言(如XHTML和XForms)需要一些相同的技能,但使用標記語言通常不被認為是“程式設計”。 然而,許多標記語言允許包含指令碼,例如許多HTML文件包含JavaScript。 有一些例外情況,標記語言確實代表了程式設計,例如SuperX++(http://xplusplus.sourceforge.net/)和o:XML (http://www.o-xml.org/)
計算機程式設計是更大的學科(稱為軟體工程)的一部分,其中包括軟體製作的幾個不同方面,包括設計、構建和質量控制。 本書的主題是軟體構建,即程式設計。 計算機程式設計對於那些對計算機科學感興趣的人來說也是一項有用的技能(儘管並不總是必要的)。 軟體工程專門研究製作軟體,而計算機科學往往傾向於更理論或數學問題。
許多人認為他們必須選擇一種特定的程式語言才能成為程式設計師,他們相信他們只能做那種語言。 他們會問自己,“我應該成為一個C程式設計師還是一個Java程式設計師?” 這是一個完全錯誤的問題。 正確的問題是“我怎樣才能成為一個優秀的程式設計師?” 不幸的是,就業市場透過公司為具有特定(因此有限的)計算機語言技能的員工釋出招聘廣告以及人力資源 (HR) 處理招聘響應的方式,極大地助長了人們對計算機程式設計的誤解,因為他們沒有程式設計背景。
關於優秀的程式設計師對特定計算機語言的瞭解,我們可以說幾點。 首先,許多語言基於相同的基本構建塊。 學習一門語言應該被視為一種獲取這些概念的方式,而不是語言或機器特定的技術。 其次,優秀的程式設計師通常精通不止一門語言,因為發現解決問題的不同方法本身很有趣且有用。 掌握多種語言甚至不止一門語言並非必要——程式設計師可以擅長一門語言,並且只對其他語言有一個模糊的工作概念。 瞭解解決計算機問題的多種方法(也稱為演算法)是有用的。 一種演算法是完成任務的一組明確定義的指令,而瞭解多種語言意味著能夠以多種不同的方式列出計算機指令。 由於計算機程式語言有很多共同點,因此一旦掌握了一種程式語言,通常很容易學習新的程式語言。
那麼你如何開始呢? 一種合理的技術就是選擇一門語言並開始學習。 不幸的是,我們無法為所有人提供適用於所有用途的正確計算機語言。 問十位程式設計師你應該學習哪種語言,你會得到十個不同的答案。 考慮到華夏公益教科書的協作性質,你可能會得到與網站上程式語言書籍數量一樣多的答案。
對於不熟悉計算機程式設計的人來說,存在一個普遍的誤解,即所有程式語言本質上都是一樣的。 在某種意義上,這是正確的,因為所有數位電子計算機都將程式語言轉換為一系列稱為二進位制或機器碼的零和一。
雖然主流個人計算機語言往往源於特定傳統並且非常相似(因此產生了這種誤解的流行),但有些語言屬於不同的正規化,這些正規化提供了截然不同的程式設計體驗。 使用Java進行程式設計與使用組合語言進行程式設計有很大不同,而使用Haskell或Prolog或Forth等語言進行程式設計也有很大不同。
在《美國科學家》雜誌文章《分號戰爭》[1]中,Brian Hayes 將語言分為四類:命令式、面向物件、函式式和宣告式。 命令式和麵向物件語言往往在主流中使用,而函式式和宣告式語言往往在學術界使用。 函式式和宣告式程式設計愛好者可能會爭辯說,這些正規化領先於主流 20 年,並且在許多方面都優於主流; 然而,主流語言倡導者可能會反駁說,這些正規化很難學習,或者由於其不受歡迎的性質,在實踐中並不實用等等。 我們不會對誰對誰錯發表任何評論,但至少,我們建議熟悉這四種主要正規化是一項非常有價值的練習。

在計算機領域,所有事物都是透過程式設計來製造的,並且主要由程式設計來運作。 儘管程式設計是任何計算機或應用程式功能的重要組成部分,但並非所有程式語言都相同。 事實上,它們彼此之間非常不同,具有不同的用途、功能和不同的複雜程度。 程式語言最基本的說法是,它是一組用於編寫計算機程式的規則或指南。 即使是你編寫程式,你可能也需要特定型別的軟體或程式來使用你所使用的語言。 可以使用的程式語言型別很多,每種語言都有不同的規則集。 程式設計有兩個基本類別。 有低階語言和高階語言,兩者之間的區別在於低階語言通常使用 0 和 1,這有效地使計算機能夠快速理解需要執行的操作。 高階語言更容易編寫,因為它們更接近英語,並且編寫起來更靈活,儘管這些可讀性也有不同的級別,並且這些語言的類別也可以編寫。 一些例子是 Visual Basic、C++ 和 Java。
常見概念
[edit | edit source]程式語言往往有很多共同的概念。可以在下表中檢視反覆出現的基本概念以及它們在各種語言中的表達方式。
←
語言概念表以及它們在各種語言中的表達方式。
| 維基程式碼 | Ada | C | C++ | Java | C# | Perl | Delphi | PHP | Python | VB | VBNet | J2ME |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 語句 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 |
| 控制語句 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 沒有頁面 |
| 變數 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 沒有頁面 |
| 型別 | 頁面在此 | 沒有頁面 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 沒有頁面 | 沒有頁面 |
| 型別轉換 | 沒有頁面 | 沒有頁面 | 頁面在此 | 頁面在此 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 |
| 數學計算 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 沒有頁面 | 頁面在此 | 沒有頁面 | 頁面在此 | 沒有頁面 | 頁面在此 | 頁面在此 | 沒有頁面 |
| 過程和函式 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 沒有頁面 | 頁面在此 | 沒有頁面 | 頁面在此 | 頁面在此 | 頁面在此 | 沒有頁面 | 沒有頁面 |
| 函式過載 | 頁面在此 | 沒有頁面 | 頁面在此 | 頁面在此 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 頁面在此 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 |
| 結構和樣式 | 頁面在此 | 頁面在此 | 頁面在此 | 沒有頁面 | 頁面在此 | 頁面在此 | 沒有頁面 | 頁面在此 | 沒有頁面 | 頁面在此 | 頁面在此 | 沒有頁面 |
| 字串操作 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 沒有頁面 | 頁面在此 | 沒有頁面 | 沒有頁面 | 頁面在此 | 頁面在此 | 沒有頁面 | 沒有頁面 |
| 輸入和輸出 | 頁面在此 | 頁面在此 | 頁面在此 | 沒有頁面 | 沒有頁面 | 頁面在此 | 沒有頁面 | 頁面在此 | 頁面在此 | 沒有頁面 | 沒有頁面 | 沒有頁面 |
| 記憶體管理 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 |
| 錯誤處理 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 頁面在此 | 頁面在此 | 沒有頁面 | 沒有頁面 |
| 面向物件程式設計 | 頁面在此 | 沒有頁面 | 頁面在此 | 頁面在此 | 頁面在此 | 頁面在此 | 沒有頁面 | 頁面在此 | 頁面在此 | 頁面在此 | 沒有頁面 | 沒有頁面 |
| 泛型程式設計 | 頁面在此 | 沒有頁面 | 頁面在此 | 頁面在此 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 |
| 併發程式設計 | 頁面在此 | 沒有頁面 | 頁面在此 | 頁面在此 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 |
| 包和模組 | 頁面在此 | 頁面在此 | 沒有頁面 | 頁面在此 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 頁面在此 | 沒有頁面 | 沒有頁面 | 沒有頁面 |
| 庫 | 頁面在此 | 頁面在此 | 頁面在此 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 |
| 組合語言 | 頁面在此 | 頁面在此 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 | 沒有頁面 |
要檢視各種程式語言中語法的比較,請參閱“Hello World”示例。要檢視按語法術語和模式排列在一起的各種計算機語言列表,請參閱維基百科的計算機語法模式列表。
程式設計技能
[edit | edit source]計算機程式設計實際上就是解決問題。事實證明,你在現實世界中遇到的許多問題實際上只是一些更普遍問題的特例。幸運的是,許多這些問題已經由計算機科學家研究了很長時間,有時會產生可以證明無懈可擊的解決方案,有時會產生足夠滿足日常需求的解決方案。簡而言之,學習一門語言會給你帶來技能,但學習資料結構和演算法會教你如何明智地運用這些技能。
資料結構和演算法
[edit | edit source]與語言相關的技能
[edit | edit source]- 面向代理程式設計
- 基於Ars的程式設計
- 面向方面的程式設計
- 基於元件的軟體開發
- 併發程式設計
- 基於約束的程式設計
- 契約式設計
- 分散式程式設計
- 嵌入式程式設計
- 事件驅動程式設計
- 泛型程式設計
- 後物件程式設計
- 關係式程式設計
- 符號程式設計
- 系統程式設計
面向應用程式程式設計
[edit | edit source]面向平臺程式設計
[edit | edit source]功能
[edit | edit source]程式設計史
[edit | edit source]總體趨勢
[edit | edit source]特定語言
[edit | edit source]以下語言值得特別關注,它們是結構化程式語言和麵向物件程式設計發展過程中的重要語言。它們值得理解,因為它們引入了新的概念。
- ALGOL
- 是第一種結構化程式語言,因此是所有現代命令式語言的基礎。它圍繞著塊的概念構建,塊由 BEGIN 和 END 限定,包含宣告和語句。ALGOL 是一種遞迴的通用語言,包括遞迴呼叫,當時人們認為這在 FORTRAN 和 COBOL 等語言中太難了。ALGOL 是一種堆疊語言,因此當進入塊時,宣告的變數被壓入堆疊,當塊退出時,堆疊被縮減。沒有宣告的塊實際上不是塊,而是複合語句,不會造成堆疊構建開銷。ALGOL 最初被開發為ALGOL 58,基於形式化的BNF(巴科斯-諾爾正規化) 語言設計表示法。ALGOL-60 是一個修訂版,它構成了許多其他語言的基礎,例如ALGOL-68、ALGOL-W、Pascal、Modula-2、Oberon、C、C++、Java、Simula、Ada 和 Eiffel。ALGOL-60 是第一種用於Burroughs B5000 堆疊機器作業系統中系統程式設計的語言,在 1960 年代早期(當所有其他都用匯編語言程式設計,而 ALGOL 在 2006 年仍在使用當前 ALGOL 手冊)。學習 ALGOL 將教會你塊結構語言和結構化程式設計概念的基礎。
- Simula
- 是 1967 年開發的第一種面嚮物件語言,它以 ALGOL-60 為基礎(就像 C++ 使用 C 一樣)。它最初被設想為一種模擬語言(因此得名),用於對現實世界系統進行建模。由於 ALGOL 是一種塊結構語言,塊在被呼叫時被壓入堆疊,並在退出時從堆疊中刪除,因此 Simula 使程式擺脫了這種限制。因此,塊可以被進入,但當代碼退出時,該塊會保留在堆中,而不是堆疊中 - 因此物件誕生了。但是,與其他語言中的記錄和結構(結構體)不同,過程與這個儲存的塊相關聯,因此程式設計師可以定義一個完整的代數來操縱實體。因此,在外部塊(類)中宣告的變數在原始呼叫塊程式碼(現在將被視為建構函式或建立例程)之後仍然存在。類中的區域性變數和過程的引數會在呼叫時被壓入堆疊,並在退出時被彈出,但會操縱物件的持久狀態。類設施可以透過繼承進行抽象。Simula 還包含一個複雜的併發正規化。學習 Simula 將教會你面向物件和模擬概念以及併發概念以及協程和協作程序的使用。
- Smalltalk
- 由Adele Goldberg、Alan Kay(Windows 的真正發明者)和 Xerox PARC 的其他人在開發。它是一種面向物件的語言,具有自然語言語法。它是一種無型別語言,因此非常靈活和動態,可以快速完成程式碼,但會導致執行時異常,這些異常在編譯時會被型別化語言捕獲。它的概念是 Objective-C 的基礎。學習 Smalltalk 將教會你使用非常不同的語法的無型別語言中的面向物件程式設計。
- C++
- C++(發音為“see plus plus”)是一種通用的、面向物件的、靜態型別的、自由形式的、多正規化程式語言,支援程序式程式設計、資料抽象和泛型程式設計。在 1990 年代,C++ 成為最流行的計算機程式語言 之一。
- Bjarne Stroustrup 來自貝爾實驗室,是 C++(最初名為“帶類的 C”)的設計者和最初的實現者,他在 1980 年代將其作為對 C 程式語言 的增強。增強從新增 類 開始,隨後又添加了許多特性,包括 虛擬函式、運算子過載、多重繼承、模板 和 異常處理,這些以及其他特性在關於該主題的幾個 Wikibooks 中有詳細介紹。
- C++ 程式語言標準於 1998 年被批准為ISO/IEC 14882:1998,其當前版本是 2003 年版本,ISO/IEC 14882:2003。
- 1998 年的 C++ 標準包含兩部分:核心語言和標準庫;後者包括 標準模板庫 和 C 的標準庫。許多 C++ 庫存在於標準之外,例如 Boost。此外,用 C 編寫的非標準庫通常可以被 C++ 程式使用。
- C++ 中引入的特性包括宣告作為語句、函式式強制轉換、new/delete, bool、引用型別、const, inline函式、預設引數、函式過載、名稱空間、類(包括所有與類相關的特性,例如繼承、成員函式、虛擬函式、抽象類和建構函式)、運算子過載、模板、::運算子、異常處理、執行時型別識別,以及在幾種情況下進行更多型別檢查。以兩個斜槓("//")開頭的註釋最初是 BCPL 的一部分,並在 C++ 中被重新引入。C++ 的幾個特性後來被 C 採用,包括const, inline、在for迴圈中的宣告,以及 C++ 風格的註釋(使用//符號)。
- Visual Basic
- Visual Basic 是世界上最常用的程式語言之一。這是因為它簡單易用。BASIC 代表初學者通用符號指令程式碼,它是在美國達特茅斯學院為學生開發的。Visual Basic 擴充套件了語言的功能,因此建立視窗、標題欄、輸入框、標籤、訊息框和按鈕與從工具欄上拖動您要編碼的專案到表單(本質上是一個空白視窗)一樣簡單。VB 的最基本功能之一是訊息框命令。如果我想讓一個訊息框出現並顯示選定的訊息,我只需要輸入:msgbox "hello world"
附加資訊
[edit | edit source]編輯器
[edit | edit source]編輯器只是一個文字程式,比如記事本。據說程式設計師最好的朋友是編輯器。一個好的編輯器應該是輕量級的,只包含必要工具,並且應該支援您語言的語法高亮顯示。
我們有教學書籍的好的編輯器的例子有(按字母順序)
- Emacs
- 一個可擴充套件的、可定製的、自由/自由的文字編輯器 - 等等。它的核心是一個 Emacs Lisp 直譯器,它是 Lisp 程式語言的一種方言,具有支援文字編輯的擴充套件。
- Vim
- 這個編輯器的縮寫是 Vi Improved,它是根據經典的 Unix 編輯器 vi 建模的。但是,Vim 是一款更加現代的編輯器,它有一個可選的圖形介面,並且有很多 vi 沒有的特性,這使得它成為有 vi 使用經驗的人的首選編輯器。
有關更多文字編輯器,請參閱維基百科的 文字編輯器類別。
工具
[edit | edit source]- gcc,一個免費的編譯器集合(Ada、C、C++、Fortran、Java、Objective-C、Objective-C++)。
- make,最流行的構建指令碼語言。
- Apache Ant,一個基於 XML 的構建指令碼語言,類似於 Make。
- 有些人會在程式設計時使用整合開發環境 (IDE)。
- Eclipse,一個軟體框架,用作 Java、C++、PHP、Python 和其他幾種語言的 IDE。
- 維基百科:整合開發環境比較 列出了每種流行程式語言的 IDE。
- Microsoft Visual Studio,一個 IDE(包含編譯器)。支援 C、C++、C++/CLI(透過 Visual C++)、VB.NET(透過 Visual Basic .NET)、C#(透過 Visual C#)和 F#(從 Visual Studio 2010[9] 開始)。對其他語言的支援,例如 Python、Ruby、Node.js 和 M 等,可以透過單獨安裝的語言服務獲得。它還支援 XML/XSLT。
- 有些人使用版本控制系統。這些系統讓回答“上週的版本可以工作,這周的版本不行。發生了什麼變化?”變得容易得多。
流行的庫
[edit | edit source]Unix 原生
Windows "原生"
跨平臺
- Allegro
- wxWidgets
- OpenGL
- Qt - 流行的面向物件的 C++ GUI 框架。 KDE 是基於它的。各種語言的繫結都可用。
- XUL 基於 XML 的 GUI。
- 簡單直接媒體層 (SDL)
格式參考
[edit | edit source]其他
[edit | edit source]- 編碼風格
- 除錯
- UNIX 中的 C 網路程式設計
- 計算機程式設計入門
- 初學者程式設計論壇
- Hello World 示例 許多程式語言中的 Hello World 程式示例
參考文獻
[edit | edit source]- 如何設計程式
- 計算機程式的結構與解釋 (影片)
- 維基文庫:如何像計算機科學家一樣思考 及其翻譯成 Python 的版本,Think Python
- 軟體工程知識體系 (SWEBOK)