Computer Language and Programming(計算機語言與編程)

Computer Language and Programming(計算機語言與編程)

編程語言

編程語言簡介

編程語言是一種人爲創造的一種語言,用以編寫計算機可執行的程序(指令序列),與自然語言相似,如英語,編程語言也有詞彙,語法和句法。但自然語言還是不適合用於編程,因爲他們有時候會模糊,即他們的詞彙和語法結構有多種解釋意義。用於編程的語言必須有簡單的邏輯結構和語法規則,拼寫以及標點符號都要很明確。

編程語言在複雜度和功能多樣性上有很多區別。有些編程語言用於處理某種特殊問題或用在計算機系統中的特殊模型上,比如FORTRAN和COBOL語言就專用於解決某種常規問題模型,FORTRAN適用於科學應用而COBOL適用於商業應用。即使這些編程語言專從事於特定的問題領域,但是他們依然具有很好的移植性,意味着他們可用在很多類型的計算機上。其他的語言如機器語言就只能用在一種特定的計算機模型或某個研究領域中的特定的計算機上。最常用的編程語言是移植性很好的而且能夠高效的解決各種各樣的問題,就像C語言、PASCAL語言、BASIC語言等。

編程語言的類型

編程語言可被分爲低級語言和高級語言,低級語言或被稱爲機器語言是最基本的語言,可直接被計算機理解,機器語言視計算機製造商與型號的不同而有所區別。而高級語言需要被翻譯成機器語言然後才能夠被計算機識別和處理,高級語言有C、C++、PASCAL還有FORTRAN等。彙編語言是一種中間語言,它很接近機器語言但沒有其他高級語言在語言層的複發性,不過依然需要轉換成機器語言才能給被執行。

1.機器語言

在機器語言中,指令是一串計算機可直接識別的0、1代碼。一段機器語言表示的指令通常告訴計算機四件事情:(1)在內存(RAM)裏哪裏可以獲取到一個或兩個操作數或簡單的數據塊,(2)執行簡單的操作,如把兩個數加在一起,(3)把操作結果放在哪裏,(4)在哪裏讀取下一條指令。即使計算機最終是以機器語言的形式來讀取可執行的程序,但是他們依然不是機器語言的程序,直接用機器語言來編程非常困難,因爲指令僅僅是一系列的0 和1代碼。一個典型的機器語言指令如10010 11001011就表示把存儲寄存器A中的值加到存儲寄存器B中的值。

2.高級語言

高級語言有相對複雜點的語句集合,這些語句利用了人類語言的一些語言和語法。他們比彙編、機器語言與標準的人類語言更相似,因此更容易編寫複雜的程序。這些高級語言允許更快速的開發更大型更復雜的應用程序,然而高級語言必須由編譯器翻譯成機器語言才能夠被執行,正因爲這個原因,由高級語言編寫的程序比彙編語言編寫的程序要花費更多的執行時間和內存。

3.彙編語言

程序員可使用彙編語言很容易的生成機器語言,在彙編語言中,每條語句能夠粗略的代表一條機器 語言指令,彙編語言的語句由一些助記符組成。在一個很典型的彙編語句寫法中,ADD B,A就表示把存儲寄存器A中的值添加到存儲寄存器B中的值。彙編語言也和機器語言共享某些特徵,比如可能同時用匯編和機器語言來執行一些特殊的位操作。程序員有時候會直接使用彙編語言來最小化時間消耗,因爲把彙編翻譯成機器語言要相對簡單和省時。當需要直接控制計算機的某些部分時,就會採用彙編語言來實現,比如顯示器上獨立的點或打印機中獨立的字符流。

高級語言的分類

高級語言通常被分爲面向過程、面向函數式、面向對象或邏輯語言。今天最普遍的高級語言是面向過程的語言,在這些過程語言裏,一個或多個相關的語句塊,用於執行一些完整的功能就會被組織成一個程序模塊,還會被賦予一個如過程A這樣的名稱。如果在其他地方需要一個相似的操作序列,就可以用一個簡單的語句來引用該過程。實際上,一個過程就是一個迷你程序,一個很大的程序是由執行不同任務的過程組織在一起的,過程語言允許程序簡短而且便於計算機讀取,但是需要程序員設計得非常通用以滿足不同的應用場合。

函數式語言處理過程就像數據功能一些,在程序裏把他們當成一種其他形式的數據來處理,這需要很高很嚴密的構造程序的能力。函數式語言允許變量(程序運行時可以被指定值以及改變值的數據符號)只被賦值一次。由於變量不用被重新定義,每次都可在該程序語句中使用,自然的通過減少對執行語句具體順序的關注來簡化編程。許多來自函數式語言裏的編程思想都變成了現代過程語言裏的關鍵部分。

面向對象的語言是由函數是語言發展而來,在面向對象的語言中,程序代碼和數據被組織爲對象,對象進一步組織成類,類需要定義對象必需有的屬性。一個簡單的類示例如圖書類,在這種對象裏可以有小說(Novel),短故事(Short Story)。對象同樣有某種與之關聯的功能,通常被稱爲方法。計算機可通過調用對象的方法來訪問該對象,方法處理對象中的數據並把結果返回給調用者。對象類還可以被組織爲層級結構,一個類可以繼承自另一個類,這種結構在面向對象的語言裏處理一些複雜的任務非常有用。

