各種計算機語言


來源:http://blog.csdn.net/walkingmanc/article/details/6367057

作為計算機專業的程序猿,已經學習過很多語言,但是從來沒有靜下來總結一下各種語言,今天在CSDN上看到一位童鞋整理的東西,感覺很不錯,時間比較緊迫,先收藏一下,考完試之后慢慢看了。

 WIN9x是純粹的匯編寫的,由於代碼量太巨,所以漏洞很多,穩定性也很差。

       基於NT的windows(WIN2K,XP,2003,VISTA),主要是用C寫的(少量與硬件交互的代碼因為C無法實現所以用匯編寫的);其中    WINDOWS 2000大概有20余萬行代碼,其中80%是用C編寫;   部分匯編,底層接口都是用匯編編寫的;    還有部分是使用c++編寫的。

 

    Linux,Unix內核基本上是用C完成的,少量與硬件交互的代碼因為C無法實現,所以用匯編寫的,沒有使用C++代碼.但是,現在linux有些高級特性是也有采用用c++寫的。 Linux,Unix平台上的很多GNU軟件也全部是用C寫出來的。

 

   綜合上面的, 我們可以看出, 不管是windows還是Linux/Unix,其操作系統的核心都是使用大量的C語言和一些匯編語言寫成的。

  其發展脈絡是這樣的:因為計算機值能識別二進制的機器碼,所以, 最開始的程序都是使用機器碼來寫的(打孔機就是證明),難度很大。后來,使用機器碼寫了一個程序,該程序可以解釋一些最簡單字符指令,將這些字符指令轉換成對應的機器碼,然后在計算機上執行,這個就是匯編器的初始版本,利用這些簡單的字符指令,大大簡化了代碼的編寫,不用像以前那樣必須寫大量的機器碼了,僅僅需要找到這些機器碼對應的字符指令碼就可以了,這些指令再被匯編器翻譯成大量的機器碼。利用這些簡單的指令,可以做很多事情了,包括處理額外的一些字符指令,並將其轉換成機器碼這樣的事情,這樣一來, 我們就可以使用這些簡單的字符指令寫一個處理額外字符指令的程序,利用初始版本的匯編器翻譯成機器碼,就得到了一個擴展版本的匯編器,該版本的匯編器與初始版本的匯編器相比,能處理更多的額外字符指令,通過多次迭代,最終可以得到一個比較完備的匯編器(能處理所有的匯編指令)。 這就是匯編器的來歷。 有了匯編器,我們就可以使用匯編指令來編寫各種匯編程序了。 我們發現,匯編器本身的最初版本(只能處理簡單的匯編指令)是使用二進制機器碼編寫的,剩下的大部分(能處理額外的大部分匯編指令)都是使用匯編語言本身編寫的。 所以, 我們看到, 在所有的匯編程序的世界中, 除了匯編器本身是由機器碼和匯編碼寫的以外,匯編代碼還可以用來實現很多的其它功能,例如很多系統級別的工具軟件,其中就包括各種和硬件打交道的驅動程序等等, 以及各種編譯器,例如:C語言編譯器 。類似的,C編譯器的核心也是由匯編語言寫成的,甚至還可以包括一些機器碼,但是大部分還是通過迭代來使用C語言編寫的,C編譯器能處理的數據結構和語言規則比匯編語言更豐富,更高級了,更接近人的可讀性了,這些數據結構和語言規則就是C語言標准了。這樣一來,就有了更多的選擇,既可以選擇機器碼,匯編,也可以選擇C語言來寫程序了。

      這樣,使用C語言作為主要的語言,外加匯編語言作為各種底層驅動或者與硬件有關的部分的代碼的編寫,就可以寫成很多系統管理的程序,慢慢地, 把這些程序集成起來, 就寫成了各種操作系統的核心,包括windos, linux/unix 等。windos, linux/unix 等的核心都是由c語言,匯編語言來寫成的。

 

     有了操作系統的核心以后,我們就可以使用已有的語言來開發各種操作系統管理軟件了,將這些合起來,就形成了操作系統。

   有了操作系統以后,我們就可以使用已有的語言,寫成更加高級的語言的編譯器和各種sdk工具,這樣,就得到了一種新的高級語言了, 我們以后寫代碼的時候就可以使用這種高級語言了,這樣,從更高的層次來寫代碼,就會簡化了很多底層的細節,大大提高了效率,當然,還是那句話,高級語言由於需要經過各個編譯器的層層轉換處理,性能會比較的低一些,而且離底層也越來越遠,失去了對底層的控制,也就意味着如果想要進行更加細致的控制就不可能了,因為你能使用的智能是高級語言的編譯器所能支持的語言規范了,所以,有時候, 在某些特殊情況下,還是有必要使用底層語言來實現一些特殊的功能的。 

 

    當然,這些選擇各有優缺點,需要根據自己所需要實現的功能更強調哪一方面來選擇不同的語言。    越是底層,實現同樣的功能,能使用的數據結構和語言規則就越少, 所需的代碼量就越大,就越難以寫,但是,由於需要的轉換和處理就更少,而且離底層硬件越近,所以性能也越快,所以,除非特別強調性能或者需要訪問底層(例如直接訪問硬件等),大部分情況下,是采用高層的語言來編寫程序,經過各級編譯處理以后最后轉換成機器碼來執行的。 

       這樣一來,我們就可以使用已有的語言開發更加高級別的編譯器,從而支持更加高級別的語言了。

       例如C++編譯器的核心就是使用C語言開發的,其中可能包括一些匯編代碼,但是其完備版本仍然是經過多次迭代的C++來寫成的。也就是說,C++編譯器主要是由C++語言編寫的,其初始版本(也就是核心)是由C語言外加一些匯編語言寫成的。 這樣,有了C++編譯器,我們就可以有更多的語言選擇了。 對於C++運行時環境,可以選擇c語言或者匯編寫,但是大部分還是由c++寫成的。   當然, 開發C++編譯器就像開發所有的編譯器一樣,各個不同的公司都可以來做這件事情, 這樣就產生了很多種C++的編譯器(就像有很多種匯編器和C語言編譯器一樣),比較著名的就有微軟的Microsoft C++ ,Borland 公司的Borland C++等等。  這些c++編譯器可能實現不同的C++語言的數據類型和語法,所以,后來。一個國際的標准機構就站出來制定了一個C++語言的標准,所有的編譯器都實現這些標准,當然實際上,這些編譯器除了實現C++標准以外,往往還會增加一些自己特殊的輔助功能, 也就是說,各個編譯器都是可以用來編譯符合規范的語言的,此外,這些不同的編譯器可能還有各種不同的一些特色輔助功能,在編譯代碼的優化,性能方面可能還有一點點小的區別。   有了這些語言,我們就可以用它們來寫各種程序了,包括這些語言的ide等。

      

 

     類似的,我們現在有了匯編語言,C語言,C++語言, 就可以使用這些語言來開發各種其它的編譯器了,例如Sun公司最開始就是完全使用C語言開發了java編譯器javac,   后來, 改成以就是使用c++開發javac的核心,外加java語言本身來開發了javac的其它大部分。

