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