1. 程式人生 > >各種程式語言的來源及其特點

各種程式語言的來源及其特點

Pascal語言:

    Pascal是一種計算機通用的高階程式設計語言,由瑞士Niklaus Wirth教授六十年代末設計並創立的。

    Pascal的主要特點有:嚴格的結構化形式、豐富完備的資料型別、執行效率高、查錯能力強等特點。

    由於上述特點,Pascal可以方便用於描述各種演算法和資料結構。對於程式設計的初學者,Pascal語言有益於培養良好的程式設計風格和習慣。IOI(國際奧林匹克資訊學競賽)把Pascal語言作為三種程式設計語言之一。NOI(全國奧林匹克資訊學競賽)把Pascal語言定為唯一提倡的程式設計語言,在大學中Pascal語言也常常被用作學習資料結構與演算法的數學語言。


C語言:

    C語言是介於組合語言和高階語言之間的語言,屬於高階語言,也稱為中級語言,是集彙編和高階語言優點於一身的程式設計語言。於1972年在美國貝爾實驗室裡問世。早期的C語言主要用於UNIX系統。由於C語言的強大功能和各方面的優點逐漸為人們認識,到了九十年代,C語言開始進入其他作業系統,並很快在各類大、中、小和微型計算機上得到廣泛的應用。成為當代最優秀的程式設計語言之一。

C的特點

    1. 是一種結構化語言。層次清晰,便於按模組化方式組織程式,易於除錯和維護。

    2. C語言的表現能力和處理能力極強。不僅具有豐富的運算子和資料型別,便於實現各類複雜的資料結構,它還可以直接訪問記憶體的實體地址,進行位級別的操作。

    3. 由於C語言實現對硬體的程式設計操作,所以既可用於系統軟體的開發,也適合於應用軟體的開發。C語言還具有效率高,可移植性強等特點。因此廣泛地移植到了各類計算機上,從而形成了多種版本的C語言。

    4. 由於C語言允許直接對位、位元組和地址進行操作,能實現組合語言的大部分功能。

    5. 目的碼質量高,程式執行效率高。

    總體上來說,C語言的優點是簡潔、緊湊、使用方便、靈活、易於學習和應用。僅有32個關鍵字。9種控制語句,程式的書寫形式也很自由。

C語言的弱點:非強型別;語法限制不嚴格,使得程式設計者無法過多地依賴C編譯程式去查錯;缺少實時檢查,如陣列越界等。

    從嚴格上來說,C語言是塊結構語言,這是因為它在結構上類似於ALGOL、Pascal和Modula-2。從技術上講,塊結構語言允許在過程和函式中定義過程和函式。因為C語言不允許在函式中定義函式,所以不能稱為通常意義上的塊結構語言。

    C語言作為一門面向過程的計算機語言,至今已有三十多年曆史,應用廣泛,無論是Windows還是Linux,你所看到的底層都是用C寫的。大部分的網路協議也都是用C實現的。你看到的最漂亮的遊戲畫面也是用C實現的,工業控制程式也是用C實現的。不過C不是萬能,只是某些方面它適用而已。


C++語言

    C++是於1986年由AT&T貝爾實驗室開發的,語言開發的目的在於通過資料封裝減少程式變數的副作用,從而降低程式的複雜性並提高程式的可靠性。(筆者曾經聽到的開發C++的目的是由於懂得C語言的人越來越多,所以需要再出一門更難的、比C語言強大的語言,才能保住飯碗,so。C++出世啦)C++是C語言的直接擴充套件,C++的多繼承機制能更好地描述物件的屬性和行為。

    C++是C的擴充套件,但C++可以作為一種全新的語言來看。

    C++的特點:面向物件、繼承、封裝、多型性。

    由於C++是C的擴充套件,所以也具有C的特點。

    C++在C的基礎上,加入了面向物件程式設計思想,也就決定了C++的效率在某一方面是不如C的。比如定義一種型別,C++用類(Class)來封裝,而C可能就直接幾個變數的組合就成了一個結構體(Struct),類不僅具有成員變數,還具有成員函式等,在精細的比較其效率時,C會比C++的效率要高。但由於時代的發展,專案或工程的龐大化,基於面向物件的思想顯然更能適應。即C++在這方面能比C要做得更漂亮。現在不少系統級程式設計都是用C++實現,許多應用級別的軟體也是用C++實現。

    這裡要注意一點,就是C++並不是完全的面嚮物件語言。它是提供了面向物件的模型以及思路,但是同時相容了面向過程的模型。