實際上也就是說,你可以使用任意的已有語言來開發新語言的編譯器(一般是使用某種已有語言,至於選擇哪種語言則根據需要可以隨意選擇,開發新編譯器的核心部分,然后采用多層迭代的新語言來開發編譯器的其它主要部分;當然,也可以完全使用已有語言來開發新的編譯器),對於已有低級語言來說,新語言的編譯器對低級語言的編譯器來說,無非就是使用該低級語言寫成的一個程序而已。所以, 我們不管看到什么高級語言,都會知道,該語言的編譯器都是基於某種已有的低級語言加上該語言本身來寫成的。然后,只要在操作系統上安裝了該語言的編譯器以及其所依賴的低級語言的編譯器, 在該操作系統上就可以使用該新語言來開發各種程序,   包括更高級語言的編譯器了。

    例如: delphi的編譯器是用的   C++編寫的。PASCAL語言的編譯器用C寫的等等。

 

     語言根據翻譯的方式的不同,語言分為編譯型語言和解釋型語言,所有的腳本語言(例如:JAVASCRIPT,ASP,PHP,PERL等)都屬於解釋型語言,它由一個解釋器(也叫解釋引擎)來每次讀入一句代碼,翻譯一句,執行一句,反復循環。而編譯型語言則是將所有的代碼一次性編譯成可執行文件(exe),如何執行的。

 

  參考:

   計算機不能直接理解高級語言,只能直接理解機器語言,所以必須要把高級語言翻譯成機器語言,計算機才能值型高級語言編寫的程序。 
 翻譯的方式有兩種,一個是編譯,一個是解釋。兩種方式只是翻譯的時間不同。編譯型語言寫的程序執行之前,需要一個專門的編譯過程,把程序編譯成為機器語言的文件,比如exe文件,以后要運行的話就不用重新翻譯了,直接使用編譯的結果就行了(exe文件),因為翻譯只做了一次,運行時不需要翻譯,所以編譯型語言的程序執行效率高。 
 解釋則不同,解釋性語言的程序不需要編譯,省了道工序,解釋性語言在運行程序的時候才翻譯,比如解釋性basic語言,專門有一個解釋器能夠直接執行basic程序,每個語句都是執行的時候才翻譯。這樣解釋性語言每執行一次就要翻譯一次,效率比較低。 
 什么是腳本語言? 