邏輯語言使用邏輯學作爲數據基礎,一個邏輯程序裏包含許多事實集合和if-then規則,該規則用以推斷事實的真假,比如語句X是真,那麼語句Y則是假。

在執行邏輯程序時,一條輸入語句可由程序中的其他語句推斷而來,許多人工智能的程序就由這樣的語言編寫而來。

語言結構和組成

編程語言採用特定的語句類型或者指令來爲程序提供功能結構,程序中的語句是一種表達簡單意思的基本句子,它的目的是賦予一個基本的指令給計算機。語句可以定義數據類型,可以說明數據該怎樣操作,還能夠說明過程或函數工作的方式。程序員用語句來操作編程語言中共同的部分,比如變量和宏定義。

數據聲明語句賦予程序元素名稱以及屬性,也被稱爲定義變量,在程序中變量可以被賦予不同的值,屬性變量也被稱爲類型變量,可以表示變量中的值,數值的精確度,還可表示範式集合如表格或數組。在許多程序語言中,一種關鍵的類型就是指針,指針變量本身沒有實際意義的值,但他們可以尋址到其他變量,即指針指向的是其他的變量。

表達式是一種語句片,用以描述通過變量來執行的一系列計算,如X+Y/Z,涉及到的變量有X,Y,Z而所做的計算是加法和除法。賦值語句把來自表達式的計算結果賦給一個變量,而條件語句則指定用於測試的表達式然後選擇是否執行其他語句。

過程和函數語句定義某種代碼塊,但程序中的過程或函數可以返回一個執行結果,這些語句也定義程序員可選的變量和參數種類,以及表達式訪問過程或函數時,代碼所返回的值得類型。許多程序語言也支持帶宏定義迷你翻譯程序,宏定義可以把程序員定義的代碼片翻譯成程序語言可理解的語句。

編程語言的發展歷史

編程語言幾乎可追溯到20世紀40年代數字計算機出現的時期,在50年代後期隨着商業計算機的引進,彙編語言便首次出現。在50年代後期到60年代早期,第一種過程語言也被開發出來:John Backus創造了FORTRAN語言,Grace Hopper創造了COBAL語言。同時在50年代後期 John McCarthy創造了第一種函數式語言LISP,即使所有語言都在不斷的更新,這三門語言在今天依然使用很廣泛。

在60年代後期出現了第一種面向對象的語言如SIMULA。在70年代中期隨着PROLOG(用於編寫人工智能軟件)的出現邏輯語言也變得很出名,在70年代期間,持續的出現了很多過程語言,如ALGOL、BASIC、PASCAL、C、Ada語言。SMALLTALK是一種具有深遠意義的面嚮對象語言,它的出現導致了C++還有最近的Java面向對象和過程的結合。雖然邏輯語言的使用大大減少,但出現了應用於現代數據庫的關係型語言,例如SQL。

JAVA編程語言

Java在編程語言的演變中是一個很出名的例子,Java借鑑了C++常用的功能但摒棄了它的複雜危險以及多餘的元素,因此表現爲更安全簡單和易用。如下描寫了Java和C++的對比:

1.Java熟悉而簡單

如果你曾經用C++寫過程序,你會發現Java的出現是很及時的,由於Java的語法和C++相似,你在幾分鐘內就會寫Java程序。你將不費吹灰之力就快速且容易的完成第一個Java程序。

你會感覺你的程序裏沒有很多混亂(clutter)的代碼,C和C++中的讓人感到困惑的頭文件以及預處理語句都消失了,所有的很難懂的#define和typedefs語句也沒有了。你將不用再一層層的查找(delve)頭文件才能找到正確的引用API,沒有人願意遭受一些痛苦才能弄明白怎樣使用你的軟件。

2.Java是面向對象的

如果你認爲C++是一門面向對象的編程語言,那麼你也會很吃驚的發現Java也是。使用Java來寫一些程序後,你會有更好的面向對象的編程體驗。

Java處理類和對象要更純粹和簡單,Java中的類和對象不僅僅是很便利的數據結構,他們也是整個Java語言的基礎。        

在C++中,你可以聲明一個類,但是也可以不用,你可以聲明一個結構體或聯合體來替換它,你還可以申明一套不太相關的變量並在C風格的函數中使用。在Java中,類和對象是語言的中心,所有的東西都圍繞着他們,不能聲明函數和過程,這些都不存在,你也不能用結構體、聯合體或者typedefs,它們也沒有了,你要麼使用類和對象,要麼不用Java,就這麼簡單。

Java提供了面嚮對象語言所有的奢侈品:類層次、繼承、封裝、多態,在相應的應用場景下它們都非常有用而且有效。

面向對象的開發主要原因是除了很清晰和簡易以外,還可以重用對象。Jav都不僅很鼓勵重用軟件組件,而且還要求這樣做。編寫Java程序時,無論有多麼簡單,都需要Java API中的類和方法。