Java語言

    Java語言來自於Sun公司的一個叫Green的專案,其原先的目的是為家用消費電子產品開發一個分散式程式碼系統,這樣我們就可以把email發給電冰箱、電視機等家用電器。對他們進行控制和資訊交流。開始,準備用C++,但C++太複雜,安全性差,最後用一種新的語言Oak(Java的前身),Oak是一種用於網路的精巧而安全的語言,Sun公司曾依此投標一個互動式電視專案,但被SGI打敗。可憐的Oak幾乎無家可歸,恰巧這時Mark Ardreesen開發的Mosaic和Netscape啟發了Oak專案組成員,他們用(Java)編制了HotJava瀏覽器,得到了Sun執行長Scott McNealy的支援,觸發了Java進軍Internet。Java的取名有一段趣聞:有一天,幾位Java成員組的會員正在討論給這個新的語言取什麼名字,當時他們正在咖啡館喝著Java(爪哇)咖啡,有一個人靈機一動說就叫Java怎樣,得到了其他人的讚賞,於是,Java這個名字就這樣傳開了。

Java的特點:

    1. 簡單性:風格類似於C++,Java摒棄了C++中容易引發程式錯誤的地方,如指標和記憶體管理。

    2. 面向物件:Java是一種完全面向物件語言。從這點來看,Java類似於SmallTalk,但其特性、尤其是適用於分散式計算環境的特性遠遠超越了SmallTalk。

    3. 分散式:Java包括一個支援HTTP和FTP等基於TCP/IP協議的子庫。因此,Java應用程式可憑藉URL開啟並訪問網路上的物件,其訪問方式與訪問本地檔案系統幾乎完全相同。

    4. 健壯:Java致力於檢查程式在編譯和執行時的錯誤。型別檢查幫助檢查出許多開發早期出現的錯誤。Java自己操縱記憶體減少了記憶體出錯的可能性。

    5. 結構中立:Java將程式編譯成一種結構中立的中間檔案格式。只要有Java執行系統的機器都執行這種中間程式碼。這種中間語言被設計在虛擬機器上執行,由機器相關的執行偵錯程式實現執行。

    6. 安全: 
        1)刪除了香指標和手動釋放記憶體等功能,避免了非法記憶體操作。 
        2)當Java用來建立瀏覽器時,語言功能和瀏覽器本身提供的功能結合起來。 
    Java在機器上執行前,要經過很多測試,它經過程式碼校驗,檢查程式碼段的格式,檢測指標操作,物件操作是否過分以及試圖改變一個物件的型別。

    7. 可移植的:同體繫結構無關的特性使得Java應用程式可以在配備Java直譯器和執行環境的任何計算機系統上執行。任何Java程式碼會被解釋成一種中間語言,然後通過不同機子的特定環境(如機器指令)執行程式。實現方便移植的特點。

    8. 解釋性。Java直譯器能直接執行目的碼指令。連結程式通常比編譯程式所需資源少。

    9. 高效能。如果直譯器速度不慢,Java可以在執行時直接將目的碼翻譯成機器指令。Sun用直接直譯器一秒鐘內可呼叫300,000個過程。

    10. 多執行緒:Java提供的多執行緒功能使得在一個程式裡可同時執行多個小任務。多執行緒帶來的更大好處是更好的互動效能和實時控制性能。

    11. 動態:動態特性允許程式動態地裝入執行過程中所需要的類。在執行時確定引用的好處是可以使用已被更新的類,而不必擔心會影響原有的程式碼。如果程式連線了網路中另一系統中的某一類,該類的所有者也可以自由地對該類進行更新,而不會使任何引用該類的程式崩潰。

    Java在誕生之後不久,便受到廣大群眾的歡迎,甚至有人說出有了Java,可以不要C/C++了。一度把Java提到了很高的地位。這當然是對Java的一種讚賞,只是有點過了。到今天,Java依然不能取代C,C++,而且還出現了新的對手――.Net(後面將會介紹)。

    Java目前主要應用:Web瀏覽器、網路應用系統。