1.腳本語言(JavaScript,VBscript等)介於HTML和C,C++,Java,C#等編程語言之間。 
HTML通常用於格式化和鏈結文本。而編程語言通常用於向機器發出一系列復雜的指令。 
2.腳本語言與編程語言也有很多相似地方,其函數與編程語言比較相象一些,其也涉及到變量。與編程語言之間最大的區別是編程語言的語法和規則更為嚴格和復雜一些. 
3.與程序代碼的關系:腳本也是一種語言,其同樣由程序代碼組成。 
注:腳本語言一般都有相應的腳本引擎來解釋執行。 他們一般需要解釋器才能運行。JAVASCRIPT,ASP,PHP,PERL都是腳本語言。C/C++編譯、鏈接后,可形成獨立執行的exe文件。 
4.腳本語言是一種解釋性的語言,例如vbscript,javascript,installshield script等等,它不象c/c++等可以編譯成二進制代碼,以可執行文件的形式存在. 
腳本語言不需要編譯,可以直接用,由解釋器來負責解釋。 
5.腳本語言一般都是以文本形式存在,類似於一種命令. 
舉個例子說,如果你建立了一個程序,叫aaa.exe,可以打開.aa為擴展名的文件. 
你為.aa文件的編寫指定了一套規則(語法),當別人編寫了.aa文件后,你的程序用這種規則來理解編寫人的意圖,並作出回應.那么,這一套規則就是腳本語言. 

 

  java很特殊,java程序也需要編譯,但是沒有直接編譯稱為機器語言,而是編譯稱為字節碼,然后用解釋方式執行字節碼。Java既可以被編譯,也可以被解釋。通過編譯器,可以把Java程序翻譯成一種中間代碼 - 稱為字節碼 - 可以被Java解釋器解釋的獨立於平台的代碼。通過解釋器,每條Java字節指令被分析,然后在計算機上運行。只需編譯一次,程序運行時解釋執行。下圖說明了它是如何工作的:

1flow.gif (3652 bytes)

可以把Java字節碼看作運行在Java虛擬機(Java VM)上的機器代碼指令。每中Java解釋器,不管是Java開發工具還是可以運行Java小應用程序的Web瀏覽器,都是一種Java VM的實例。JavaVM也可以由硬件實現。

 Java字節碼使“寫一次,到處運行”成為可能。可以在任何有Java編譯器的平台上把Java程序編譯成字節碼。這個字節碼可以運行在任何Java VM上。例如,同一個Java程序可以運行在WindowsNT、Solaris和Macintosh上。

2comp.gif (6076 bytes)

Java平台

 平台是程序運行的硬件或軟件環境。Java平台與大多數其它平台不同之處在於它是運行於其它基於硬件平台的純軟件平台。大多數其它平台是硬件和操作系統的結合。

Java平台由兩部分組成:

 

  • Java虛擬機(Java VM)
  • Java應用程序界面(Java API)