一旦你用Java來開發軟件程序,你有兩個選擇:

1.      構建類,然後重用他們。

2.      從已有的軟件組件中拷貝和挑選有用的部分來從頭編寫你的程序。

有了Java,從頭開始不再有吸引力,Java的面向對象結構促使你開發更有用的、可剪裁的而且更簡單的軟件程序。

3.Java更安全更可靠

Java比C++安全是因爲它阻止你做一些糟糕的事情,然而又很容易做一些你做的很好的事情。

Java不會自動的轉換數據類型,你必須明確的從一個類轉換成另一個類,而C++在一些很不合理的條件下都會自動的把一個類型轉換成另一種類型,而且C++還有很靈活的彙編代碼,Java不會假裝知道你在做什麼,因爲它會保證你做的東西。

Java中也不存在C++中的指針,你不再間接或偶然地來訪問對象,你只需申明對象然後直接引用對象即可。複雜的指針算術已經沒有了,如果你需要帶索引的對象集,你可以使用對象數組。“一個對象的地址”這種概念已經從編程模型中消除了,彙編語言也消失了,最終在Java中做正確的事情變得非常容易。

Java的可靠性不侷限在語言層面,它延伸到了編譯器和運行時系統層次,編譯期檢查可識別到很多未被檢查到的錯誤,它們執行的句法檢查來保證語句在語義上是正確的。

運行時也執行了大量而有效的檢查操作,還記得老師曾經說過的“再三檢查你的作業以確保它是正確的”的話麼?Java的鏈接程序能夠理解所有的類類型,同時還要執行編譯層的檢查,除此之外它也要執行邊界檢查以消除在錯誤的條件下間接地對象訪問。

4.Java是安全的

如果你把一個用C/C++ 寫的程序給一個熟練的黑客,然後告訴他找出一些安全漏洞。他會很容易的馬上找出來:獲取訪問操作系統的權限,造成異常控制返回流,重寫臨界區,修改其他程序,瀏覽安全信息,獲得未授權的文件系統訪問。

爲什麼C/C++比Java更容易受攻擊呢?當一個程序員開發軟件時,他通常只關注怎樣讓軟件正確而有效的工作。C/C++就不限制這些,同時還提供很多靈活的功能並允許程序員隨意使用。黑客也可以利用這些功能來造成一些不良後果。總之,C/C++提供了很多受攻擊的點但是卻沒有防禦的措施。Java,在另一方面講,天生就是防禦性的。當啓用了Java加載項的瀏覽器下載一個編譯好的Java類,比如applet,它就有運行病毒的風險。由於這是常規的風險,它會受制於一系列的代碼檢查,最後會確保它是正確安全的。

Java運行時系統被設計來實施一項安全策略—阻止惡意代碼的執行。該系統會找到對象的地址,然後根據安全規則來訪問對象。除此之外,它會在編譯好的類中執行字節碼驗證,然後通過定理證明程序來證明該字節碼是否是安全的並決定是否加載或執行該代碼。類是Java的基本執行單元,所有的安全策略都是基於類級別來實現的。

Java運行時系統還會從開始就隔離程序的執行。類文件會由本地系統來處理並會與其他系統分隔開來,這樣會阻止遠程系統通過不可靠的代碼來替換本地程序。

啓用Java加載項的瀏覽器如HotJava,允許用戶Java程序訪問本地系統,當Java Applet需要訪問訪問本地資源的權限時,比如訪問文件,一個安全對話框會彈出來請求具體的用戶權限,這種友好的方式保證用戶總是對自己的系統有最終決定權。

5.Java支持多線程

Java像Ada,但不像其他語言,提供內置的多線程操作。多線程操作允許在一個單一程序中有多個執行線程,這也允許你的程序一次能做很多事情:製作舞蹈、播放音樂、與其他用戶交互、一切看起來都是同時進行的。多線程操作是一種很重要的優勢,因爲它允許程序員編寫獨立的線程操作,而不是一堆很亂很複雜的活動。多線程操作還允許Java用空閒的CPU時間片來執行必要的垃圾收集和常規的系統維護,執行這些功能時還不會影響到程序的性能。

編寫多線程程序就像同時和多個人約會一樣,一切都會正常進展直到以一種意外的方式來和其他人交互。Java提供了必要的支持來保證多線程操作的安全性和正確性,Java通過提供同步的能力來保證線程間的共享信息以及線程安全。

6.Java是一種Web編程語言

事實上,Java已經成爲了一種Web編程語言,它已被幾乎所有的軟件公司接受了。Java現在是排名第一的Web編程語言,也是開發跨平臺軟件的最強有力的語言。

Java發展至今已不僅僅是一門Web語言,它也成爲開發分佈式應用的關鍵部分,Sun公司產品也強調了Java在基於對象的分佈式軟件開發上的重要性,許多其他廠商推出的產品都把Java集成到了公用對象請求體系結構中(CORBA)。

發佈了46 篇原創文章 · 獲贊 5 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章