1. 語(yǔ)言類型:
首先,C/C++、Java 、Python都是強(qiáng)類型的語(yǔ)言。強(qiáng)類型語(yǔ)言的定義如下:
- 強(qiáng)類型語(yǔ)言是一種強(qiáng)制類型定義的語(yǔ)言,即一旦某一個(gè)變量被定義類型,如果不經(jīng)強(qiáng)制轉(zhuǎn)換,那么它永遠(yuǎn)就是該數(shù)據(jù)類型。而弱類型語(yǔ)言是一種弱類型定義的語(yǔ)言,某一個(gè)變量被定義類型,該變量可以根據(jù)環(huán)境變化自動(dòng)進(jìn)行轉(zhuǎn)換,不需要經(jīng)過(guò)現(xiàn)行強(qiáng)制轉(zhuǎn)換。
- 強(qiáng)類型語(yǔ)言包括:Java、.Net、Python、C/C++ 等語(yǔ)言。其中 Python 是動(dòng)態(tài)語(yǔ)言,是強(qiáng)類型定義語(yǔ)言,是類型安全的語(yǔ)言,Java 是靜態(tài)語(yǔ)言,是強(qiáng)類型定義語(yǔ)言,也是;類型安全的語(yǔ)言;
- 弱類型語(yǔ)言包括:VB,PHP,JavaScript 等語(yǔ)言。其中 VBScript 是動(dòng)態(tài)語(yǔ)言,是一種類型不安全的原因。
- 強(qiáng)類型語(yǔ)言和弱類型原因其判斷的根本是是否會(huì)隱形進(jìn)行語(yǔ)言類型轉(zhuǎn)變。強(qiáng)類型原因在速度上可能略遜于弱類型語(yǔ)言,但是強(qiáng)類型定義語(yǔ)帶來(lái)的嚴(yán)謹(jǐn)性又避免了不必要的錯(cuò)誤。
上面提到了動(dòng)態(tài)語(yǔ)言與靜態(tài)語(yǔ)言,那就講講動(dòng)態(tài)語(yǔ)言靜態(tài)語(yǔ)言的區(qū)別:
- 動(dòng)態(tài)類型語(yǔ)言:動(dòng)態(tài)性語(yǔ)言是指在運(yùn)行期間才去做數(shù)據(jù)類型檢查的語(yǔ)言,也就是說(shuō)動(dòng)態(tài)類型語(yǔ)言編程時(shí),永遠(yuǎn)不用給任何變量指定數(shù)據(jù)類型,該語(yǔ)言會(huì)在第一次賦值給變量時(shí),在內(nèi)部將數(shù)據(jù)類型記錄下來(lái)。Python 和 Ruby 就是一種典型的動(dòng)態(tài)類型語(yǔ)言,其他的各種腳本語(yǔ)言,如 VBScript 也多少屬于動(dòng)態(tài)類型語(yǔ)言。
- 靜態(tài)類型語(yǔ)言:靜態(tài)類型語(yǔ)言與動(dòng)態(tài)類則剛好相反,它的數(shù)據(jù)類型在編譯期間檢查,也就是說(shuō)在寫程序時(shí)要聲明所有變量的數(shù)據(jù)類型,C/C++ 是靜態(tài)類型語(yǔ)言的典型代表,其他靜態(tài)語(yǔ)言還有 C#、Java 等。
對(duì)于動(dòng)態(tài)語(yǔ)言與靜態(tài)語(yǔ)言的區(qū)分,其根本在于判斷是在運(yùn)行期間去做數(shù)據(jù)類型還是在編譯期間檢查。
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-768264.html
?
2. 面向過(guò)程與面向?qū)ο?/strong>
C 語(yǔ)言是面向過(guò)程的,C++、JAVA、Python 都是面向?qū)ο?/strong>的。
- 面向過(guò)程是直接將解決問(wèn)題的步驟分析出來(lái),然后用函數(shù)把步驟一步一步實(shí)現(xiàn),然后再依次調(diào)用就可以了。
- 而面向?qū)ο笫菍?gòu)成問(wèn)題的事物,分解成若干個(gè)對(duì)象,建立對(duì)象的目的不是為了完成一個(gè)步驟,而是為了描述某個(gè)事物在解決問(wèn)題過(guò)程中的行為。
打個(gè)比方,我們想求長(zhǎng)方形的面積:
++++++++++++++++++++++++++++++++++++++++++++++
面向過(guò)程會(huì)以,求解數(shù)學(xué)題的思路去思考:
設(shè)定長(zhǎng)方形的長(zhǎng)和寬分別為 x 和 y,
確定長(zhǎng)方形面積的算法
編寫出計(jì)算面積的函數(shù)
將 x、y 傳入相對(duì)應(yīng)的函數(shù),求解長(zhǎng)方形的面積。
++++++++++++++++++++++++++++++++++++++++++++++
面向?qū)ο髸?huì)以,描述對(duì)象的思路去思考:
對(duì)規(guī)則圖形的一般屬性和性質(zhì)進(jìn)行定義,如周長(zhǎng)和面積
在規(guī)則圖形的基礎(chǔ)上,創(chuàng)建長(zhǎng)方形,描述長(zhǎng)方形的屬性和性質(zhì)
創(chuàng)建長(zhǎng)方形的對(duì)象,調(diào)用它的面積函數(shù),以求解長(zhǎng)方形的面積
++++++++++++++++++++++++++++++++++++++++++++++
從這個(gè)簡(jiǎn)單的例子中我們可以看出面向?qū)ο蠛兔嫦蜻^(guò)程解決問(wèn)題的不同,但似乎他們的規(guī)模并沒(méi)有太大區(qū)別。這是因?yàn)槔又袉?wèn)題規(guī)模非常小,當(dāng)我們實(shí)際解決一個(gè)規(guī)模不小的問(wèn)題時(shí),可能會(huì)涉及多個(gè)對(duì)象間的交互、代碼的復(fù)用及擴(kuò)展問(wèn)題,此時(shí)面向?qū)ο蟮膬?yōu)點(diǎn)就顯現(xiàn)出來(lái)了。畢竟,面向?qū)ο缶褪菫榱私档拖到y(tǒng)的耦合度而提出的。(耦合度:各模塊間相互聯(lián)系程度的度量)?但面向過(guò)程也并非一無(wú)是處,其優(yōu)良的效率是面向?qū)ο箅y以達(dá)到的。
因此,我們可以將他們的優(yōu)缺點(diǎn)概括如下:
面向過(guò)程
特性
自頂向下、逐步求精、模塊化
優(yōu)點(diǎn)
性能比面向?qū)ο蟾?,因?yàn)轭愓{(diào)用需要實(shí)例化,開(kāi)銷比較大,比較消耗資源。
如單片機(jī)、嵌入式開(kāi)發(fā)、Linux/Unix 等一般采用面向過(guò)程開(kāi)發(fā),因?yàn)樵谒鼈兛磥?lái)性能是最重要的因素。
缺點(diǎn)
沒(méi)有面向?qū)ο笠拙S護(hù)、易復(fù)用、易擴(kuò)展
(按照面向過(guò)程的思想,在解決問(wèn)題時(shí),各函數(shù)之間是為了這個(gè)問(wèn)題服務(wù);而面向?qū)ο蟮乃枷?,則是站在提出問(wèn)題的主體的角度去解決問(wèn)題,可將解決這一具體問(wèn)題的步驟,抽象為解決這一類問(wèn)題的方法,以后再遇到類似的問(wèn)題,可以復(fù)用解決思路)
?
面向?qū)ο?/strong>
特性
封裝、繼承、多態(tài)、抽象
優(yōu)點(diǎn)
易維護(hù)、易復(fù)用、易擴(kuò)展
缺點(diǎn)
性能比面向過(guò)程低
?
?
3. 編譯型和解釋型語(yǔ)言
計(jì)算機(jī)是不能理解高級(jí)語(yǔ)言的,更不能直接執(zhí)行高級(jí)語(yǔ)言,它只能直接理解機(jī)器語(yǔ)言,所以使用任何高級(jí)語(yǔ)言編寫的程序若想被計(jì)算機(jī)運(yùn)行,都必須將其轉(zhuǎn)換成計(jì)算機(jī)語(yǔ)言,也就是機(jī)器碼。而這種轉(zhuǎn)換的方式有兩種:
1.編譯
2.解釋
由此高級(jí)語(yǔ)言也分為編譯型語(yǔ)言和解釋型語(yǔ)言。
主要區(qū)別在于,前者源程序編譯后即可在該平臺(tái)運(yùn)行,后者是在運(yùn)行期間才編譯。所以前者運(yùn)行速度快,后者跨平臺(tái)性好。
?
編譯型語(yǔ)言
編譯型語(yǔ)言使用專門的編譯器,針對(duì)特定的平臺(tái),將高級(jí)語(yǔ)言源代碼一次性的編譯成可被該平臺(tái)硬件執(zhí)行的機(jī)器碼,并包裝成該平臺(tái)所能識(shí)別的可執(zhí)行性程序的格式。
特點(diǎn)
在編譯型語(yǔ)言寫的程序執(zhí)行之前,需要一個(gè)專門的編譯過(guò)程,把源代碼編譯成機(jī)器語(yǔ)言的文件,如exe格式的文件,以后要再運(yùn)行時(shí),直接使用編譯結(jié)果即可,如直接運(yùn)行exe文件。因?yàn)橹恍杈幾g一次,以后運(yùn)行時(shí)不需要編譯,所以編譯型語(yǔ)言執(zhí)行效率高。
總結(jié)
1. 一次性的編譯成平臺(tái)相關(guān)的機(jī)器語(yǔ)言文件,運(yùn)行時(shí)脫離開(kāi)發(fā)環(huán)境,運(yùn)行效率高;
2. 與特定平臺(tái)相關(guān),一般無(wú)法移植到其他平臺(tái);
3. 現(xiàn)有的 C/C++、Objective 等都屬于編譯型語(yǔ)言。
?
解釋型語(yǔ)言
使用專門的解釋器對(duì)源程序逐行解釋成特定平臺(tái)的機(jī)器碼并立即執(zhí)行。是代碼在執(zhí)行時(shí)才被解釋器一行行動(dòng)態(tài)翻譯和執(zhí)行,而不是在執(zhí)行之前就完成翻譯。
特點(diǎn)
解釋型語(yǔ)言不需要事先編譯,其直接將源代碼解釋成機(jī)器碼并立即執(zhí)行,所以只要某一平臺(tái)提供了相應(yīng)的解釋器即可運(yùn)行該程序。
總結(jié)
1. 解釋型語(yǔ)言每次運(yùn)行都需要將源代碼解釋稱機(jī)器碼并執(zhí)行,效率較低;
2. 只要平臺(tái)提供相應(yīng)的解釋器,就可以運(yùn)行源代碼,所以可以方便源程序移植;
3. Python 等屬于解釋型語(yǔ)言。
?
編譯型與解釋型,兩者各有利弊
前者由于程序執(zhí)行速度快,同等條件下對(duì)系統(tǒng)要求較低,因此像開(kāi)發(fā)操作系統(tǒng)、大型應(yīng)用程序、數(shù)據(jù)庫(kù)系統(tǒng)等時(shí)都采用它,像 C/C++、Pascal/Object Pascal(Delphi) 等都是編譯語(yǔ)言,而一些網(wǎng)頁(yè)腳本、服務(wù)器腳本及輔助開(kāi)發(fā)接口這樣的對(duì)速度要求不高、對(duì)不同系統(tǒng)平臺(tái)間的兼容性有一定要求的程序則通常使用解釋性語(yǔ)言,如 Java、JavaScript、VBScript、Perl、Python、Ruby、MATLAB 等等。
?
?
關(guān)于 Java
Java 和其他的語(yǔ)言不太一樣。因?yàn)?Java 針對(duì)不同的平臺(tái)有不同的 JVM,實(shí)現(xiàn)了跨平臺(tái)。所以 Java 語(yǔ)言有一次編譯到處運(yùn)行的說(shuō)法。
1. 你可以說(shuō)它是編譯型的:因?yàn)樗械?Java 代碼都是要編譯的,.java 文件不經(jīng)過(guò)編譯就什么用都沒(méi)有。
2. 你可以說(shuō)它是解釋型的:因?yàn)?Java 代碼編譯后不能直接運(yùn)行,它是解釋運(yùn)行在 JVM 上的,所以它是解釋運(yùn)行的,那也就算是解釋的了。
3. 但是,現(xiàn)在的 JVM 為了效率,都有一些JIT優(yōu)化。它又會(huì)把 .class 文件的二進(jìn)制代碼編譯為本地的代碼直接運(yùn)行,所以,又是編譯的。
?
?
?
筆者認(rèn)為 Java 更偏向解釋型的語(yǔ)言,因?yàn)殡m然 Java 也需要編譯,編譯成 .class 文件,但是并不是機(jī)器可以識(shí)別的語(yǔ)言,而是字節(jié)碼,最終還是需要 jvm的解釋,才能在各個(gè)平臺(tái)執(zhí)行,這同時(shí)也是 Java 跨平臺(tái)的原因。
?
因此可以如下分類:
編譯型的語(yǔ)言:C/C++
解釋型的語(yǔ)言:Java、Python
另附上一張 JAVA 與 C/C++ 對(duì)比的圖片,是筆者在學(xué)習(xí)時(shí)看到的,有些方面筆者也正在學(xué)習(xí)中,因此不一一解釋了,供大家一起學(xué)習(xí)。
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-768264.html
?
到了這里,關(guān)于全面對(duì)比 Python、Go、VB、PHP、C/C++、C#、.Net、Java、… 等多種編程語(yǔ)言的區(qū)別的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!