https://www.52fb.cn語(yǔ)言為什么有變量類型這個(gè)概念?
▇ 首先,我們需要搞清楚類型的由來(lái)。
https://www.52fb.cn語(yǔ)言中所謂的類型,具體指的是數(shù)據(jù)(包括對(duì)象)的類型。數(shù)據(jù)類型的產(chǎn)生有概念和物理兩個(gè)方面因素:
概念因素:數(shù)據(jù)因其本身內(nèi)容在中我們腦子里對(duì)應(yīng)的數(shù)學(xué)概念不同而進(jìn)行的分類,常見(jiàn)類型有:數(shù)字(正整數(shù)、整數(shù)、小數(shù)、復(fù)數(shù))、布爾、字符、符號(hào)、空、以及各種數(shù)據(jù)結(jié)構(gòu)(字符串、數(shù)組、向量、列表、字典、集合、函數(shù)、... ),這些類型是在我們長(zhǎng)期的數(shù)學(xué)應(yīng)用中就形成的,是對(duì)外部概念的抽象;物理因素:我們?cè)谟?jì)算機(jī)語(yǔ)言中所定義的數(shù)據(jù),最終需要實(shí)現(xiàn)在物理機(jī)器上,而非僅僅是大腦中的數(shù)學(xué)概念,這就要求,知道數(shù)據(jù)的大小、編碼格式、等 這樣的物理信息,根據(jù)這些信息就可以將數(shù)據(jù)分類,例如:C語(yǔ)言中,同樣是整數(shù)卻因大小不同而分為: char,short, long,long long,這些類型是因?yàn)槲锢韺?shí)現(xiàn)而產(chǎn)生的;若,將所有計(jì)算機(jī)語(yǔ)言,按照接近程度,從機(jī)器到數(shù)學(xué)排成一列,則越靠近機(jī)器這邊的語(yǔ)言,其數(shù)據(jù)類型越受物理因素影響,例如:匯編、C/C++,反之,越接近數(shù)學(xué)的語(yǔ)言的數(shù)據(jù)類型越會(huì)圍繞數(shù)學(xué)概念進(jìn)行設(shè)計(jì),例如:Lisp、R、JavaScript。
▇ 接著,我們來(lái)看變量與數(shù)據(jù)類型的關(guān)系。
在所有計(jì)算機(jī)語(yǔ)言中,大體有兩種看待變量的方式:
變量是保存數(shù)據(jù)的容器;變量是訪問(wèn)數(shù)據(jù)的入口;● 采用第一種方式的計(jì)算機(jī)語(yǔ)言:
因?yàn)樽兞啃枰4鏀?shù)據(jù),所以變量受其保存的數(shù)據(jù)的類型制約。
將數(shù)據(jù)保存到同類型變量的過(guò)程,稱為賦值。
在我們聲明變量時(shí),計(jì)算機(jī)要給這個(gè)變量分配內(nèi)存,這時(shí),計(jì)算機(jī)至少需要知道這個(gè)變量將來(lái)的賦值數(shù)據(jù)的物理大小,于是,計(jì)算機(jī)語(yǔ)言,不得不要求,聲明變量時(shí),必須指出其賦值數(shù)據(jù)的類型(包含物理大小信息)。另一方面,根據(jù)數(shù)據(jù)類型對(duì)變量被分配的內(nèi)存將伴隨它的整個(gè)生命周期,同時(shí),在訪問(wèn)變量中數(shù)據(jù)時(shí)還會(huì)使用數(shù)據(jù)類型,這就意味著,聲明時(shí)指定的那個(gè)本意是賦值數(shù)據(jù)的類型變成了該變量的類型,這就是所謂的變量類型。
這種,變量有類型的語(yǔ)言,稱為強(qiáng)類型語(yǔ)言。
● 采用第二種方式的計(jì)算機(jī)語(yǔ)言:
其變量?jī)H僅保存,數(shù)據(jù)在對(duì)象池中的,入口地址,而不保存數(shù)據(jù)。將數(shù)據(jù)入口地址保存到變量的過(guò)程,稱為綁定。我們?cè)诼暶髯兞繒r(shí),計(jì)算機(jī)只需要分配一個(gè)保存綁定地址的內(nèi)存塊就可以了,無(wú)需知道將要綁定的什么數(shù)據(jù),于是變量也就沒(méi)有了類型。
這種,變量沒(méi)有類型的語(yǔ)言,稱為弱類型語(yǔ)言。
▇ 最后,我們來(lái)比較一下強(qiáng)弱兩種類型的語(yǔ)言。
早期,強(qiáng)類型語(yǔ)言,都是編譯(靜態(tài))語(yǔ)言,例如:C/C++,F(xiàn)ortran,Pascal 等,這類語(yǔ)言,沒(méi)有強(qiáng)大的運(yùn)行時(shí)來(lái)支持對(duì)象池,因此只能采用第一種方式。而早期,弱類型語(yǔ)言,都是解釋(動(dòng)態(tài))語(yǔ)言,例如:Lisp,Scheme 等,它們有強(qiáng)大的解釋器,其中包括對(duì)象池,因此可以采用第二種方式。
強(qiáng)類型語(yǔ)言,有一個(gè)非常大的優(yōu)勢(shì),那就是:編譯器知道變量的類型,可以提前檢查賦值錯(cuò)誤,再加上,編譯語(yǔ)言的運(yùn)行性能優(yōu)勢(shì),這使得,強(qiáng)類型語(yǔ)言,在上世紀(jì)中葉很快成了主流。但是,強(qiáng)類型的優(yōu)勢(shì)也是缺陷,這就是:由于變量帶有類型,所以代碼和類型強(qiáng)關(guān)聯(lián),很難寫出同時(shí)適用于多種類型的代碼,為了修補(bǔ)這個(gè)缺陷,幾乎同時(shí)出現(xiàn)了兩種解決方案:
從宏(模板)發(fā)展出來(lái)的泛型;面向?qū)ο螅∣OP);泛型使得,類型可以成為某個(gè)代碼塊的參數(shù),在使用該代碼塊時(shí)被具體制定。
面向?qū)ο螅美^承讓子類對(duì)象復(fù)用父類對(duì)象的代碼塊。
在經(jīng)過(guò),泛型 和 OOP 改造后,強(qiáng)類型語(yǔ)言在千禧年前后,到達(dá)了頂峰,以至于這時(shí),出現(xiàn)的 Java 和 C# 這樣的動(dòng)態(tài)編譯語(yǔ)言,也采用強(qiáng)類型。
但是,弱類型語(yǔ)言并非一無(wú)是處:沒(méi)有變量類型是天然的泛型、OOP也可以引入、適用于腳本代碼,因此,才有 JavaScript 和 Python 這樣的 弱類型語(yǔ)言,隨著 計(jì)算機(jī)性能的飛速發(fā)生使得 強(qiáng)類型語(yǔ)言的性能優(yōu)勢(shì)慢慢削弱,而弱類型語(yǔ)言的簡(jiǎn)單靈活慢慢凸顯,這使得,如今的它們也正是 如日中天。
計(jì)算機(jī)源于數(shù)學(xué),早在第一臺(tái)計(jì)算機(jī)出現(xiàn)之前,數(shù)學(xué)家就對(duì)可行性計(jì)算問(wèn)題進(jìn)行了深入的研究,先后出來(lái)了:遞歸函數(shù)、λ-演算、圖靈機(jī),之后 圖靈機(jī)稱為了計(jì)算機(jī)體系結(jié)構(gòu)的數(shù)學(xué)原理,而 λ-演算正是函數(shù)式https://www.52fb.cn的本質(zhì)。因此,我們可以從數(shù)學(xué)角度來(lái)稍微看一下變量(常量)類型。
在數(shù)學(xué)中,變量是有類型的,常見(jiàn)應(yīng)用場(chǎng)景有:
場(chǎng)景一:對(duì)于 任意 x ∈ ?,... ,例如:對(duì)于任意 a, b, c, d ∈ ?,都有 (a2 + b2)(c2+d2) ≥ (ac+bc)2;場(chǎng)景式二:令 x=1,..., 例如:令 K={(1),(1,2)(3,4),(1,3)(2,4),(1,4)(2,3)},則 S? 有正規(guī)群列 {e}?K?A??S?;因此,強(qiáng)類型更符合數(shù)學(xué),如場(chǎng)景一那樣,于是有些的新興強(qiáng)類型語(yǔ)言,會(huì)進(jìn)一步吸收數(shù)學(xué)的特點(diǎn),這些語(yǔ)言允許https://www.b5b6.com不指定變量類型,它是通過(guò)上下文來(lái)推算出變量的類型,如場(chǎng)景二那樣。
變量是否有類型,僅僅是計(jì)算機(jī)語(yǔ)言的類型系統(tǒng)的一部分,即便是同為,強(qiáng)或弱類型語(yǔ)言,其類型系統(tǒng)也差距較大,以下是一些類型系統(tǒng)具有代表性的語(yǔ)言:
C語(yǔ)言,代表命令式https://www.52fb.cn,其類型系統(tǒng)以過(guò)程為核心進(jìn)行設(shè)計(jì);C++語(yǔ)言,代表傳統(tǒng)多繼承面向?qū)ο螅漕愋拖到y(tǒng)多繼承類-對(duì)象為核心;Java語(yǔ)言,代表傳統(tǒng)單繼承面向?qū)ο螅漕愋拖到y(tǒng)單繼承類-對(duì)象為核心,以接口彌補(bǔ)單繼承的不足;JavaScript語(yǔ)言,代表原型鏈單繼承面向?qū)ο螅漕愋拖到y(tǒng)構(gòu)造函數(shù)-原型鏈為核心;Scala語(yǔ)言,代表加入特性的面向?qū)ο螅匦缘募尤霃浹a(bǔ)的單繼承的不足;Lisp語(yǔ)言,代表傳統(tǒng)函數(shù)式https://www.52fb.cn,其類型系統(tǒng)以符號(hào)表達(dá)式為核心;Haskell語(yǔ)言,代表加入范疇的函數(shù)式https://www.52fb.cn,數(shù)學(xué)中的類型,就本質(zhì)而言,就是基于集合(或者比集合更大的類)之上的各種數(shù)學(xué)系統(tǒng),目前最大的代數(shù)系統(tǒng)是范疇,Haskell采用的就是以范疇為核心的類型系統(tǒng);當(dāng)然,類型系統(tǒng),還包括宏和泛型,Scheme的衛(wèi)生宏、C#的泛型,都是典型代表。
另外,除了類型系統(tǒng)外,計(jì)算機(jī)語(yǔ)言設(shè)計(jì)的另外一個(gè)重點(diǎn),就是代碼流程控制,例如:面向側(cè)面、懶惰模式、后繼體、等,按照控制流也可以對(duì)計(jì)算機(jī)語(yǔ)言進(jìn)行分類。