java Java中為什么不設(shè)置一個(gè)函數(shù),讓程序員來(lái)標(biāo)記可以被gc回收的變量?
Java中為什么不設(shè)置一個(gè)函數(shù),讓程序員來(lái)標(biāo)記可以被gc回收的變量?為了擺脫放羊的艱苦生活,小a努力學(xué)習(xí)。他成功后,朋友邀請(qǐng)他到澳大利亞買(mǎi)了一個(gè)農(nóng)場(chǎng),過(guò)上舒適的生活。如果你想寫(xiě),你可以寫(xiě)C。但現(xiàn)實(shí)是,
Java中為什么不設(shè)置一個(gè)函數(shù),讓程序員來(lái)標(biāo)記可以被gc回收的變量?
為了擺脫放羊的艱苦生活,小a努力學(xué)習(xí)。他成功后,朋友邀請(qǐng)他到澳大利亞買(mǎi)了一個(gè)農(nóng)場(chǎng),過(guò)上舒適的生活。
如果你想寫(xiě),你可以寫(xiě)C。但現(xiàn)實(shí)是,許多C不能忍受他們的GC切換到Java。。。你想倒退。。。
最初,Java的GC的優(yōu)點(diǎn)是異步集中收集,這是一種比手動(dòng)刪除更有效的方法。為什么你要自立,自己動(dòng)手。
Java能不能像C語(yǔ)言不通過(guò)JVM虛擬機(jī)直接編譯成二進(jìn)制機(jī)器碼,讓計(jì)算機(jī)直接運(yùn)行?
從語(yǔ)言設(shè)計(jì)的角度看,可以通過(guò)重新設(shè)計(jì)編譯器來(lái)實(shí)現(xiàn),但從工程實(shí)踐的角度看是不可行的。
首先,Java語(yǔ)言最大的特點(diǎn)是跨平臺(tái)的可移植性,一次開(kāi)發(fā),一次編譯,多平臺(tái)執(zhí)行。這個(gè)特性是通過(guò)JVM(Java虛擬機(jī))實(shí)現(xiàn)的。如果重寫(xiě)編譯器直接編譯成C語(yǔ)言這樣的可執(zhí)行程序,它將失去跨平臺(tái)特性。
其次,Java語(yǔ)言在設(shè)計(jì)之初就被設(shè)計(jì)成嚴(yán)重依賴(lài)JRE(Java運(yùn)行時(shí)環(huán)境)的語(yǔ)言。一些語(yǔ)言設(shè)計(jì)缺陷必須依靠JVM來(lái)解決,比如GC(垃圾收集)。我們知道Java語(yǔ)言沒(méi)有內(nèi)存恢復(fù)能力,所以我們不得不依賴(lài)JVM。在工程實(shí)踐中,如果軟件不能進(jìn)行內(nèi)存恢復(fù),后果將是災(zāi)難性的。
第三,Java語(yǔ)言是面向?qū)ο蟮?,不同于同樣面向?qū)ο蟮腃語(yǔ)言,Java還具有動(dòng)態(tài)特性。
它允許程序動(dòng)態(tài)加載運(yùn)行過(guò)程中所需的類(lèi),這在面向?qū)ο缶幊讨惺荂語(yǔ)言無(wú)法實(shí)現(xiàn)的。在C語(yǔ)言編程過(guò)程中,每次向類(lèi)中添加實(shí)例變量或成員函數(shù)時(shí),引用該類(lèi)的所有子類(lèi)都必須重新編譯,否則會(huì)導(dǎo)致程序崩潰。Java從以下幾個(gè)方面采取措施來(lái)解決這個(gè)問(wèn)題。java編譯器沒(méi)有將對(duì)實(shí)例變量和成員函數(shù)的引用編譯成數(shù)值引用,而是將符號(hào)引用信息保存在字節(jié)碼中并傳遞給解釋器,解釋器在動(dòng)態(tài)連接類(lèi)后將符號(hào)引用信息轉(zhuǎn)換成數(shù)值偏移量。這樣,在內(nèi)存中生成的對(duì)象不會(huì)在編譯期間確定,而是延遲到運(yùn)行時(shí)并由解釋器確定。這樣,更新類(lèi)中的變量和方法不會(huì)影響現(xiàn)有代碼。在解釋和執(zhí)行字節(jié)碼時(shí),只有在出現(xiàn)新名稱(chēng)時(shí)才執(zhí)行一次符號(hào)信息的搜索和轉(zhuǎn)換,然后才能全速執(zhí)行代碼。在運(yùn)行時(shí)確定引用的好處是可以使用更新的類(lèi),而不用擔(dān)心影響原始代碼。如果程序連接到網(wǎng)絡(luò)中另一個(gè)系統(tǒng)中的類(lèi),則該類(lèi)的所有者可以自由更新該類(lèi),而不會(huì)使引用該類(lèi)的任何程序崩潰。這完全取決于JRE。
以上幾點(diǎn)決定了Java不能像C語(yǔ)言那樣直接編譯成機(jī)器代碼。當(dāng)然,還有其他一些因素,但我認(rèn)為以上幾點(diǎn)是最重要的。
c 程序員轉(zhuǎn)java好轉(zhuǎn)嗎?
在這個(gè)時(shí)候,我終于有時(shí)間寫(xiě)一篇我想寫(xiě)的文章。其實(shí),這篇文章的標(biāo)題并不十分準(zhǔn)確。當(dāng)C程序員編寫(xiě)java代碼時(shí),他們不必轉(zhuǎn)用java而放棄C,他們只有一個(gè)選擇。這兩種語(yǔ)言各有優(yōu)點(diǎn)。我們不要談?wù)Z言爭(zhēng)端。讓我們假設(shè)一個(gè)朋友需要這樣的角色轉(zhuǎn)變。在編寫(xiě)了多年的C語(yǔ)言之后,突然一個(gè)項(xiàng)目需要用Java來(lái)編寫(xiě)。
Java語(yǔ)言和C語(yǔ)言在語(yǔ)法上有很多相似之處,但在本質(zhì)上有區(qū)別。當(dāng)一個(gè)合格的C程序員寫(xiě)下每一行代碼時(shí),他必須記住如何存儲(chǔ)代碼中的每一個(gè)變量,堆棧結(jié)構(gòu)是什么,如果處理不當(dāng),哪一塊內(nèi)存會(huì)造成很大的麻煩。然而,Java程序員有些不同。由于Java語(yǔ)言規(guī)范和Java虛擬機(jī)規(guī)范是分離的,再加上自動(dòng)GC,操作性較差。但這不是壞事。畢竟,手動(dòng)內(nèi)存管理有其復(fù)雜性。
就個(gè)人而言,對(duì)于C程序員來(lái)說(shuō),Java語(yǔ)法沒(méi)有問(wèn)題??梢哉f(shuō)80%以上的結(jié)構(gòu)是相同的,所以這不是問(wèn)題。但是如果你學(xué)英語(yǔ)語(yǔ)法,你能通過(guò)大學(xué)英語(yǔ)六級(jí)考試嗎?我們能和外國(guó)人見(jiàn)面聊天嗎?不一定。順便說(shuō)一句,我們要學(xué)習(xí)方言、成語(yǔ)和句型。當(dāng)我們進(jìn)入Java世界時(shí),我們必須按照J(rèn)ava的規(guī)則來(lái)玩。例如,如何創(chuàng)建一個(gè)對(duì)象、如何比較兩個(gè)對(duì)象、如何使用枚舉類(lèi)型、如何編寫(xiě)泛型代碼、并發(fā)代碼何時(shí)要實(shí)現(xiàn)上層結(jié)構(gòu)、何時(shí)在代碼中拋出異常以及何時(shí)使用反射。我認(rèn)為,一個(gè)更專(zhuān)注于技術(shù)的人可能還需要至少三個(gè)月的項(xiàng)目培訓(xùn)才能獲得資格。當(dāng)然,我說(shuō)的前提是這個(gè)C工程師有相當(dāng)?shù)幕A(chǔ),所以他可以站在一座山上看另一座山。
所以我認(rèn)為C程序員轉(zhuǎn)向Java的捷徑是:學(xué)習(xí)Java習(xí)慣用法、模式和項(xiàng)目調(diào)整。
C程序員的另一個(gè)優(yōu)勢(shì)是,由于主流JVM是用C/C代碼編寫(xiě)的,因此喜歡深入研究的人會(huì)非常有幫助。只要你有足夠的調(diào)試技巧,對(duì)一切都了如指掌,這種方法也適用于JavaScript,因?yàn)閂8也是C的,負(fù)責(zé)任地說(shuō),它目前還沒(méi)有過(guò)時(shí),近期也不會(huì)過(guò)時(shí)?!吧钊肜斫釰ava虛擬機(jī)”是否過(guò)時(shí),取決于Java語(yǔ)言本身是否過(guò)時(shí)。目前,Java在很多領(lǐng)域都扮演著重要的角色。在語(yǔ)言排名中,它也長(zhǎng)期處于前列。Java本身的可移植性使得許多服務(wù)器和web后端開(kāi)發(fā)都傾向于添加,而Java本身的語(yǔ)言特性,以及豐富的庫(kù),使得它在許多語(yǔ)言中都經(jīng)久不衰。作為java開(kāi)發(fā)中一個(gè)至關(guān)重要的虛擬機(jī),開(kāi)發(fā)人員對(duì)其機(jī)制的理解程度如何,也是區(qū)分優(yōu)秀java開(kāi)發(fā)人員和普通開(kāi)發(fā)人員的標(biāo)準(zhǔn)之一。所以作為一個(gè)java開(kāi)發(fā)人員,如果你想在技術(shù)上有更深入的開(kāi)發(fā),虛擬機(jī)機(jī)制是一個(gè)必須跨越的障礙。而《深入了解Java虛擬機(jī)》是一本介紹這方面知識(shí)的比較經(jīng)典的書(shū),值得推薦。