編程語言類型淺談比較

前言

前些日子羣裏有人問說了這麼一段話引起裏我的好奇:

語言層選擇上雖然沒有什麼好說的,不過不知道大家在學習語言的時候有沒有像他一樣的困惑。

他其實講的是js對象和Java對象的區別,Java面向對象有繼承,封裝,多態三大特性,而js是基於對象的,繼承等是通過原型鏈或其他方法進行實現。比如在上邊的例子中Java對象可以這樣實現:

// Java
Student stu = new Student();  //調用構造函數
stu.setName("Allen");  //調用成員方法
System.out.println(stu.name); //對象屬性

js的話會這麼寫:構造函數+成員方法+對象屬性

// JS
<script>
var student = {
    name: "Allen",
    fullName : function() 
	{
       return this.name;
    }
};
document.getElementById("demo").innerHTML = person.fullName();
</script>

這就涉及到js和Java的面向對象的不同,Java三大特性在js中都有不同的實現。而除了面向對象,我們可以更擴展地討論下編程語言的類型系統,並把幾個比較常用的語言拿出來對比總結一下。從語言類型的角度探究各種編程語言都有什麼不同。

一,編程語言類型系統

強類型語言

強類型語言是一種總是強制類型定義的語言,要求變量的使用嚴格符合定義,所有變量都必須先定義後使用。Java、.Net和C++等一些語言都是強制類型定義的,也就是說,一旦一個變量被指定了某個數據類型,如果不經過強制轉換,那麼它就永遠是這個數據類型了。例如你有一個整數,如果不顯式地進行轉換,你不能將其視爲一個字符串。

弱類型語言

弱類型語言也稱爲弱類型定義語言,與強類型定義相反。像VB,PHP等一些語言就屬於弱類型語言。簡單理解就是一種變量類型可以被忽略的語言。比如弱類型定義的可以將字符串'12'和整數3進行連接得到字符串'123',然後可以把它看成整數123,而不用顯示轉換。但其實他們的類型沒有改變,編譯器只是在判斷出一個表達式含有不同類型的變量之後,自動在這些變量前加了一個clong()或(int)()這樣的轉換函數而已。

靜態類型

靜態類型是編譯期間做檢查數據類型的語言,即寫程序時要聲明所有變量的數據類型,是固定的。使用數據之前,必須先聲明數據類型(int ,float,double等)。相當於使用之前,首先要爲它們分配好內存空間。

動態類型

動態類型是運行期間才做數據類型檢查的語言,即動態類型語言編程時,永遠不用給任何變量指定數據類型。該語言會在第一次賦值給變量時,在內部將數據類型記錄下來。

各種語言類型比較

強類型語言在速度上可能略遜色於弱類型語言,但是強類型語言帶來的嚴謹性可以有效地幫助避免許多錯誤。

靜態語言可能結構完整更好調試,動態語言就不需要很多類型相關的代碼

以下是各種熱門語言的類型分佈圖:

 

二,Java

Java屬於強類型,靜態類型語言

Java語言支持的變量類型有:

類變量:獨立於方法之外的變量,用 static 修飾。訪問通過類名調用訪問,以下例子省略
實例變量:獨立於方法之外的變量,不過沒有 static 修飾。
局部變量:類的方法中的變量。

它實現變量賦值是這樣的:

//局部變量棧上分配,初始化之後纔可以使用
int a = 1; 

/* 
   實例變量產生在類中
   對象實例化後變量值隨之確定
*/
public class Student {
  public String name;

  //在構造器中對name賦值
   public Student (String stuName){
      name = stuName;
   }
}

Student stu = new Student("Allen");

類型轉換是這樣的:

基本類型互轉以小轉大可以直接轉,以大轉小需要強制類型轉換/

short a = 0;

int b = a;

a = (short) b;

string需要包裝類型轉換

s = "111"

int i = Integer.parseInt( s );

包裝類型和基本類型可以實現自動裝箱拆箱

Integer i = 99;

int a = i;

三,Golang

golang的本質是一種靜態類型的語言,但它在編寫時又可以寫成動態類型語言的聲明。

它實現變量賦值是這樣的:

var identifier type

甚至可以用:=直接聲明初始化

四,Python

Python是強類型動態類型語言,它可以實現變量賦值是這樣的:

Python允許你同時爲多個變量賦值。例如:
a = b = c = 1
以上實例,創建一個整型對象,值爲1,三個變量被分配到相同的內存空間上。
您也可以爲多個對象指定多個變量。例如:
a, b, c = 1, 2, "john"
以上實例,兩個整型對象 1 和 2 分別分配給變量 a 和 b,字符串對象 "john" 分配給變量 c。

五,C++

C++可以讓程序員更細緻地內存管理,

它實現變量賦值是這樣的:

變量告訴編譯器在何處創建變量的存儲,以及如何創建變量的存儲。變量定義指定一個數據類型,幷包含了該類型的一個或多個變量的列表,如下所示:

type variable_list;


在這裏,type 必須是一個有效的 C++ 數據類型,可以是 char、wchar_t、int、float、double、bool 或任何用戶自定義的對象,variable_list 可以由一個或多個標識符名稱組成,多個標識符之間用逗號分隔。

如果接收值的變量想要的是一個整數,而賦給它的值是一個浮點數,那麼當轉換爲 int 並存儲在變量中時,浮點值將被截斷。這意味着小數點後的所有內容都將被丟棄。示例如下:

int x;
double y = 3.75;
x = y; // x被賦值爲3,y仍然保留3.75

六,JavaScript

Js是動態弱類型語言

它實現變量賦值是這樣的:

var pi=3.14; var person="John Doe"; var answer='Yes I am!';

一條語句中聲明的多個不可以賦同一個值:

var x,y,z=1;

x,y 爲 undefined, z 爲 1。

七,Scala

在 Scala 中,一個很經典的問題是區分val和var。scala使用關鍵詞 "var" 聲明變量,使用關鍵詞 "val" 聲明常量。

變量
聲明變量實例如下:

var myVar : String = "Foo"
var myVar : String = "Too"

以上定義了變量 myVar,我們可以修改它。

常量

聲明常量實例如下:

val myVal : String = "Foo"

以上定義了常量 myVal,它是不能修改的。如果程序嘗試修改常量 myVal 的值,程序將會在編譯時報錯。

動態類型

在 Scala 中聲明變量和常量不一定要指明數據類型,在沒有指明數據類型的情況下,其數據類型是通過變量或常量的初始值推斷出來的。所以,如果在沒有指明數據類型的情況下聲明變量或常量必須要給出其初始值,否則將會報錯。

var myVar = 5;
val myVal = "Hello, Scala!";

以上實例中,myVar 會被推斷爲 Int 類型,myVal 會被推斷爲 String 類型。

 

參考:runoob 菜鳥教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章