2017-10-19 202 views
2

Java被認爲是一種OOP語言,儘管它不完全是OOP。 Java包含8個原語,並在interview, James Gosling解釋了原因:怎麼可能有一個純粹的面向對象的語言?

Bill Venners:爲什麼Java中有原始類型?爲什麼不是 只是一個對象?

詹姆斯戈斯林:完全是一個效率的東西。有各種各樣的人建立了系統,其中整數和所有對象。 有很多方法可以做到這一點,他們都有一些相當嚴重的問題。其中一些只是很慢,因爲它們爲所有東西分配內存。他們中的一些人試圖做對象,有時他們不是(這是標準的LISP系統所做的),然後事情變得非常奇怪。它的種類 的作品,但它很奇怪。

所以看起來內存和速度都是Java基元解決的問題。然而,這讓我想知道一個語言如何才能真實,純粹的面向對象?

如果只有一個字節原語存在,你可以從那裏建立。創建整數,字符並最終浮動和雙打。但是根本沒有任何基礎結構,你怎麼能建造任何東西?是否至少有一些基本原始的必要?換句話說,不是擴展需要的基礎數據結構?

+0

如果我是沒有錯,一切都是Kotlin中的一個對象。這裏有var和val關鍵字和類型推斷。 – ND523

+0

@ ND523在Kotlin中,一切都顯示爲對象,但編譯器會盡可能地將它們映射到JVM基元,以儘可能節省內存[source](https://discuss.kotlinlang.org/t/primitive-types-in-the-the- type-hierarchy/1519) – EthanBar

+0

JavaScript是另一個所有基元都是對象的例子。例如。 'let a = 4; (「數字」)'a.toFixed(2)'(「4.00」)。 toFixed是Number類型/類的實例方法。 (42).toFixed(2)'(「42.00」)或'「test string」.toUpperCase()'(「TEST STRING」) – marekful

回答

4

如果您問是否有語言無法與原始類型進行交互,那麼您可能需要查看諸如Scala之類的東西。從該頁開始:

Scala是一種純粹的面嚮對象語言,每個值都是一個對象。

然而,正如你指出的(對於科特林):

編譯器將它們映射到JVM時元在所有可能的

節省內存如果你的是什麼定義對象 - 面向對象的語言可能要求所有東西都被表示爲對象,那麼純粹面向對象的語言是不可能的。您無法構建在僅包含對象的實際計算機上運行的語言。這是因爲計算機必須有本地表示數據的方式。這基本上是面嚮對象語言中的原語:底層計算機(或VM)可以表示的本機數據形式。無論你做什麼,你總是需要有一些非對象表示的數據,以便計算機對其進行操作。即使您構建了一個真正將基元表示爲對象的JavaScript解釋器,爲了添加兩個整數,解釋器必須將整數加載到CPU寄存器中,並使用某種形式的指令。

但是這種解釋有點錯過了面向對象編程的觀點。編程語言與程序不同。語言只是我們使計算機做我們想要的工具 - 它們實際上並不存在於運行時。你可能會說用Kotlin或Scala編寫的程序是更多比用C編寫的程序更面向對象,儘管兩種語言都在運行時編譯成相同的彙編指令。因此,如果你放鬆你的定義pure面向對象編程不再關心數據的運行時表示,那麼你會發現純粹的面向對象的語言是可能的。在編程Scala時,你絕不會與任何不是對象的任何東西交互。即使你在運行時變成了一個'原始',它並不重要,因爲作爲程序員,你從來沒有真的需要考慮這個問題(至少在性能和內存從不重要的理想世界中)。 Scala的語言定義根本不包括原語的概念 - 它們是語言實現的一部分,而不是語言本身。到目前爲止你的Java的例子中,Java可能並不是純粹的大多數定義中的面向對象的語言。但是,它大部分是面向對象的。 Java通常被稱爲事實上的面向對象的語言,因爲它比面向對象的面向對象更加面向對象。

更進一步,術語面向對象並沒有真正的definitive meaning。對某些人來說,這可能意味着一切都必須成爲一個對象,而對於其他人來說,這可能意味着需要有對象,一些定義需要類的概念,有些不需要等。

+0

感謝您的詳細解釋。我喜歡你的觀點,即一種語言是由它看起來是作家而不是它被抽象出來的。 – EthanBar

相關問題