C#語言。

    C#是一種精確、簡單、型別安全、面向物件的語言。說到C#,就不得不先簡單介紹一下.net。到底什麼是.net呢,按照微軟總裁兼執行長Steve Ballrner把它定義為:.Net代表一個集合,一個環境,它可以作為平臺支援下一代Internet的可程式設計結構。C#是.net的代表語言。

C#的特點:

    1. 完全面向物件。

    2. 支援分散式,之所以有C#,是因為微軟相信分散式應用程式是未來的趨勢,即處理過程分佈在客戶機和伺服器上。所以C#一出生就註定了能很好解決分散式問題。

    3. 跟Java類似,C#程式碼經過編譯後,成為了一種IL(中間語言)。在執行時,再把IL編譯為平臺專用的程式碼。

    4. 健壯,C#在檢查程式錯誤和編譯與執行時錯誤一點也不遜於Java,C#也用了自動管理記憶體機制。

    5. C#不像Java那樣完全摒棄了指標和手動記憶體管理。C#預設情況下是不能使用指標的,程式設計師在有必要時可以開啟指標來使用。這樣可以保證程式設計的靈活性。

    6. 安全性:C#的安全性是有.net平臺來提供的。C#程式碼編譯後成為IL語言。是一種受控程式碼,.net提供型別安全檢查等機制保證程式碼是安全的。

    7. 可移植性:由於C#使用類似Java的中間語言機制。使得C#也跟Java類似,可以很方便的移植到其他系統。在執行時,再把中間程式碼編譯為適合特定機器的程式碼。

    8. 解釋性:C#也是一種特殊的解釋性語言。

    9. 高效能:C#把程式碼編譯成中間語言後,可以高效的執行程式。

    10. 多執行緒:與Java類似,可以由一個主程序分出多個執行小任務的多執行緒。

    11. 元件模式:C#很適合元件開發。各個元件可以由其他語言實現的,然後整合在.net中。

    C#是在Java流行起來後所誕生的一種新的語言。由於微軟在作業系統上佔有很大的優勢。在以往的開發中累積了不少經驗,所形成的.net平臺,所以C#在Windows方面可以說比Java具有更大的優勢。如果單純從技術上來講,C#在網路程式設計上可以與Java匹敵。C#還在Windows Forms也有一定的優勢。

    C#是一種非常類似於C++的語言,風格是更接近於Java,不管是C++程式設計師還是Java程式設計師,都可以很方便的轉到C#上來。

    C#的強大是依賴於.net的發展,而.net的發展是看微軟在.net上的決心和投入有多少。從Windows 2003和Vista系統可以看出(前者內建.net1.1,後者內建.net2.0。).Net在Windows程式設計中具有重要的戰略意義。

    C#目前主要是應用在網路程式設計上,其他領域比如資料庫、窗體程式設計,都逐漸在增大。


Pascal PK C

    現在,看我們學習Pascal和C的過程:學Hello world,然後知道怎麼編譯,執行。然後學習基本資料型別,然後輸入輸出。不管學校希望學生能學多好,實際來看,學生學Pascal跟學C是沒什麼區別的。不同的只是語言風格。有人也許會說,學C的精華在於指標。學C的人會比Pascal強很多。沒錯,指標是學C的一個重點。但是就按我學C的課本來看,用到的指標只是很簡單的。理解了*p和p有什麼不同,就夠了。然後會編個簡單的幾行程式碼,就自認為會C了。C庫中有很多函式,教師在課堂上幾乎沒講。比如memset,qsort等,少了這些。你學Pascal和C沒什麼不同,只是作為了學習其他語言的鋪墊而已。而新生由於沒有語言根基,有不少好學生由於教師在課堂上沒講,就以為學完教師所教的了。這正是好學生的弱點所在。如果是“壞”學生,不聽課堂的。倒還可能發現課堂所學的C是多麼膚淺。還有,我至今沒見過有學校會教C的圖形開發的。雖然圖形開發不是語言基礎。不過對於擴充套件新生的程式設計視野是一個不錯的選擇。現代程式軟體支援圖形視窗的太豐富了,幾乎不會太多的學生去在意窗體的設定,定位等功能。圖形程式設計還能激起學生的程式設計慾望。筆者曾經實現過C的動畫演示,當裡面的所有圖形都按預期的運動起來的時候,那種興奮感猶如你在冰天雪地的情況下忽然淋你一盤冰水所感到的那種感覺。

