Java能編寫出Adobe等級(jí)的行業(yè)軟件嗎?
用C++當(dāng)然可以寫出adobe的軟件,因?yàn)樗鼈儽旧砭褪怯肅/C++寫的。這里我沒有區(qū)分C和C++,可以不嚴(yán)格地認(rèn)為后者就是前者的超集。
現(xiàn)在重點(diǎn)討論的是C#和Java到底能不能寫出類似adobe這樣的軟件。
二八原則我們都聽過,我們多數(shù)人可能只用到了adobe的20%的功能,但是它卻可以滿足80%的需求。如果問我們能否用C#和Java去實(shí)現(xiàn)這20%最基本的功能,那自然是沒有問題的。現(xiàn)在網(wǎng)上就有用C#寫的圖像處理軟件,對(duì)標(biāo)photoshop。
但是一個(gè)優(yōu)秀軟件、專業(yè)軟件,它們的競(jìng)爭(zhēng)力恰好是那普通人很少用的功能。就像一輛汽車一樣,基本功能很多廠家都能做(有的國(guó)產(chǎn)車可以賣到5萬以下),絕對(duì)能滿足多數(shù)人80%甚至99%的代步功能。而貴車就強(qiáng)在一些不常用或不必須的功能,安全問題就是其中之一。我們可能一輩子都經(jīng)歷不了一次車禍,但是遇到了,貴車就更能保命。
我們先以adobe的photoshop為例?;镜膱D像處理,對(duì)于C#和Java來說那都不是事,無非就是加載圖片、縮放、顏色、像素、保存等等這些東西。但是,很多人可能沒有意識(shí)到,C#和Java是運(yùn)行在虛擬機(jī)上的,它們的核心代碼用的就是C/C++。當(dāng)我們寫一個(gè)Jpg加載程序時(shí),你以為你寫的是純粹的C#和Java,而實(shí)際上后端的關(guān)鍵實(shí)現(xiàn)是用的C語言。
為了證實(shí)這一點(diǎn),我特地去網(wǎng)上下載了一份JDK的源碼,清清楚楚地看到了在某一個(gè)native目錄下,放著用C語言寫的JPG處理程序。
除了Jpg,還有zip壓縮、音頻、視頻處理也是用的C語言。
網(wǎng)上幾乎很難找到有用純C#和Java寫的JPG處理程序。光是JPG的圖片格式,都可以寫一本書。不是那么容易的。就算寫出來了,其性能也遠(yuǎn)遠(yuǎn)不如C/C++。
你可能會(huì)說兩點(diǎn):一、虛擬機(jī)自帶的JPG足夠用了,那本身就是標(biāo)準(zhǔn)庫,是語言的一部分。第二、用純C#和Java去實(shí)現(xiàn)JPG等算法,似乎性能不會(huì)低,無所謂。
第一、JVM和.Net framework自帶的JPG能滿足大部分需求,但是一旦涉及優(yōu)化和修改,就傻眼了。而PS專業(yè)處理圖像,必定需要反復(fù)優(yōu)化。舉個(gè)不一定對(duì)的例子,或許虛擬機(jī)只能處理某種最最主流的Jpg標(biāo)準(zhǔn),遇到非主流就無能為力了。
第二、在底層算法方面,C#和Java是無法與C/C++比速度的。這得益于后者對(duì)內(nèi)存的精確掌控。這個(gè)具體原因討論起來可以單獨(dú)開一個(gè)帖子了,就不再展開。只說結(jié)論,現(xiàn)在主流的各類語言,在涉及復(fù)雜算法,特別是運(yùn)算密集型時(shí)都用的C和C++(也有用fortran、go、rust的)。JPG、壓縮、加密、MP3、MP4、機(jī)器學(xué)習(xí),等等。說到機(jī)器學(xué)習(xí),有人說腳本語言python不是大行其道嗎?其實(shí)python的大部分優(yōu)秀算法底層都是C/C++,比如大名鼎鼎的tensorflow。
至于說現(xiàn)在硬件性能很高了,性能低一點(diǎn)無所謂,這就又回到之前的問題了,就是什么叫專業(yè)軟件。一輛5萬的汽車和50萬的汽車,性能差別也是幾乎可以忽略不計(jì)。起步塊?動(dòng)力足?跑高速能飆到180?這就是二八原理了,人們往往反而喜歡這些不太重要的細(xì)節(jié)。我哪怕起步比你快0.1秒,我也自豪!你先別管我敢不敢跑不跑180碼……專業(yè)軟件也是如此,就是快,你別管我快幾秒能干啥。要的就是體驗(yàn)……
上面說的還主要是JPG舉例。如果遇到音頻、視頻這類專業(yè)adobe軟件,C#和Java將更顯得無力。尤其是視頻。JPEG,比MPEG-4,完全不在一個(gè)難度系數(shù)等級(jí),對(duì)性能要求也高很多很多。不信?你看看網(wǎng)上能不能找到相關(guān)的MP4源代碼,C語言除外。
其實(shí)C#和Java也是可以寫出類似adobe的專業(yè)軟件,只不過不是純粹的,是要和C/C++結(jié)合使用。前者負(fù)責(zé)寫上層框架,特別是圖形界面,后者負(fù)責(zé)其中一部分復(fù)雜的算法實(shí)現(xiàn)。