⑴ 編程有哪些語言各有什麼特點
C,C++,JAVA,VB,VC,FoxPro,Delphi,SQL,PHP,ASP,JSP等.
下為引用,介紹的很詳細了。
計算機語言的種類非常的多,總的來說可以分成機器語言,匯編語言,高級語言三大類。
電腦每做的一次動作,一個步驟,都是按照以經用計算機語言編好的程序來執行的,程序是計算機要執行的指令的集合,而程序全部都是用我們所掌握的語言來編寫的。所以人們要控制計算機一定要通過計算機語言向計算機發出命令。
計算機所能識別的語言只有機器語言,即由0和1構成的代碼。但通常人們編程時,不採用機器語言,因為它非常難於記憶和識別。
目前通用的編程語言有兩種形式:匯編語言和高級語言。
匯編語言的實質和機器語言是相同的,都是直接對硬體操作,只不過指令採用了英文縮寫的標識符,更容易識別和記憶。它同樣需要編程者將每一步具體的操作用命令的形式寫出來。匯編程序通常由三部分組成:指令、偽指令和宏指令。匯編程序的每一句指令只能對應實際操作過程中的一個很細微的動作,例如移動、自增,因此匯編源程序一般比較冗長、復雜、容易出錯,而且使用匯編語言編程需要有更多的計算機專業知識,但匯編語言的優點也是顯而易見的,用匯編語言所能完成的操作不是一般高級語言所能實現的,而且源程序經匯編生成的可執行文件不僅比較小,而且執行速度很快。
高級語言是目前絕大多數編程者的選擇。和匯編語言相比,它不但將許多相關的機器指令合成為單條指令,並且去掉了與具體操作有關但與完成工作無關的細節,例如使用堆棧、寄存器等,這樣就大大簡化了程序中的指令。同時,由於省略了很多細節,編程者也就不需要有太多的專業知識。
高級語言主要是相對於匯編語言而言,它並不是特指某一種具體的語言,而是包括了很多編程語言,如目前流行的VB、VC、FoxPro、Delphi等,這些語言的語法、命令格式都各不相同。
高級語言所編制的程序不能直接被計算機識別,必須經過轉換才能被執行,按轉換方式可將它們分為兩類:
解釋類:執行方式類似於我們日常生活中的「同聲翻譯」,應用程序源代碼一邊由相應語言的解釋器「翻譯」成目標代碼(機器語言),一邊執行,因此效率比較低,而且不能生成可獨立執行的可執行文件,應用程序不能脫離其解釋器,但這種方式比較靈活,可以動態地調整、修改應用程序。
編譯類:編譯是指在應用源程序執行之前,就將程序源代碼「翻譯」成目標代碼(機器語言),因此其目標程序可以脫離其語言環境獨立執行,使用比較方便、效率較高。但應用程序一旦需要修改,必須先修改源代碼,再重新編譯生成新的目標文件(* .OBJ)才能執行,只有目標文件而沒有源代碼,修改很不方便。現在大多數的編程語言都是編譯型的,例如Visual C++、Visual Foxpro、Delphi等。
[NextPage]
學習編程,從何入手
如果您想學習編程,卻又不知從何入手,那麼您不妨看看下面的幾種學習方案,可能會給您一些啟示吧!
==============================================
方案一 Basic語言 & Visual Basic
優點
(1)Basic 簡單易學,很容易上手。
(2)Visual Basic 提供了強大的可視化編程能力,可以讓你輕松地做出漂亮的程序。
(3)眾多的控制項讓編程變得象壘積木一樣簡單。
(4)Visual Basic 的全部漢化讓我們這些見了English就頭大的人喜不自禁。
缺點
(1)Visual Basic 不是真正的面向對象的開發文具。
(2)Visual Basic 的數據類型太少,而且不支持指針,這使得它的表達能力很有限。
(3)Visual Basic 不是真正的編譯型語言,它產生的最終代碼不是可執行的,是一種偽代碼。它需要一個動態鏈接庫去解釋執行,這使得Visual Basic 的編譯速度大大變慢。
綜述:方案一適合初涉編程的朋友,它對學習者的要求不高,幾乎每個人都可以在一個比較短的時間里學會vB編程,並用VB 做出自己的作品。對於那些把編程當做游戲的朋友來說,VB 是您最佳的選擇。
Basic/Visual Basic簡介
==============================================
方案二 Pascal語言 & Delphi
優點
(1)Pascal語言結構嚴謹,可以很好地培養一個人的編程思想。
(2)Delphi是一門真正的面向對象的開發工具,並且是完全的可視化。
(3)Delphi使用了真編譯,可以讓你的代碼編譯成為可執行的文件,而且編譯速度非常快。
(4)Delphi具有強大的資料庫開發能力,可以讓你輕松地開發資料庫。
缺點
Delphi幾乎可以說是完美的,只是Pascal語言的過於嚴謹讓人感覺有點煩。
綜述: 方案二比較適合那些具有一定編程基礎並且學過Pascal語言的朋友。
Pascal語言簡介
Delphi簡介
==============================================
方案三 C語言 & Visual C++
優點
(1)C語言靈活性好,效率高,可以接觸到軟體開發比較底層的東西。
(2)微軟的MFC庫博大精深,學會它可以讓隨心所欲地進行編程。
(3)VC是微軟製作的產品,與操作系統的結合更加緊密。
缺點
對使用者的要求比較高,既要具備豐富的C語言編程經驗,又要具有一定的WINDOWS編程基礎,它的過於專業使得一般的編程愛好者學習起來會有不小的困難。
綜述: VC是程序員用的東西。如果你是一個永不滿足的人,而且可以在編程上投入很大的精力和時間,那麼學習VC你一定不會後悔的。
C語言簡介
==============================================
方案四 C++語言 & C++ Builder
優點
(1)C++語言的優點全部得以繼承。
(2)完全的可是化。
(3)極強的兼容性,支持OWL、VCL和MFC三大類庫。
(4)編譯速度非常快。
缺點
由於推出的時間太短,關於它的各種資料還不太多。
綜述:我認為C++ Builder 是最好的編程工具。它既保持了C++語言編程的優點,又做到了完全的可視化。
C語言簡介
==============================================
方案五 SQL語言 & Power Builder
對於一些傳統的數據開發人員來說,Foxpro系列也許讓他們感到更加熟悉。但是對於初學者來說,PowerBuilder也許是最好的資料庫開發工具。各種各樣的控制項,功能強大的PowerBuilder語言都會幫助你開發出自己的資料庫應用程序。
[NextPage]
JSP簡介
在Sun正式發布JSP(Java Server Pages)之後,這種新的Web應用開發技術很快引起了人們的關注。JSP為創建高度動態的Web應用提供了一個獨特的開發環境。按照 Sun 的說法,JSP能夠適應市場上包括Apache WebServer 、IIS4.0在內的85%的伺服器產品。
JSP與ASP的簡單比較
JSP與Microsoft的ASP技術非常相似。兩者都提供在HTML代碼中混合某種程序代碼、由語言引擎解釋執行程序代碼的能力。在ASP或JSP環境下,HTML代碼主要負責描述信息的顯示樣式,而程序代碼則用來描述處理邏輯。普通的HTML頁面只依賴於Web伺服器,而ASP和JSP頁面需要附加的語言引擎分析和執行程序代碼。程序代碼的執行結果被重新嵌入到HTML代碼中,然後一起發送給瀏覽器。ASP和JSP都是面向Web伺服器的技術,客戶端瀏覽器不需要任何附加的軟體支持。
ASP的編程語言是VBScript之類的腳本語言,JSP使用的是Java,這是兩者最明顯的區別。
此外,ASP與JSP還有一個更為本質的區別:兩種語言引擎用完全不同的方式處理頁面中嵌入的程序代碼。在ASP下,VBScript代碼被ASP引擎解釋執行;在JSP下,代碼被編譯成Servlet並由Java虛擬機執行,這種編譯操作僅在對JSP頁面的第一次請求時發生。
運行環境
執行 JSP 代碼需要在伺服器上安裝 JSP 引擎。此處我們使用的是 Sun 的 JavaServer Web Development Kit ( JSWDK )。為便於學習,這個軟體包提供了大量可供修改的示例。安裝 JSWDK 之後,只需執行 startserver 命令即可啟動伺服器。在默認配置下伺服器在埠 8080 監聽,使用 http://localhost:8080 即可打開預設頁面。
在運行 JSP 示例頁面之前,請注意一下安裝 JSWDK 的目錄,特別是" work "子目錄下的內容。執行示例頁面時,可以在這里看到 JSP 頁面如何被轉換成 Java 源文件,然後又被編譯成 class 文件(即 Servlet )。 JSWDK 軟體包中的示例頁面分為兩類,它們或者是 JSP 文件,或者是包含一個表單的 HTML 文件,這些表單均由 JSP 代碼處理。與 ASP 一樣, JSP 中的 Java 代碼均在伺服器端執行。因此,在瀏覽器中使用"查看源文件"菜單是無法看到 JSP 源代碼的,只能看到結果 HTML 代碼。所有示例的源代碼均通過一個單獨的" examples "頁面提供。
Java Servlet是一種開發Web應用的理想構架。 JSP以Servlet技術為基礎,又在許多方面作了改進。JSP頁面看起來象普通HTML頁面,但它允許嵌入執行代碼,在這一點上,它和ASP技術非常相似。利用跨平台運行的JavaBean 組件,JSP為分離處理邏輯與顯示樣式提供了卓越的解決方案。JSP必將成為ASP技術的有力競爭者。
[NextPage]
SQL語言簡介
SQL全稱是「結構化查詢語言(Structured Query Language)」,最早的是IBM的聖約瑟研究實驗室為其關系資料庫管理系統SYSTEM R開發的一種查詢語言,它的前身是SQUARE語言。SQL語言結構簡潔,功能強大,簡單易學,所以自從IBM公司1981年推出以來,SQL語言,得到了廣泛的應用。如今無論是像Oracle ,Sybase,Informix,SQL server這些大型的資料庫管理系統,還是像Visual Foxporo,PowerBuilder這些微機上常用的資料庫開發系統,都支持SQL語言作為查詢語言。
Structured Query Language包含4個部分:
數據查詢語言DQL-Data Query Language SELECT
數據操縱語言DQL-Data Manipulation Language INSERT, UPDATE, DELETE
數據定義語言DQL-Data Definition Language CREATE, ALTER, DROP
數據控制語言DQL-Data Control Language COMMIT WORK, ROLLBACK WORK
SQL的歷史
在70年代初,E.E.Codd首先提出了關系模型。70年代中期,IBM公司在研製 SYSTEM R關系資料庫管理系統中研製了SQL語言,最早的SQL語言(叫SEQUEL2)是在1976 年 11 月的IBM Journal of R&D上公布的。
1979年ORACLE公司首先提供商用的SQL,IBM公司在DB2 和SQL/DS資料庫系統中也實現了SQL。
1986年10月,美國ANSI採用SQL作為關系資料庫管理系統的標准語言(ANSI X3. 135-1986),後為國際標准化組織(ISO)採納為國際標准。
1989年,美國ANSI採納在ANSI X3.135-1989報告中定義的關系資料庫管理系統的SQL標准語言,稱為ANSI SQL 89, 該標准替代ANSI X3.135-1986版本。該標准為下列組織所採納:
● 國際標准化組織(ISO),為ISO 9075-1989報告「Database Language SQL With Integrity Enhancement」
● 美國聯邦政府,發布在The Federal Information Processing Standard Publication(FIPS PUB)127
目前,所有主要的關系資料庫管理系統支持某些形式的SQL語言, 大部分資料庫打算遵守ANSI SQL89標准。
SQL的優點
SQL廣泛地被採用正說明了它的優點。它使全部用戶,包括應用程序員、DBA管理員和終端用戶受益非淺。
(1) 非過程化語言
SQL是一個非過程化的語言,因為它一次處理一個記錄,對數據提供自動導航。SQL允許用戶在高層的數據結構上工作,而不對單個記錄進行操作,可操作記錄集。所有SQL 語句接受集合作為輸入,返回集合作為輸出。SQL的集合特性允許一條SQL語句的結果作為另一條SQL語句的輸入。 SQL不要求用戶指定對數據的存放方法。 這種特性使用戶更易集中精力於要得到的結果。所有SQL語句使用查詢優化器,它是RDBMS的一部分,由它決定對指定數據存取的最快速度的手段。查詢優化器知道存在什麼索引,哪兒使用合適,而用戶從不需要知道表是否有索引,表有什麼類型的索引。
(2) 統一的語言
SQL可用於所有用戶的DB活動模型,包括系統管理員、資料庫管理員、 應用程序員、決策支持系統人員及許多其它類型的終端用戶。基本的SQL 命令只需很少時間就能學會,最高級的命令在幾天內便可掌握。 SQL為許多任務提供了命令,包括:
● 查詢數據
● 在表中插入、修改和刪除記錄
● 建立、修改和刪除數據對象
● 控制對數據和數據對象的存取
● 保證資料庫一致性和完整性
以前的資料庫管理系統為上述各類操作提供單獨的語言,而SQL 將全部任務統一在一種語言中。
(3) 是所有關系資料庫的公共語言
由於所有主要的關系資料庫管理系統都支持SQL語言,用戶可將使用SQL的技能從一個RDBMS轉到另一個。所有用SQL編寫的程序都是可以移植的。
[NextPage]
Java語言簡介
一. Java的由來
當1995年SUN推出Java語言之後,全世界的目光都被這個神奇的語言所吸引。那麼Java到底有何神奇之處呢?
Java語言其實最是誕生於1991年,起初被稱為OAK語言,是SUN公司為一些消費性電子產品而設計的一個通用環境。他們最初的目的只是為了開發一種獨立於平台的軟體技術,而且在網路出現之前,OAK可以說是默默無聞,甚至差點夭折。但是,網路的出現改變了OAK的命運。
在Java出現以前。Internet上的信息內容都是一些乏味死板的HTML文檔。這對於那些迷戀於WEB瀏覽的人們來說簡直不可容忍。他們迫切希望能在WEN中看到一些互動式的內容,開發人員也極希望能夠在WEB上創建一類無需考慮軟硬體平台就可以執行的應用程序,當然這些程序還要有極大的安全保障。對於用戶的這種要求,傳統的編程語言顯得無能為力,面SUN的工程師敏銳地察覺到了這一點,從1994年起,他們開始將OAK技術應用於WEB上,並且開發出了HotJava的第一個版本。當SUN公司1995年正式以Java這個名字推出的時候,幾乎所有的WEB開發人員都想到:噢,這正是我想要的。於是Java成了一顆耀眼的明星,丑小鴨一下了變成了白天鵝。
二. Java的定義
Java是一種簡單的,面象對象的,分布式的,解釋的,鍵壯的安全的,結構的中立的,可移植的,性能很優異的多線程的,動態的語言。
Java的開發環境有不同的版本,如sun公司的Java Developers Kit, 簡稱 JDK。後來微軟公司推出了支持Java規范的Microsoft Visual J++ Java開發環境,簡稱 VJ++。
三. Java的特點
1. 平台無關性
平台無關性是指Java能運行於不同的平台。Java引進虛擬機 原理,並運行於虛擬機,實現不同平台的Java介面之間。使 用Java編寫的程序能在世界范圍內共享。Java的數據類型與 機器無關,Java虛擬機(Java Virtual Machine)是建立在 硬體和操作系統之上,實現Java二進制代碼的解釋執行功能, 提供於不同平台的介面的。
2. 安全性
Java的編程類似C++,學習過C++的讀者將很快掌握Java的精 髓。Java舍棄了C++的指針對存儲器地址的直接操作,程序 運行時,內存由操作系統分配,這樣可以避免病毒通過指 針侵入系統。Java對程序提供了安全管理器,防止程序的 非法訪問。
3. 面向對象
Java 吸取了C++面向對象的概念,將數據封裝於類中,利用類 的優點,實現了程序的簡潔性和便於維護性。類的封裝性、 繼承性等有關對象的特性,使程序代碼只需一次編譯,然後 通過上述特性反復利用。程序員只需把主要精力用在類和接 口的設計和應用上。Java 提供了眾多的一般對象的類,通 過繼承即可使用父類的方法。在 Java 中,類的繼承關系是單一的非多重的,一個子類 只有一個父類,子類的父類又有一個父類。Java 提供的 Object 類及其子類的繼承關系如同一棵倒立的樹形,根類 為 Object 類, Object 類功能強大,經常會使用到它及其 它派生的子類。
4. 分布式
Java建立在擴展TCP/IP網路平台上。庫函數提供了用HTTP和FTP協議傳送和接受信息的方法。這使得程序員使用網路上的文件和使用本機文件一樣容易。
5. 鍵壯性
Java致力於檢查程序在編譯和運行時的錯誤。類型檢查幫助檢查出許多開發早期出現的錯誤。Java自已操縱內存減少了內存出錯的可能性。Java還實現了真數組,避免了覆蓋數據的可能。這些功能特徵大大提高了開發Java應用程序的周期。Java提供: Null指針檢測、 數組邊界檢測、 異常出口、 Byte code校驗。
四. Java與C/C++語言
Java提供了一個功能強大語言的所有功能,但幾乎沒有一點含混特徵。C++安全性不好,但C和C++被大家接受,所以Java設計成C++形式,讓大家很容易學習。
Java去掉了C++語言的許多功能,讓Java的語言功能很精煉,並增加了一些很有用的功能,如自動收集碎片。
Java去掉了以下幾個C和C++功能:
指針運算
結構
typedefs
#define
需要釋放內存
這將減少了平常出錯的50%。而且,Java很小,整個解釋器只需215K的RAM。
面象對象:Java實現了C++的基本面象對象技術並有一些增強,(為了語言簡單,刪除了一些功能)。Java處理數據方式和用對象介面處理對象數據方式一樣。
五. Java與Internet
我們知道,早先的 www 僅可以傳送文本和圖片,Java的出現實現了互動的頁面,是一次偉大的革命。
Java並不是為 Internet,WWW而設計的,它也可以用來編寫獨立的應用程序。Java 是一種面向對象語言。Java 語言類似於 C++ 語言,所以已熟練掌握 C++語言的編程人員,再學習 Java 語言就容易得多!Java 程序需要編譯。實際上有兩種 Java 程序:一種 Java 應用程序是一個完整的程序,如 Web 瀏覽器。一種 Java 小應用程序是運行於 Web 瀏覽器中的一個程序.
Java程序和它的瀏覽器HotJava,提供了可讓你的瀏覽器運行程序的方法。你能從你的瀏覽器里直接播放聲音。你還能播放頁面里的動畫。Java還能告訴你的瀏覽器怎樣處理新的類型文件。當我們能在2400 baud線上傳輸視頻圖象時,HotJava將能顯示這些視頻。
當今Internet的一大發展趨勢是電子商務,而Internet的安全問題是必須解決的問題,通常大的部門應設置防火牆,阻止非法侵入。
電子商務是當今的熱門話題,然而傳統的編程語言難以勝任電子商務系統,電子商務要求程序代碼具有基本的要求:安全、可靠、同時要求能 與運行於不同平台的機器的全世界客戶開展業務。Java以其強安全性、平台無關性、硬體結構無關性、語言簡潔同時面向對象,在網路編程語言中占據無可比擬的優勢,成為實現電子商務系統的首選語言。
Java程序被放置在Internet伺服器上,當用戶訪問伺服器時,Java程序被下載到本地的用戶機上,由瀏覽器解釋運行。
[NextPage]
PowerBuilder簡介
PowerBuilder的產生
PowerBuilder是美國著名的資料庫應用開發工具生產廠商PowerSoft推出的成功產品,其第一版於1991年6月正式投入市場。它是完全按照客戶/伺服器體系結構研製設計的,採用面向對象技術,圖形化的應用開發環境,是資料庫的前端開發工具。
PowerBuilder的特點
它支持應用系統同時訪問多種資料庫,其中既包括Oracel,Sybase之類的大型資料庫,又包括FOXPRO之類支持ODBC介面的小型資料庫,PowerBuilder是完全可視化的資料庫開發工具,它提供了大量的控制項,大大加快了項目的開發速度,也使開發者更容易掌握資料庫的開發。
它使用的編程語言叫做工PowerScripr,它也是一種高級的,結構化的編程語言。PowerScript提供了一套完整的嵌入式SQL語句,開發人員可以像使用其它語句一樣自由地使用SQL語言,這樣就大大增強了程序操縱和訪問資料庫的能力。可以說PowerBuilder既適合初學者快速學習資料庫的開發,又可以讓有經驗的開發人員開發出功能強大的資料庫,是一種適用面非常廣的開發工具。
PowerBuilder是一個用來進行客戶/伺服器開發的完全的可視化開發環境。使用PowerBuilder,你可以用一種可視的直觀的方式來創建應用程序的用戶界面和資料庫介面。這是一個總的概念,實際上是開發人員使用PowerBuilder去開發應用程序,由於所開發的各種應用程序充分利用了圖形用戶介面(GUI)的優點,所以PowerBuilder被認為是一個圖形工具。
在客戶/伺服器結構的應用中,PowerBuilder具有描述多個資料庫連接與檢索的能力。特別是PowerBuilder能從大多數流行的RDBMS中存取數據,且不管數據存放在什麽地方;另外,各種應用程序又可以獨立於RDBMS,因為PowerBuilder可以使用資料庫的標准操作語言SQL(結構化查詢語言)進行。
使用PowerBuilder,可以很容易地開發出功能強大的圖形界面的訪問伺服器資料庫的應用程序,PowerBuilder提供了建立符合工業標準的應用程序(例如訂單登記、會計及製造系統)所需的所有工具。
PowerBuilder應用程序由窗口組成,這些窗口包含用戶與之交互的控制項。開發人員可以使用所有標准空間(如按鈕、復選框、下拉式列表框或編輯框)以及PowerBuilder提供的特殊的使應用程序更易於開發和使用的控制項。
通常人們把PowerBuilder看成是一種開發工具,實際上它比其他工具強得多,是一種強有力的開發環境。開發人員不僅能用它來開發用戶容易使用的各種應用程序還可以通過PowerBuilder修改資料庫,利用400多個內部定義函數,可以開發能和其他應用程序進行的各種應用程序。
PowerBuilder正在成為客戶/伺服器應用開發的標准。相對於其他任何客戶/伺服器開發環境,PowerBuilder使開發人員的工作更快、成本更低、質量更高、功能更強。
PowerBuilder為應用開發提供了全面綜合性的支持,可以分別概括為如下幾點:
事件驅動的應用程序
功能強大的編程語言與函數
面向對象的編程
跨平台開發
開放的資料庫連結系統
PowerBuilder開發環境
PowerBuilder開發環境由一系列集成的圖形畫板(Painter)組成,應用開發人員通過簡單的滑鼠操作即可設計、建立、交互檢驗和測試客戶/伺服器應用程序。
[NextPage]
Delphi簡介
Delphi這個名字源於古希臘的城市名。它集中了第三代語言
⑵ 很多小學生學習編程,如何看待這種現象
很多小學生學習編程,我個人覺得這是一個比較好的現象。小學生學習編程,說明我們的教育與時俱進,不再局限於傳統的唯分數論,是一種積極的現象。編程是隨著互聯網信息時代而發展來的,也將是未來人工智慧、萬物互聯、智慧城市等發展方向。小學生能有就會接觸,是順應時代發展要求的。
5、學習編程能提高孩子的動手能力。學習編程能很好地提高孩子的動手能力,編程除了要思考,還想要動手,特別是現在很多小學生學習軟體+硬體的編程課程,完美地結合了動腦加動手。
總之,小學生開始學習編程,說明家長的意識已經契合了時代的發展趨勢,孩子們也能跟隨時代發展的步伐,拓展了新的知識體系,給孩子的未來有了更多的選擇!
⑶ 高手大哥們,如何提高編程思想
第1章 對象入門
「為什麼面向對象的編程會在軟體開發領域造成如此震憾的影響?」
面向對象編程(OOP)具有多方面的吸引力。對管理人員,它實現了更快和更廉價的開發與維護過程。對分析與設計人員,建模處理變得更加簡單,能生成清晰、易於維護的設計方案。對程序員,對象模型顯得如此高雅和淺顯。此外,面向對象工具以及庫的巨大威力使編程成為一項更使人愉悅的任務。每個人都可從中獲益,至少表面如此。
如果說它有缺點,那就是掌握它需付出的代價。思考對象的時候,需要採用形象思維,而不是程序化的思維。與程序化設計相比,對象的設計過程更具挑戰性——特別是在嘗試創建可重復使用(可再生)的對象時。過去,那些初涉面向對象編程領域的人都必須進行一項令人痛苦的選擇:
(1) 選擇一種諸如Smalltalk的語言,「出師」前必須掌握一個巨型的庫。
(2) 選擇幾乎根本沒有庫的C++(注釋①),然後深入學習這種語言,直至能自行編寫對象庫。
①:幸運的是,這一情況已有明顯改觀。現在有第三方庫以及標準的C++庫供選用。
事實上,很難很好地設計出對象——從而很難設計好任何東西。因此,只有數量相當少的「專家」能設計出最好的對象,然後讓其他人享用。對於成功的OOP語言,它們不僅集成了這種語言的語法以及一個編譯程序(編譯器),而且還有一個成功的開發環境,其中包含設計優良、易於使用的庫。所以,大多數程序員的首要任務就是用現有的對象解決自己的應用問題。本章的目標就是向大家揭示出面向對象編程的概念,並證明它有多麼簡單。
本章將向大家解釋Java的多項設計思想,並從概念上解釋面向對象的程序設計。但要注意在閱讀完本章後,並不能立即編寫出全功能的Java程序。所有詳細的說明和示例會在本書的其他章節慢慢道來。
1.1 抽象的進步
所有編程語言的最終目的都是提供一種「抽象」方法。一種較有爭議的說法是:解決問題的復雜程度直接取決於抽象的種類及質量。這兒的「種類」是指准備對什麼進行「抽象」?匯編語言是對基礎機器的少量抽象。後來的許多「命令式」語言(如FORTRAN,BASIC和C)是對匯編語言的一種抽象。與匯編語言相比,這些語言已有了長足的進步,但它們的抽象原理依然要求我們著重考慮計算機的結構,而非考慮問題本身的結構。在機器模型(位於「方案空間」)與實際解決的問題模型(位於「問題空間」)之間,程序員必須建立起一種聯系。這個過程要求人們付出較大的精力,而且由於它脫離了編程語言本身的范圍,造成程序代碼很難編寫,而且要花較大的代價進行維護。由此造成的副作用便是一門完善的「編程方法」學科。
為機器建模的另一個方法是為要解決的問題製作模型。對一些早期語言來說,如LISP和APL,它們的做法是「從不同的角度觀察世界」——「所有問題都歸納為列表」或「所有問題都歸納為演算法」。PROLOG則將所有問題都歸納為決策鏈。對於這些語言,我們認為它們一部分是面向基於「強制」的編程,另一部分則是專為處理圖形符號設計的。每種方法都有自己特殊的用途,適合解決某一類的問題。但只要超出了它們力所能及的范圍,就會顯得非常笨拙。
面向對象的程序設計在此基礎上則跨出了一大步,程序員可利用一些工具表達問題空間內的元素。由於這種表達非常普遍,所以不必受限於特定類型的問題。我們將問題空間中的元素以及它們在方案空間的表示物稱作「對象」(Object)。當然,還有一些在問題空間沒有對應體的其他對象。通過添加新的對象類型,程序可進行靈活的調整,以便與特定的問題配合。所以在閱讀方案的描述代碼時,會讀到對問題進行表達的話語。與我們以前見過的相比,這無疑是一種更加靈活、更加強大的語言抽象方法。總之,OOP允許我們根據問題來描述問題,而不是根據方案。然而,仍有一個聯系途徑回到計算機。每個對象都類似一台小計算機;它們有自己的狀態,而且可要求它們進行特定的操作。與現實世界的「對象」或者「物體」相比,編程「對象」與它們也存在共通的地方:它們都有自己的特徵和行為。
Alan Kay總結了Smalltalk的五大基本特徵。這是第一種成功的面向對象程序設計語言,也是Java的基礎語言。通過這些特徵,我們可理解「純粹」的面向對象程序設計方法是什麼樣的:
(1) 所有東西都是對象。可將對象想像成一種新型變數;它保存著數據,但可要求它對自身進行操作。理論上講,可從要解決的問題身上提出所有概念性的組件,然後在程序中將其表達為一個對象。
(2) 程序是一大堆對象的組合;通過消息傳遞,各對象知道自己該做些什麼。為了向對象發出請求,需向那個對象「發送一條消息」。更具體地講,可將消息想像為一個調用請求,它調用的是從屬於目標對象的一個子常式或函數。
(3) 每個對象都有自己的存儲空間,可容納其他對象。或者說,通過封裝現有對象,可製作出新型對象。所以,盡管對象的概念非常簡單,但在程序中卻可達到任意高的復雜程度。
(4) 每個對象都有一種類型。根據語法,每個對象都是某個「類」的一個「實例」。其中,「類」(Class)是「類型」(Type)的同義詞。一個類最重要的特徵就是「能將什麼消息發給它?」。
(5) 同一類所有對象都能接收相同的消息。這實際是別有含義的一種說法,大家不久便能理解。由於類型為「圓」(Circle)的一個對象也屬於類型為「形狀」(Shape)的一個對象,所以一個圓完全能接收形狀消息。這意味著可讓程序代碼統一指揮「形狀」,令其自動控制所有符合「形狀」描述的對象,其中自然包括「圓」。這一特性稱為對象的「可替換性」,是OOP最重要的概念之一。
一些語言設計者認為面向對象的程序設計本身並不足以方便解決所有形式的程序問題,提倡將不同的方法組合成「多形程序設計語言」(注釋②)。
②:參見Timothy Budd編著的《Multiparadigm Programming in Leda》,Addison-Wesley 1995年出版。
1.2 對象的介面
亞里士多德或許是認真研究「類型」概念的第一人,他曾談及「魚類和鳥類」的問題。在世界首例面向對象語言Simula-67中,第一次用到了這樣的一個概念:
所有對象——盡管各有特色——都屬於某一系列對象的一部分,這些對象具有通用的特徵和行為。在Simula-67中,首次用到了class這個關鍵字,它為程序引入了一個全新的類型(clas和type通常可互換使用;注釋③)。
③:有些人進行了進一步的區分,他們強調「類型」決定了介面,而「類」是那個介面的一種特殊實現方式。
Simula是一個很好的例子。正如這個名字所暗示的,它的作用是「模擬」(Simulate)象「銀行出納員」這樣的經典問題。在這個例子里,我們有一系列出納員、客戶、帳號以及交易等。每類成員(元素)都具有一些通用的特徵:每個帳號都有一定的余額;每名出納都能接收客戶的存款;等等。與此同時,每個成員都有自己的狀態;每個帳號都有不同的余額;每名出納都有一個名字。所以在計算機程序中,能用獨一無二的實體分別表示出納員、客戶、帳號以及交易。這個實體便是「對象」,而且每個對象都隸屬一個特定的「類」,那個類具有自己的通用特徵與行為。
因此,在面向對象的程序設計中,盡管我們真正要做的是新建各種各樣的數據「類型」(Type),但幾乎所有面向對象的程序設計語言都採用了「class」關鍵字。當您看到「type」這個字的時候,請同時想到「class」;反之亦然。
建好一個類後,可根據情況生成許多對象。隨後,可將那些對象作為要解決問題中存在的元素進行處理。事實上,當我們進行面向對象的程序設計時,面臨的最大一項挑戰性就是:如何在「問題空間」(問題實際存在的地方)的元素與「方案空間」(對實際問題進行建模的地方,如計算機)的元素之間建立理想的「一對一」對應或映射關系。
如何利用對象完成真正有用的工作呢?必須有一種辦法能向對象發出請求,令其做一些實際的事情,比如完成一次交易、在屏幕上畫一些東西或者打開一個開關等等。每個對象僅能接受特定的請求。我們向對象發出的請求是通過它的「介面」(Interface)定義的,對象的「類型」或「類」則規定了它的介面形式。「類型」與「介面」的等價或對應關系是面向對象程序設計的基礎。
下面讓我們以電燈泡為例:
Light lt = new Light();
lt.on();
在這個例子中,類型/類的名稱是Light,可向Light對象發出的請求包括包括打開(on)、關閉(off)、變得更明亮(brighten)或者變得更暗淡(dim)。通過簡單地聲明一個名字(lt),我們為Light對象創建了一個「句柄」。然後用new關鍵字新建類型為Light的一個對象。再用等號將其賦給句柄。為了向對象發送一條消息,我們列出句柄名(lt),再用一個句點符號(.)把它同消息名稱(on)連接起來。從中可以看出,使用一些預先定義好的類時,我們在程序里採用的代碼是非常簡單和直觀的。
1.3 實現方案的隱藏
為方便後面的討論,讓我們先對這一領域的從業人員作一下分類。從根本上說,大致有兩方面的人員涉足面向對象的編程:「類創建者」(創建新數據類型的人)以及「客戶程序員」(在自己的應用程序中採用現成數據類型的人;注釋④)。對客戶程序員來講,最主要的目標就是收集一個充斥著各種類的編程「工具箱」,以便快速開發符合自己要求的應用。而對類創建者來說,他們的目標則是從頭構建一個類,只向客戶程序員開放有必要開放的東西(介面),其他所有細節都隱藏起來。為什麼要這樣做?隱藏之後,客戶程序員就不能接觸和改變那些細節,所以原創者不用擔心自己的作品會受到非法修改,可確保它們不會對其他人造成影響。
④:感謝我的朋友Scott Meyers,是他幫我起了這個名字。
「介面」(Interface)規定了可對一個特定的對象發出哪些請求。然而,必須在某個地方存在著一些代碼,以便滿足這些請求。這些代碼與那些隱藏起來的數據便叫作「隱藏的實現」。站在程式化程序編寫(Proceral Programming)的角度,整個問題並不顯得復雜。一種類型含有與每種可能的請求關聯起來的函數。一旦向對象發出一個特定的請求,就會調用那個函數。我們通常將這個過程總結為向對象「發送一條消息」(提出一個請求)。對象的職責就是決定如何對這條消息作出反應(執行相應的代碼)。
對於任何關系,重要一點是讓牽連到的所有成員都遵守相同的規則。創建一個庫時,相當於同客戶程序員建立了一種關系。對方也是程序員,但他們的目標是組合出一個特定的應用(程序),或者用您的庫構建一個更大的庫。
若任何人都能使用一個類的所有成員,那麼客戶程序員可對那個類做任何事情,沒有辦法強制他們遵守任何約束。即便非常不願客戶程序員直接操作類內包含的一些成員,但倘若未進行訪問控制,就沒有辦法阻止這一情況的發生——所有東西都會暴露無遺。
有兩方面的原因促使我們控制對成員的訪問。第一個原因是防止程序員接觸他們不該接觸的東西——通常是內部數據類型的設計思想。若只是為了解決特定的問題,用戶只需操作介面即可,毋需明白這些信息。我們向用戶提供的實際是一種服務,因為他們很容易就可看出哪些對自己非常重要,以及哪些可忽略不計。
進行訪問控制的第二個原因是允許庫設計人員修改內部結構,不用擔心它會對客戶程序員造成什麼影響。例如,我們最開始可能設計了一個形式簡單的類,以便簡化開發。以後又決定進行改寫,使其更快地運行。若介面與實現方法早已隔離開,並分別受到保護,就可放心做到這一點,只要求用戶重新鏈接一下即可。
Java採用三個顯式(明確)關鍵字以及一個隱式(暗示)關鍵字來設置類邊界:public,private,protected以及暗示性的friendly。若未明確指定其他關鍵字,則默認為後者。這些關鍵字的使用和含義都是相當直觀的,它們決定了誰能使用後續的定義內容。「public」(公共)意味著後續的定義任何人均可使用。而在另一方面,「private」(私有)意味著除您自己、類型的創建者以及那個類型的內部函數成員,其他任何人都不能訪問後續的定義信息。private在您與客戶程序員之間豎起了一堵牆。若有人試圖訪問私有成員,就會得到一個編譯期錯誤。「friendly」(友好的)涉及「包裝」或「封裝」(Package)的概念——即Java用來構建庫的方法。若某樣東西是「友好的」,意味著它只能在這個包裝的范圍內使用(所以這一訪問級別有時也叫作「包裝訪問」)。「protected」(受保護的)與「private」相似,只是一個繼承的類可訪問受保護的成員,但不能訪問私有成員。繼承的問題不久就要談到。
1.4 方案的重復使用
創建並測試好一個類後,它應(從理想的角度)代表一個有用的代碼單位。但並不象許多人希望的那樣,這種重復使用的能力並不容易實現;它要求較多的經驗以及洞察力,這樣才能設計出一個好的方案,才有可能重復使用。
許多人認為代碼或設計方案的重復使用是面向對象的程序設計提供的最偉大的一種杠桿。
為重復使用一個類,最簡單的辦法是僅直接使用那個類的對象。但同時也能將那個類的一個對象置入一個新類。我們把這叫作「創建一個成員對象」。新類可由任意數量和類型的其他對象構成。無論如何,只要新類達到了設計要求即可。這個概念叫作「組織」——在現有類的基礎上組織一個新類。有時,我們也將組織稱作「包含」關系,比如「一輛車包含了一個變速箱」。
對象的組織具有極大的靈活性。新類的「成員對象」通常設為「私有」(Private),使用這個類的客戶程序員不能訪問它們。這樣一來,我們可在不幹擾客戶代碼的前提下,從容地修改那些成員。也可以在「運行期」更改成員,這進一步增大了靈活性。後面要講到的「繼承」並不具備這種靈活性,因為編譯器必須對通過繼承創建的類加以限制。
由於繼承的重要性,所以在面向對象的程序設計中,它經常被重點強調。作為新加入這一領域的程序員,或許早已先入為主地認為「繼承應當隨處可見」。沿這種思路產生的設計將是非常笨拙的,會大大增加程序的復雜程度。相反,新建類的時候,首先應考慮「組織」對象;這樣做顯得更加簡單和靈活。利用對象的組織,我們的設計可保持清爽。一旦需要用到繼承,就會明顯意識到這一點。
1.5 繼承:重新使用介面
就其本身來說,對象的概念可為我們帶來極大的便利。它在概念上允許我們將各式各樣數據和功能封裝到一起。這樣便可恰當表達「問題空間」的概念,不用刻意遵照基礎機器的表達方式。在程序設計語言中,這些概念則反映為具體的數據類型(使用class關鍵字)。
我們費盡心思做出一種數據類型後,假如不得不又新建一種類型,令其實現大致相同的功能,那會是一件非常令人灰心的事情。但若能利用現成的數據類型,對其進行「克隆」,再根據情況進行添加和修改,情況就顯得理想多了。「繼承」正是針對這個目標而設計的。但繼承並不完全等價於克隆。在繼承過程中,若原始類(正式名稱叫作基礎類、超類或父類)發生了變化,修改過的「克隆」類(正式名稱叫作繼承類或者子類)也會反映出這種變化。在Java語言中,繼承是通過extends關鍵字實現的
使用繼承時,相當於創建了一個新類。這個新類不僅包含了現有類型的所有成員(盡管private成員被隱藏起來,且不能訪問),但更重要的是,它復制了基礎類的介面。也就是說,可向基礎類的對象發送的所有消息亦可原樣發給衍生類的對象。根據可以發送的消息,我們能知道類的類型。這意味著衍生類具有與基礎類相同的類型!為真正理解面向對象程序設計的含義,首先必須認識到這種類型的等價關系。
由於基礎類和衍生類具有相同的介面,所以那個介面必須進行特殊的設計。也就是說,對象接收到一條特定的消息後,必須有一個「方法」能夠執行。若只是簡單地繼承一個類,並不做其他任何事情,來自基礎類介面的方法就會直接照搬到衍生類。這意味著衍生類的對象不僅有相同的類型,也有同樣的行為,這一後果通常是我們不願見到的。
有兩種做法可將新得的衍生類與原來的基礎類區分開。第一種做法十分簡單:為衍生類添加新函數(功能)。這些新函數並非基礎類介面的一部分。進行這種處理時,一般都是意識到基礎類不能滿足我們的要求,所以需要添加更多的函數。這是一種最簡單、最基本的繼承用法,大多數時候都可完美地解決我們的問題。然而,事先還是要仔細調查自己的基礎類是否真的需要這些額外的函數。
1.5.1 改善基礎類
盡管extends關鍵字暗示著我們要為介面「擴展」新功能,但實情並非肯定如此。為區分我們的新類,第二個辦法是改變基礎類一個現有函數的行為。我們將其稱作「改善」那個函數。
為改善一個函數,只需為衍生類的函數建立一個新定義即可。我們的目標是:「盡管使用的函數介面未變,但它的新版本具有不同的表現」。
1.5.2 等價與類似關系
針對繼承可能會產生這樣的一個爭論:繼承只能改善原基礎類的函數嗎?若答案是肯定的,則衍生類型就是與基礎類完全相同的類型,因為都擁有完全相同的介面。這樣造成的結果就是:我們完全能夠將衍生類的一個對象換成基礎類的一個對象!可將其想像成一種「純替換」。在某種意義上,這是進行繼承的一種理想方式。此時,我們通常認為基礎類和衍生類之間存在一種「等價」關系——因為我們可以理直氣壯地說:「圓就是一種幾何形狀」。為了對繼承進行測試,一個辦法就是看看自己是否能把它們套入這種「等價」關系中,看看是否有意義。
但在許多時候,我們必須為衍生類型加入新的介面元素。所以不僅擴展了介面,也創建了一種新類型。這種新類型仍可替換成基礎類型,但這種替換並不是完美的,因為不可在基礎類里訪問新函數。我們將其稱作「類似」關系;新類型擁有舊類型的介面,但也包含了其他函數,所以不能說它們是完全等價的。舉個例子來說,讓我們考慮一下製冷機的情況。假定我們的房間連好了用於製冷的各種控制器;也就是說,我們已擁有必要的「介面」來控制製冷。現在假設機器出了故障,我們把它換成一台新型的冷、熱兩用空調,冬天和夏天均可使用。冷、熱空調「類似」製冷機,但能做更多的事情。由於我們的房間只安裝了控制製冷的設備,所以它們只限於同新機器的製冷部分打交道。新機器的介面已得到了擴展,但現有的系統並不知道除原始介面以外的任何東西。
認識了等價與類似的區別後,再進行替換時就會有把握得多。盡管大多數時候「純替換」已經足夠,但您會發現在某些情況下,仍然有明顯的理由需要在衍生類的基礎上增添新功能。通過前面對這兩種情況的討論,相信大家已心中有數該如何做。
1.6 多形對象的互換使用
通常,繼承最終會以創建一系列類收場,所有類都建立在統一的介面基礎上。我們用一幅顛倒的樹形圖來闡明這一點(注釋⑤):
⑤:這兒採用了「統一記號法」,本書將主要採用這種方法。
對這樣的一系列類,我們要進行的一項重要處理就是將衍生類的對象當作基礎類的一個對象對待。這一點是非常重要的,因為它意味著我們只需編寫單一的代碼,令其忽略類型的特定細節,只與基礎類打交道。這樣一來,那些代碼就可與類型信息分開。所以更易編寫,也更易理解。此外,若通過繼承增添了一種新類型,如「三角形」,那麼我們為「幾何形狀」新類型編寫的代碼會象在舊類型里一樣良好地工作。所以說程序具備了「擴展能力」,具有「擴展性」。
以上面的例子為基礎,假設我們用Java寫了這樣一個函數:
void doStuff(Shape s) {
s.erase();
// ...
s.draw();
}
這個函數可與任何「幾何形狀」(Shape)通信,所以完全獨立於它要描繪(draw)和刪除(erase)的任何特定類型的對象。如果我們在其他一些程序里使用doStuff()函數:
Circle c = new Circle();
Triangle t = new Triangle();
Line l = new Line();
doStuff;
doStuff;
doStuff;
那麼對doStuff()的調用會自動良好地工作,無論對象的具體類型是什麼。
這實際是一個非常有用的編程技巧。請考慮下面這行代碼:
doStuff;
此時,一個Circle(圓)句柄傳遞給一個本來期待Shape(形狀)句柄的函數。由於圓是一種幾何形狀,所以doStuff()能正確地進行處理。也就是說,凡是doStuff()能發給一個Shape的消息,Circle也能接收。所以這樣做是安全的,不會造成錯誤。
我們將這種把衍生類型當作它的基本類型處理的過程叫作「Upcasting」(上溯造型)。其中,「cast」(造型)是指根據一個現成的模型創建;而「Up」(向上)表明繼承的方向是從「上面」來的——即基礎類位於頂部,而衍生類在下方展開。所以,根據基礎類進行造型就是一個從上面繼承的過程,即「Upcasting」。
在面向對象的程序里,通常都要用到上溯造型技術。這是避免去調查准確類型的一個好辦法。請看看doStuff()里的代碼:
s.erase();
// ...
s.draw();
注意它並未這樣表達:「如果你是一個Circle,就這樣做;如果你是一個Square,就那樣做;等等」。若那樣編寫代碼,就需檢查一個Shape所有可能的類型,如圓、矩形等等。這顯然是非常麻煩的,而且每次添加了一種新的Shape類型後,都要相應地進行修改。在這兒,我們只需說:「你是一種幾何形狀,我知道你能將自己刪掉,即erase();請自己採取那個行動,並自己去控制所有的細節吧。」
1.6.1 動態綁定
在doStuff()的代碼里,最讓人吃驚的是盡管我們沒作出任何特殊指示,採取的操作也是完全正確和恰當的。我們知道,為Circle調用draw()時執行的代碼與為一個Square或Line調用draw()時執行的代碼是不同的。但在將draw()消息發給一個匿名Shape時,根據Shape句柄當時連接的實際類型,會相應地採取正確的操作。這當然令人驚訝,因為當Java編譯器為doStuff()編譯代碼時,它並不知道自己要操作的准確類型是什麼。盡管我們確實可以保證最終會為Shape調用erase(),為Shape調用draw(),但並不能保證為特定的Circle,Square或者Line調用什麼。然而最後採取的操作同樣是正確的,這是怎麼做到的呢?
將一條消息發給對象時,如果並不知道對方的具體類型是什麼,但採取的行動同樣是正確的,這種情況就叫作「多形性」(Polymorphism)。對面向對象的程序設計語言來說,它們用以實現多形性的方法叫作「動態綁定」。編譯器和運行期系統會負責對所有細節的控制;我們只需知道會發生什麼事情,而且更重要的是,如何利用它幫助自己設計程序。
有些語言要求我們用一個特殊的關鍵字來允許動態綁定。在C++中,這個關鍵字是virtual。在Java中,我們則完全不必記住添加一個關鍵字,因為函數的動態綁定是自動進行的。所以在將一條消息發給對象時,我們完全可以肯定對象會採取正確的行動,即使其中涉及上溯造型之類的處理。
1.6.2 抽象的基礎類和介面
設計程序時,我們經常都希望基礎類只為自己的衍生類提供一個介面。也就是說,我們不想其他任何人實際創建基礎類的一個對象,只對上溯造型成它,以便使用它們的介面。為達到這個目的,需要把那個類變成「抽象」的——使用abstract關鍵字。若有人試圖創建抽象類的一個對象,編譯器就會阻止他們。這種工具可有效強制實行一種特殊的設計。
亦可用abstract關鍵字描述一個尚未實現的方法——作為一個「根」使用,指出:「這是適用於從這個類繼承的所有類型的一個介面函數,但目前尚沒有對它進行任何形式的實現。」抽象方法也許只能在一個抽象類里創建。繼承了一個類後,那個方法就必須實現,否則繼承的類也會變成「抽象」類。通過創建一個抽象方法,我們可以將一個方法置入介面中,不必再為那個方法提供可能毫無意義的主體代碼。
interface(介面)關鍵字將抽象類的概念更延伸了一步,它完全禁止了所有的函數定義。「介面」是一種相當有效和常用的工具。另外如果自己願意,亦可將多個介面都合並到一起(不能從多個普通class或abstract class中繼承)。
1.7 對象的創建和存在時間
從技術角度說,OOP(面向對象程序設計)只是涉及抽象的數據類型、繼承以及多形性,但另一些問題也可能顯得非常重要。本節將就這些問題進行探討。
最重要的問題之一是對象的創建及破壞方式。對象需要的數據位於哪兒,如何控制對象的「存在時間」呢?針對這個問題,解決的方案是各異其趣的。C++認為程序的執行效率是最重要的一個問題,所以它允許程序員作出選擇。為獲得最快的運行速度,存儲以及存在時間可在編寫程序時決定,只需將對象放置在堆棧(有時也叫作自動或定域變數)或者靜態存儲區域即可。這樣便為存儲空間的分配和釋放提供了一個優先順序。某些情況下,這種優先順序的控制是非常有價值的。然而,我們同時也犧牲了靈活性,因為在編寫程序時,必須知道對象的准確的數量、存在時間、以及類型。如果要解決的是一個較常規的問題,如計算機輔助設計、倉儲管理或者空中交通控制,這一方法就顯得太局限了。
第二個方法是在一個內存池中動態創建對象,該內存池亦叫「堆」或者「內存堆」。若採用這種方式,除非進入運行期,否則根本不知道到底需要多少個對象,也不知道它們的存在時間有多長,以及准確的類型是什麼。這些參數都在程序正式運行時才決定的。若需一個新對象,只需在需要它的時候在內存堆里簡單地創建它即可。由於存儲空間的管理是運行期間動態進行的,所以在內存堆里分配存儲空間的時間比在堆棧里創建的時間長得多(在堆棧里創建存
⑷ 為什麼都說編程難,編程到底難在哪裡
編程專門技術的技術含量雄厚,需要費很多的精力和腦力。研究一些很抽象的,很邏輯性的問題,在某些人看來就比較枯燥
⑸ C語言編程有什麼特點
基礎,基礎中的基礎。可以實現高級語言的功能,也可以實現許多低級語言的功能,雖然叫做高級語言,但也有稱之為中級語言的說法。
⑹ 編程的好處和意義是什麼
學習編程的好處和意義如下:
1、加強邏輯思維能力。
編程可以幫助孩子培養邏輯思維能力和抽象思維能力,因為程序就是對現實事物的抽象,而且,按照寫好的邏輯運行。所以,編程能夠鍛煉我們的抽象思維能力和邏輯思維能力。
2、提高效率。
通過編程,我們能夠很容易的處理大量重復性、低效率的工作,從而節省時間。而工作中很多地方都用到了編程來提高生產力,比如 Excel 中的宏,很多 Adobe 的產品都能使用 JavaScrpt 來自動化工作。
3、改變粗心的毛病,變得自律。
在編程的世界裡,你多輸入一個標點符號,都會造成程序大亂,無法運行,更別說在邏輯分析上出現問題。
4、避免被時代淘汰,眼光成遠。
前面已經說過了,編程是通向未來的語言,通過學會編程和智能機器溝通。不得不承認,現代社會已經步入信息化科技時代,傳統行業正在被科技革新。