C PK C++

    C++是在C的基礎上發展起來的。看起來似乎這兩個pk,贏者肯定C++。其實未必。C至今還有生存的空間,而沒有被C++全盤代替。說明了C還是具有不可替代的作用。C目前主要應用在於硬體底層的部分,以及對於效能要求較高的應用程式中。但是對於複雜的系統級的開發,顯然C++顯得從容自在。聯絡實際,不少人學C++的時候,就已經有C 的基礎了。有C的基礎,學C++的基本型別的時候可以快速渡過,然後學類,繼承,多型等概念。還是從我的經歷說起,我選了C++,然後幾乎沒怎上課,因為實在聽了想睡覺,期末前用C++做了一個大作業後,就叫懂C++了哈,然後考試當然輕鬆過了。其實我那時還是沒學到C++,本質點說,我只是還是在會點C的基礎上。多了一個結構型別:類,而已。後來使用了1年的C++後,才恍然察覺到當年的無知。才明白C++是什麼。我相信已經學過C++的同學估計現在連IO流的概念還沒搞清楚的人很多。造成這種現象的原因在於:1. 學生本身沒有認真去程式設計實現。2. 教師只是重複的講課本而已。最終判定學生是否會C++的標準也只是考試為主。關於高校的考試製度在計算機系中的效用,筆者將在未來幾天內出一篇個人觀點文章。

