當前位置: 華文問答 > 數位

現在看來,許多程式語言中的「基本型別」是一種設計失敗嗎?

2022-05-18數位

我更傾向於認為這是一種妥協,而不是設計上的失敗

因為在當時那個年代,有它的道理,因為在java設計之初,機器的效能遠沒有今天那麽強大,所以當時的人們,為了效能考慮,所以保留了原始數據型別,也就是primitive type,也就是你說的基本型別

但是後續的語言的發展,就是紛紛幹掉基礎數據型別,primitive type,而將其做成object和 class,也就是類和物件,讓語言自身實作更加純粹的物件導向,比如scala

時至今日,很多語言都已經實作了比當時java更加純粹的物件導向,比如dart,swift,kotlin,當然還有scala

這些語言的原始數據型別本身就是類的物件,你可以實作諸如這種操作

var s = 5. toString (); // 偽碼,返回字串 "5"

對,double,int等原始數據型別本身可以有方法,因為它是物件

然後java自身也在逐步向這些語言靠攏,也就是valhalla英靈殿計畫,北歐神話都很熟悉了,奧丁,雷神以及他的錘子,瓦爾基裏,也就是女武神,芙蕾雅,冰狼芬里耳

為什麽叫英靈殿呢,因為英靈殿是維京戰士們死後,靈魂聚集的地方,被女武神瓦爾基裏收集起來,在英靈殿裏天天繼續練習,互相廝殺,每天死後復活,次日繼續廝殺,如此反復,為命中註定要到來的諸神黃昏做準備

java用這個計畫命名值型別,也就是value class,值類和物件,因為值型別本身沒有物件頭,所以有點像是靈魂一樣,缺少了一些部份,然後經常被拷貝,就像英靈殿裏的靈魂一樣,時不時被復活

java的值型別做好之後,會進一步提供一個原始類,也就是primitive class,primitive class是一種特殊的value class,區別在於primitive object不能為空,而value object可以

然後後續會把primitive type給做成primitive class,也就是原始數據型別會變成原始數據類和物件,那樣int,double這些,就會變成primitive class Integer的同義詞,從而實作類似dart,swift,kotlin等語言那種

5.toString(); 這種方法,實作了這個之後,java就會成為真正意義上的完全的物件導向語言,裏面所有的type,都是object,物件,不管是方法還是原始數據型別

然後物件變多的同時,對gc也提出了更高的要求,因為值型別會盡量行內物件,而且會向immutable不可變靠攏,任何對於物件的改變,都會生成一個新的物件,所以物件數量會增加,那gc的停頓就會成為問題,如果gc的pause時間太長,很明顯會影響使用者體驗,所以英靈殿計畫也是在zgc,shenandoah等短暫停gc計畫完成之後,才逐步展開,有了低於1ms暫停的gc,再也不怕物件太多了