java開發(fā)對cpu要求高嗎 javascript為什么不像java一樣直接事先編譯成字節(jié)碼然后跑在v8上?
javascript為什么不像java一樣直接事先編譯成字節(jié)碼然后跑在v8上?js到v8 其實已經(jīng)沒有虛擬機字節(jié)碼這層了,直接編譯成cpu指令了,這也是v8快的核心。java反而多出一層虛擬機指令。但
javascript為什么不像java一樣直接事先編譯成字節(jié)碼然后跑在v8上?
js到v8 其實已經(jīng)沒有虛擬機字節(jié)碼這層了,直接編譯成cpu指令了,這也是v8快的核心。java反而多出一層虛擬機指令。
但js本質(zhì)還是有很多動態(tài)語言特性,動態(tài)語言因為無法提前固化變量類型,就會多出不少處理成本。
一旦編譯完成,第一次運行的代碼會有緩存成cpu的指令,一旦緩存java的也會繞過虛擬指令,所以到這個階段,單純就cpu指令而言,沒有啥區(qū)別。包括馬上推出的php8也是如此。
但復雜在每個語言優(yōu)化程度,和對動態(tài)部分解析有差異,而造成實際的速度還是有區(qū)別。從這點來說,java沉淀的時間更久,強語言特性也沒有歷史負擔,所以java在運行后會顯得更快一些。
Java 為什么要編譯為字節(jié)碼?
java是解釋性語言,但是它又和js,python這類純解釋語言不一樣,它需要先編譯再直行。但是和c語言不一樣,java編譯成字節(jié)碼文件,而非本地碼,由于有了編譯這個過程,使得java可以
1 通過編譯直接給出語法級的錯誤,保證最終執(zhí)行的都是正確(語法級別)的代碼
2 通過編譯可以對代碼進行一部分的優(yōu)化(比如字符串拼接改為StringBuilder)
3 對代碼進行規(guī)整(字節(jié)碼文件內(nèi)部是一套非常規(guī)范的結(jié)構(gòu)化存儲,建議可以看下字節(jié)碼文件的內(nèi)部結(jié)構(gòu)),提升解釋執(zhí)行時的訪問性能
4 可以壓縮大小,字節(jié)碼文件內(nèi)部非常緊湊,沒有注釋空行等運行時不需要的東西
5 跨平臺,通過編譯成字節(jié)碼這種中間格式而非機器碼,使得java可以輕而易舉地跨平臺(一次編譯,隨處執(zhí)行)
6 便于加密,通過使用一些編譯插件可以對其進行混淆和加密,而不會像js那樣,直接可以看源碼(字節(jié)碼可以被反編譯,通過混淆以后,可以提升反編譯難度)
7 字節(jié)碼有版本信息,便于jvm運行時的校驗(比如你用了jdk7的新特性,那么jvm6在加載的時候就可以先做校驗,避免運行中才提示錯誤)