Java PK C#

    目前不少人對這兩種語言議論紛紛。筆者在開始學C#的時候,曾經看過Java程式設計師對於C#的觀點。把C#貶得一文不值。忽然發現,似乎很多Java的程式設計師對C#懷有天生的敵意。筆者目前自認為精通的是C#(別BS我)。以往學過Java,在此我寫一下我所感觸到的。雖然微軟一直稱C#是繼承於C/C++,但是不論從程式碼結構,還是內建的支援類,都跟Java有驚人的相似之處。我感覺C#就是在Java之上,針對Java的優點和缺點來設計的。我用過C、C++、Java,感覺還是C#最好,這只是筆者的個人感受。由於C#還保留著指標,當要實現一下比較底層的,效能要求高的時候,解決辦法之一是C#可以開啟指標,而Java是做不到的,Java只能通過其他途徑,比如優化演算法來解決。

    Java在非windows下獲得了很大的成功:某調查公司曾經使用Google搜尋引擎來統計以下指標:熟練使用某種語言的工程師數量、某種語言課程教學的可用性、有多少公司在出售用某種語言編寫的軟體。最後綜合得分情況是:Java以45.2分排名第一;第二名是C,得分是32.2;C++是以24.6分排名第三;C#遠遠落後在第九位,得分為4.6。這些資料是幾年前的資料。在這次測試中還發現,C#的受歡迎程度正在急劇上升;而Java相對穩定。這其中一個原因是.net允許許多種程式語言,而不像Java那樣,限制人們只能使用一種語言。開發者能夠使用包括C、C++、C#甚至Java在內的幾乎任何語言來編寫程式碼,然後把這些程式碼翻譯成機器看得懂的CLR程式碼(公共語言執行時程式碼)。這樣.net可以讓開發者保護自己的“程式碼投資”,換句話說,過去人們用C、C++編寫的程式碼都能再次被利用。而Java只能重新寫程式碼。

    所有指導者(學校、培訓機構、帶你的人)在足夠的時間內都希望新生能打下程式設計良好的基礎。從Pascal的介紹來看,似乎從它開始是很適合的。但是筆者是從C起步的,沒學過Pascal,對程式設計的習慣以及特點一點也不比學Pascal的人差。我覺得這不是語言的異同造成個人水平不同,在於拿了一門語言的書,新生是如何學程式設計的。不少新生可能會認為好好上課,聽老師講課,然後回來自己的電腦上把老師講過的內容上機去試一遍,就ok了。估計連不少教師也是這樣想的。筆者認為即使真有學生做得到,效果也是不好的。比如C語言把,我看過不少的C的教程的書,內容大同小異。前面幾章,也就詳細的講了語言定義的基本型別。然後講結構體什麼的。C++則是講類,繼承等。這些東西,我感覺上課沒什麼好講的,要講最多也就半節課。如果有一定程式設計基礎的人,這些東西學得更快。但是筆者的經歷是這些課都上了滿滿一個學期,還有後面某些章節是來不及講的。筆者不幸運,在上Java課的時候,沒有上機課,前面的基本型別都上了半學期了,不少學生自己連SDK都沒裝,最終考試就筆試過關罷了。連這種本應動手的課程還是按照傳統的考核方法:卷面考試來解決。能通過高考的學生,不管是真的有料還是假的有料,相信都已經是考試能人了,對於計算機系來說,筆者認為不能全按照傳統的教學模式來套,這只是閉著眼睛瞎說話而已。程式是具有很強的唯一性的。你行就行,不行就是不行。卷面答得再好也只是吹。我相信不僅我學校,其他各大高校情況也不會差太多。

    這裡順便說幾句感想:對於新生來說,應該自己能看清進入計算機系跟中學時候的環境不同。中學可以專門應試,不必學一些太實用的東西(除非不讀下去了,準備出來工作的)。但是到了本科,如果你也只是應付教學,然後只是爭取拿獎學金,最後你不考研或者考不上研,那可以說你在最後一年找工作的時候首先是自己心虛。雖然外面社會對本科要求不會太高,不必學生的技術像外面的技術牛人那麼高。但這不代表學生能什麼技能都不會。現在恐怕只有國企性質的企業很看重學生的成績、拿獎學金情況等等。但是不能期望所有同學都能順利去國企。

    選擇程式語言也是比較重要的一個環節,這就看新生個人的興趣在哪。比如有人喜歡黑客,那麼它可能就適合學C,以及各種指令碼。有人只喜歡網路程式設計,那麼也許他選擇Java或C#就比較適合。如果有人想成為很好的windows程式設計,那麼VC++、.Net程式設計也許是一個不錯的選擇。語言不在於多,而在於精。如果只學了一點就換語言,那不如不要學了,去打遊戲,找人聊天更好。

    資料結構:這是程式設計最基礎的課了。可以說能否學好程式設計的一個原因在於你有沒學好資料結構。注意,沒學資料結構的,未必編不好程。如果學生只是每節課聽老師講結構。然後理解了就完的話,資料結構是不會學好的,別以為考了個9X分就高興。說不定比考了60分的學得還差。依照筆者的經歷。一個班裡不少的人,估計一個學期上完了,連個連結串列如何用語言實現都不懂。對於資料結構,新生用什麼語言來實現,這個無所謂。只要你會用某種語言,就行了。

    學程式設計有一點是很重要的,就是學會看別人程式碼。從程式碼中看懂別人的意圖。這樣,可以快速學到各種技巧,提高自身的程式設計能力。

    不少新生可能會遇到一個比較普遍的問題,就是以前編過的東西會忘記,以後再要寫同樣的功能程式碼的時候,就忘了。我以前也經常碰到。我認為應該懂得把你寫的程式碼儲存起來或封裝起來。以後要用的時候可以直接拿來用,不必重寫。如果以後想到了更好的演算法,那麼再替換掉舊的程式碼。這裡我建議學會建立連結介面,Windows下就是dll或lik,其他系統我沒試過,不清楚,不過總會有相應的連結口檔案的。這樣,把程式碼測試完畢後,封裝到dll中,就可以長久儲存。需要用的時候可以呼叫。這樣可以把大部分注意力集中在新的問題上,而不是糾纏於實現過的演算法。

    學程式設計最主要的一點,還是要多程式設計。並且嘗試去接觸不同方面的問題,並試圖去解決它。這樣,就能在技術上有很大的提高。本科學校的教育教不出一個程式設計師的。程式設計師只有程式設計、再程式設計、然後還是程式設計,這樣的歷程才能鍛煉出來的。


來源:http://www.kuqin.com/language/20090301/37287.html