我們已經介紹了Java VM,它是Java平台的基礎,可以移植到各種基於硬件的平台上。Java API是軟件組件的集合,它們提供了很多有用的功能,如圖
形用戶界面(GUI)。Java API被分組為相關組件的庫(包)。

 下圖描述了一個運行在Java平台上的Java程序,如應用程序(application)或小應用程序(applet)。如圖中顯示的,JavaAPI和VM把Java程序從硬件依賴中分離出來。

3play.gif (1479 bytes)

作為一種獨立於平台的環境,Java比本地代碼慢一些。然而,聰明的編譯器、很好地調制過的解釋器和即時字節碼編譯器可以在不犧牲可移植性的條件下使Java的表現接近本地代碼。 

  下面以java為例做詳細說明。

 然后,在OS核心的基礎之上,使用C語言開發一些操作系統的工具(例如Linux/Unix下的很多GUN工具和很多的編譯器)。 以Linux/Unix OS為例, 其核心都是使用匯編語言和C語言編寫的,然后,基於核心,使用C語言,開發出了C++編譯器和C++的運行時環境,有了C++編譯器,就可以在該操作系統上使用C++語言來編寫一些比較高級的工具軟件了,例如,系統管理工具等。  開發出的這些C++代碼經過

C++編譯器編譯以后, 在C++運行時環境中運行, 就可以提供系統管理工具給用戶使用了。 同樣, 用戶自己也可以使用C++編寫各種軟件,然后類似的編譯運行了。

 

高級語言的編譯器可以用低級語言編寫。C語言的編譯器一般由匯編語言編寫,匯編的只能由機器語言寫

現代計算機系統內的編譯器一般是這樣寫出來的,假定我們把這種語言成為L:
1)用低一級的語言L1編寫一個最初版本的編譯器CL2,用於編譯高一級的語言L2。(最低級的語言就是機器代碼)
2)用最初版本的編譯器CL2所支持的部分L2語言編寫一個擴展版本的L2的編譯器CL2‘
3)用CL2編譯CL2’,得到優化版本的編譯器。

4)迭代多次,得到完備版本的L2的編譯器。

5)用最終版本的編譯器編譯所有的L2程序

 

對上述過程的解釋:計算機的CPU只能處理二進制的機器碼,內存中存放的也只能是二進制的符號,在最開始的時候,人們是使用機器碼來寫代碼的(例如最初的打卡機),后來,用機器碼寫了一個程序,該程序能夠讀入一些簡單的字符,並且將這些簡單的字符經過處理后轉換成二進制的機器碼,放到計算機中去執行,這個就是最初的匯編器,它所能處理(翻譯)的那些字符命令的集合就成為匯編語言; 有了這些基本的匯編字符指令,就可以使用這些指令來簡化代碼的編寫了,例如:以前做同樣的一個處理,用機器碼需要寫很多機器碼,現在如果用等效的匯編指令寫的話,值需要較少的指令,而且這些指令經過二進制的匯編器處理以后,就生成了一模一樣的二進制機器碼。

   這樣的話,就可以利用這些僅有的指令,寫一些匯編程序,實現一些功能了。利用這些匯編指令,我們可以寫一些處理額外字符指令的匯編代碼,這些代碼結果二進制匯編器處理后,得到一個新的二進制程序,該程序將能夠處理這些額外的字符指令,這就是一個擴展的匯編器,使用類似的迭代,就可以逐步完善匯編器的功能了。 所有的編譯器都是如此的。

編譯器說白了就是語言翻譯,對於高級語言,你要想讓它運行,那么必須有這種語言的編譯器或解釋器。
當匯編語言產生的時候,匯編器(用現在的觀點來看,因為匯編器是一對一的,所以一般不稱之為編譯器了)是用機器語言寫的。之后因為有了匯編器,那么就可以匯編語言來自舉寫更高一級語言的編譯器了。
之后的編譯器同理。

 Linux Kernel的源代碼有200多MB,編譯以后大概有幾十M,而整個的WindowsXP源代碼有幾個G呢,編譯后大概有600M。

基於操作系統的軟件的編寫所使用的語言,那就很多了,不同的軟件可能用不同的語言。

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM