1. 程式人生 > >「MoreThanJava」Java發展史及起航新世界

「MoreThanJava」Java發展史及起航新世界

![](https://imgkr.cn-bj.ufileos.com/429e85f3-9756-46ae-8744-52020194a598.png) - **「MoreThanJava」** 宣揚的是 **「學習,不止 CODE」**,本系列 Java 基礎教程是自己在結合各方面的知識之後,對 Java 基礎的一個總回顧,旨在 **「幫助新朋友快速高質量的學習」**。 - 當然 **不論新老朋友** 我相信您都可以 **從中獲益**。如果覺得 **「不錯」** 的朋友,歡迎 **「關注 + 留言 + 分享」**,文末有完整的獲取連結,您的支援是我前進的最大的動力! # Part 1. Java 發展簡史 ![](https://imgkr.cn-bj.ufileos.com/c81347b5-42e2-47ac-82c6-758eb07cc486.png) - 圖片來源:https://www.geeksforgeeks.org/the-complete-history-of-java-programming-language/ ## 起源:"Green" 專案 20 世紀 90 年代,單片式計算機系統誕生,單片式計算機系統不僅廉價,而且功能強大,使用它可以大幅度提升消費性電子產品的智慧化程度。 SUN 公司為了搶佔市場先機,在 `1991` 年成立了一個由詹姆斯·高斯林(James Gosling)領導,名為 **“Green”** 專案小組,目的是開發一種 **能夠在各種消費性電子產品上執行的程式架構**(主要是像 *有線電視轉換盒* 這一類 *處理能力和記憶體都很有限,並且 CPU 廠商又各不相同* 的消費裝置)。 由於這些消費裝置的處理能力和記憶體都有限,所以語言必須 **非常小且能夠生成非常緊湊的程式碼**。另外,由於不同廠商會選擇不同的 CPU,因此很重要的一點是這種語言 **不應該與任何特定的體系結構繫結**。程式碼短小、緊湊且與平臺無關,這些要求促使開發團隊設計出一個 **可移植的語言**,可以為虛擬機器生成中間程式碼。 不過,Sun 公司的人都有 UNIX 的應用背景。因此,所開發的語言以 C++ 為基礎,而不是 Lisp/ Smalltalk 或 Pascal。不過,就像 Gosling 在專訪中談道:**“畢竟,語言只是實現目標的工具,而不是目標本身。”** Gosling 把這種語言稱為 **"Oak"**(直譯為橡樹,大概是因為它非常喜歡自己辦公室窗外的一顆橡樹...)。後來 Sun 公司發現,Oak 是一種已有的計算機語言名字,於是 Gosling 和他的團隊進行了一次頭腦風暴,多次討論後,從 Java/ DNA/ SILK/ RUBY 中決定使用 **Java** 來命名。事實證明這是一個很有靈感的選擇。 ## 埋沒:沒人為 "Green" 專案買單 `1992` 年,Green 專案釋出了它的第一個產品,稱之為 **「\* 7」**。這個產品可以提供非常智慧的遠端控制。遺憾的是,Sun 公司對生產這個產品並不感興趣。Green 專案組的人員必須找出其他的方法來講他們的技術推向市場。 然而,仍然沒有任何一家標準消費品電子公司對此感興趣。於是,Green 專案組投標了一個設計有線電視盒的專案,它能提供視訊點播等新型有線服務,但他們沒能拿到這個合同 *(有趣的是,得到這個專案的公司的領導恰恰是開闢 Netscape 公司的 Jim Clark。Netscape 公司後來對 Java 的成功給予了很大的幫助。)* Green 專案 *(這時已經換了一個新名字 ———— "First Person 公司")* 在 `1993` 年一整年以及 `1994` 年上半年,一直在苦苦尋找買家購買他們的技術。然而,一個也沒有找到 *(Partick Naughton ———— 專案組的創始人之一,也是完成了大多數營銷工作的人,聲稱為了銷售這項技術,已累計飛行了 `300,000` 英里)*。 `1994` 年 First Person 公司解散了。 ## 轉機:Internet 的壯大 當這一切在 Sun 公司發生的時候,Internet 的全球資訊網也在日漸發展壯大。**全球資訊網的關鍵是把超文字頁面轉換到螢幕上的瀏覽器。** `1994` 年大多數人都在使用 Mosaic,這是一個 `1993` 年出自伊利諾斯大學超級計算中心的非商業化的 Web 瀏覽器( Mosaic 的一部分是由 Marc Andreessen 編寫的。當時,他作為一名參加半工半讀專案的本科生, 編寫了這個軟體,每小時的薪水只有 `6.85` 美元。他後來成了 Netscape 公司的創始人之一和技術總監, 可謂名利雙收。) 在接受 SunWorld 採訪的時候,Gosling 說在 `1994` 年中期,Java 語言的開發者意識到: “我們能夠建立一個相當酷的瀏覽器。在客戶機/ 伺服器主流模型中,瀏覽器恰好需要我們已經完成的一些工作:體系結構中立、實時、可靠、安全 ———— 這些在工作站環境並不太重要,所以,我們決定開發瀏覽器” 實際的瀏覽器是由 Patrick Naughton 和 Jonathan Payne 開發的,並演變為 HotJava 瀏覽器。**為了炫耀 Java 語言超強的能力**,HotJava 瀏覽器採用 Java 編寫。設計者讓 HotJava 瀏覽器具有在網頁中執行內嵌程式碼的能力。 **這一 “技術證明” 在 `1995` 年 `5` 月 `23` 日的 SunWorld'95 上得到展示,同時引發了人們延續至今的對 Java 的狂熱追逐。** 至此,這一場持續長達 `20` 多年的「Java 熱」開始了。 > - 觀察近 `20` 年的資料,Java 的排名從未跌出過前三,而且有將近一半的年份搶佔了透明,不得不令人感嘆:**「流水的程式設計師,鐵打的 Java 啊!」** > > ![](https://imgkr.cn-bj.ufileos.com/da9b68e4-6c9b-408d-b14e-fa74b5fb8784.png) # Part 2. Java 與 Internet ![](https://imgkr.cn-bj.ufileos.com/15adb653-6318-404d-8836-1685c00215ed.png) - 圖片來源:https://www.morethanshipping.com/internet-things-iot-will-help-logistics/ 如果 Java 僅僅只是眾多的程式設計語言中的一種,你可能就會問:為什麼它如此重要呢?為什麼它促使計算機程式語言向前邁進了革命性的一步? 如果從傳統的程式設計的角度看,問題的答案似乎不太明顯。儘管 Java 對於解決傳統的單機程式設計問題非常有用,但同樣重要的事,**它解決了在全球資訊網(WWW)上的程式設計問題**。 ## Web 1.0 時代的程式設計問題 在剛創造 Java 的年代(`20` 世紀 `90` 年代),整個網際網路還處於 **Web 1.0** 的網路萌芽階段。 > 在 [之前的一篇文章](https://www.wmyskxz.com/2018/03/14/chu-xue-java-web-1-web-gai-shu/) 其實有對 Web 做了一些概念性的描述(概念、發展、體系結構)。 ### 問題一:網頁沒有互動 **Web 1.0 的網站是靜態的**。最初的網際網路只有一種很簡單的 **單向過程**:你 **對某一個伺服器發起一個請求**,然後它 **返回** 給你一個 **檔案**,你的機器(俗稱客戶端)上的 **瀏覽器軟體** 根據本地機器的格式來 **解讀並展示** 這個檔案的內容。這期間沒有任何的交互發生,因為最初的瀏覽器只是一個 "展示器",它甚至不能執行最簡單的計算任務。*(另一方面,它確是安全的,因為它在你的本地機器上不會執行任何程式,而這些程式可能包含 bug 和病毒)* ![](https://imgkr.cn-bj.ufileos.com/eaa53129-8574-476f-b55c-2727a1873995.png) 使用者 **只能訪問** 這些站點而不會對它們做出任何貢獻。這就像你捧起書架中的一本書一樣,它是一種 **「只讀」** 模式的存在,如果你想與創造這本書的出版社也好,作者也好建立連結,只能通過其他的一些方式。*(當時的網站也是主要是向消費者展示產品,從感興趣的消費者那裡收錢)* ![1996 年蘋果公司主頁](https://imgkr.cn-bj.ufileos.com/618310fe-9eef-46bc-b472-283f403177ba.png) 很快人們就不滿足於只是從伺服器傳遞迴頁面,人們希望實現完整的客戶/ 伺服器能力,使得客戶可以將資訊反饋給伺服器,來完成例如:在伺服器上進行資料查詢,並將使用者提供的新資訊加到伺服器中,伺服器管理人員接受到新資訊之後就下發訂單的操作。 ### 問題二:響應緩慢 早期的瀏覽器不僅沒有互動,而且它還趨向於讓伺服器和 Internet 阻塞。因為在任何時候,**只要** 你需要完成 **通過程式設計** 才能實現的 **任務**,就必須將資訊發揮到 **伺服器** 去 **處理**。然而在網際網路中,在任意時刻都有可能會有 **成百上千** 的客戶向伺服器發出請求,所以任何小的延遲都會產生重大的影響。 為了解決這個問題,人們採用了各種不同的方法。首先,圖形標準得到了加強,這使得在瀏覽器中可以播放質量更好的動畫和視訊。剩下的問題通過引入 **在客戶端瀏覽器中執行程式** 的能力就可以解決,這被稱為 **「客戶端程式設計」**。 ### 問題三:客戶端程式設計平臺各異 大多數執行 Web 瀏覽器的機器都是能夠執行大型任務的強有力的引擎。在使用原始的靜態 HTML 方式的情況下,它們通常只是閒在那裡,等著伺服器送來下一個頁面。 客戶端程式設計意味著 Web 瀏覽器能夠用來執行任何它可以完成的工作,使得返回給使用者的結果 **更迅速** *(不用全部的結果都等著伺服器來運算)*,而且使得你的網站 **更加具有互動性** *(那些不需要使用伺服器資料的操作可以完全在本地完成)*。 但客戶端程式設計的問題是:它與通常意義上的程式設計十分不同,**引數幾乎相同,而平臺卻不同**。在 Web 瀏覽器中程式設計就像是使用一臺功能受限的作業系統,而每一臺功能還略微的有差別。最終,你不僅需要編寫程式,還需要處理因為平臺不同帶來的相容問題。 ### 小結 因為「沒有互動」和「訪問緩慢」的問題,所以引入「客戶端程式設計」,因為引入客戶端程式設計,遇到「各種各樣不僅僅是平臺差異帶來的問題」。 ## Java 的解決方案 ### 外掛和指令碼語言 "差點意思" 在當時,客戶端程式設計所邁出的最重要的一步就是 **外掛(plug-in)** 的開發。通過這種方式,使用者可以下載一段程式碼,並將其插入到瀏覽器中適當的位置,以此來為瀏覽器新增新的功能。 ![](https://imgkr.cn-bj.ufileos.com/d0363cd4-5a84-40db-87d1-03990a55e4a6.png) - 圖片來源:https://zhuanlan.zhihu.com/p/28889449 外掛又引發了瀏覽器 **指令碼語言(scripting language)** 的開發。通過使用某種指令碼語言,你可以將客戶端程式的原始碼直接嵌入到 HTML 頁面中,解釋這種語言的外掛在 HTML 頁面被顯示時自動啟用。*(指令碼語言可以解決客戶端程式設計中遇到的百分之八十的問題)* 指令碼語言先天就相當易於理解,因為它們只是作為 HTML 頁面一部分的簡單文字,當伺服器收到要獲取該頁面的請求時,它們可以被快速載入。此方法的缺點是程式碼會直接暴露給任何瀏覽(或竊取)的人,但是,通常不會使用指令碼語言去做相當複雜的事情,所以這個缺點不會太嚴重。 如果指令碼語言可以解決客戶端程式設計百分之八十的問題的話,那麼剩下那百分之二十 *(那才是真正難啃的骨頭)* 又該怎麼辦呢? ### Java 帶來了 Applet ![](https://imgkr.cn-bj.ufileos.com/ce3eadd0-a00c-4342-ba89-474476ab81e1.png) - 圖片來源:https://www.ibm.com/developerworks/cn/java/ **Java 帶著 Applet 及時出現。** `1995` 年, Java 之父 James Gosling 和 Sun 公司科學辦公室主任 John Gage 一起前往蒙特利,去參加一個 TED 會議,兩人要在那裡展示一個劃時代的技術, 號稱向能把枯燥的靜態網頁變得栩栩如生,美輪美奐。 演示開始了,James Gosling 把滑鼠指向了瀏覽器中的一個 3D 分子模型,來回地旋轉它,臺下的觀眾發出陣陣驚歎聲,他們被鎮住了,從沒有人想到在瀏覽器中也能實現這麼 “美輪美奐” 的效果 ! ![注:這是後來用 Applet Viewer 看到的效果](https://imgkr.cn-bj.ufileos.com/5284c943-5095-4437-a6ee-7352b37a693f.png) - 圖片來源:https://zhuanlan.51cto.com/art/201911/606791.htm **Java 火了!** 這個演示所使用的技術就是 Applet。 Applet 是隻在 Web 瀏覽器中執行的小程式,它是作為網頁的一部分而自動下載的 *(就像是網站圖片被自動下載一樣)*。當 Applet 被啟用時,它變開始執行一個程式,這正是它優雅的地方:**它提供了一種分發軟體的方式**,一旦使用者需要客戶端軟體時,就自動從伺服器把客戶端軟體分發給使用者。 使用者獲取最新版本的客戶端軟體時不會產生錯誤,而且也不需要很麻煩的重新安裝過程 *(有點像現在的小程式)*。Java 的這種設計方式,使得程式設計師只需要建立單一的程式,而只要一臺計算機有瀏覽器,且瀏覽器具有內建的 Java 直譯器 *(大部分機器都有)*,那麼這個程式就可以自動在這臺計算客戶端儘可能地多做事情。例如,不必跨網路地傳送一張請求表單來檢查自己是否填寫了錯誤的日期或者其他引數,客戶端計算機就可以快速地標出錯誤資料。 這不僅立即就獲得了快速的響應能力,而且也降低了網路流量和伺服器負載,從而不會使整個網路的速度慢下來。 ### Java 對服務端程式設計的加持 當提出對伺服器的請求之後,會發生什麼呢?大部分時間,請求只是要求「給我傳送一個檔案」,之後瀏覽器會以某種適當的形式解釋這個檔案,例如將其作為 HTML 頁面、圖片、Java applet 或指令碼程式等來解釋。 更復雜的對伺服器的請求通常涉及資料庫,這可能會需要伺服器端對請求到的資料進行一定的編排 *(例如把資料嵌到一個表格之內)* 來最終使其成為一個 HTML 檔案傳送給客戶端 *(當然,如果客戶端具備更多的只能,你完全可以把原始資料傳送給客戶端讓它自己進行編排工作..)*。另一種常見的情形是:你註冊賬號或者提交訂單,這對資料庫資料造成了更改,而這些必須通過伺服器端的某些程式碼進行處理,這就是所謂的 **服務端程式設計**。 Java 後來編寫的被稱為 **Servlet** 的程式 *(及其衍生物 JSP)*,是許多開發網站的公司遷移到 Java 上的主要原因。尤其是因為憑藉 Java 跨平臺的特性 **消除了處理具有不同能力的瀏覽器時所遇到的問題**。 ### 小結 Java 憑藉自身強大、安全、跨平臺、國際化的特性,加上解決了當時客戶端、服務端開發的諸多 "痛點",成功搭上 Internet 這列 "國際快車",一躍成為了時下 *(`20` 實際 `90` 年代中)* 最熱門的語言之一,並持續火熱至今 *(這跟 Java 自身不斷地成熟有脫不開的關係)*。 > 現如今 Applet 和 Servlet 兩個技術已經逐步淡出人們的視野,但在 Java 的歷史上,是舉足輕重的兩個突破點。 # Part 3. Hello Wrold! ![](https://imgkr.cn-bj.ufileos.com/041ab336-7f0e-477f-bb02-d3867ed26343.png) - 圖片來源:https://medium.com/@thiagonascimento/time-to-first-hello-world-11a4735602f2 當我們集中注意力 **學習一種新的程式語言** 時,教程上的 **第一個案例** 就是如何 **在計算機螢幕上顯示短語 `Hello,world!`** 也許這條短語最知名的來源是貝爾實驗室的備忘錄《C 語言程式設計——一份教程》。這份材料編寫於 `1974` 年。不過在編寫於 `1972` 年的 B 語言教程中,我們同樣看到了這條短語的身影。 `Hello, World!` 是一種偉大的教學方法。這是一項能夠輕鬆完成的小任務,同時也代表著一種標準,體現出不同程式語言之間的重要差異。此外,這也是高階程式設計師在安裝新環境測試一切是否正常的快速簡便方法。*(有時候,程式設計師們也會使用「hello world」執行時間來比較不同語言與環境的速度水平。)* 也許更重要的是,`Hello, world!` 具有一種溫暖而柔和的力量,對程式設計新人有著一種莫名的親和力。 *「程式碼擁有無窮威力,而新的世界已經向你張開懷抱。」 ———— Chris Noessel,IBM 公司 AI 設計負責人* ```java public class Main { public static void main(String[] args) { System.out.println("Hello World!"); } } ``` 以上就是Java 語言版本 `Hello World` 程式。*(現在看不懂也沒關係,可以進 https://c.runoob.com/compile/10 這個網站線上執行測試一下看看效果...)* **至此,歡迎你進入 Java 的世界。** # 參考資料 1. 《Thinking in Java》 第四版; 1. 《Java 核心技術 卷 I》 第 11 版; 1. The complete History of Java Programming Language - https://www.geeksforgeeks.org/the-complete-history-of-java-programming-language/ 1. Java 發展簡史:初生遇低谷,崛起於網際網路 - https://www.chainnews.com/articles/628715645859.htm 1. 永別了,Java的“小蘋果”! - https://zhuanlan.51cto.com/art/201911/606791.htm 1. 改變世界的程式碼行 - https://www.infoq.cn/article/5CaYH8NbS6BmptWKRgkX # 往期精彩 1. [「MoreThanJava」當大學選擇了計算機之後應該知道的](https://www.wmyskxz.com/2020/04/02/morethanjava-dang-da-xue-xuan-ze-liao-ji-suan-ji-zhi-hou-ying-gai-zhi-dao-de/) 1. [「MoreThanJava」計算機發展史—從織布機到IBM](https://www.wmyskxz.com/2020/04/07/morethanjava-ji-suan-ji-fa-zhan-shi-cong-zhi-bu-ji-dao-ibm/) 1. [「MoreThanJava」計算機系統概述](https://www.wmyskxz.com/2020/06/01/morethanjava-ji-suan-ji-xi-tong-gai-shu/) 1. [「MoreThanJava」一文了解二進位制和CPU工作原理](https://www.wmyskxz.com/2020/06/02/morethanjava-yi-wen-liao-jie-er-jin-zhi-he-cpu-gong-zuo-yuan-li/) 1. [「MoreThanJava」機器指令到彙編再到高階程式語言](https://www.wmyskxz.com/2020/06/04/morethanjava-ji-qi-zhi-ling-dao-hui-bian-zai-dao-gao-ji-bian-cheng-yu-yan/) > - 本文已收錄至我的 Github 程式設計師成長系列 **【More Than Java】,學習,不止 Code,歡迎 star:[https://github.com/wmyskxz/MoreThanJava](https://github.com/wmyskxz/MoreThanJava)** > - **個人公眾號** :wmyskxz,**個人獨立域名部落格**:wmyskxz.com,堅持原創輸出,下方掃碼關注,2020,與您共同成長! ![](https://imgkr.cn-bj.ufileos.com/ace97ed9-3cfd-425f-85e5-c1a1e5ca7d3f.png) 非常感謝各位人才能 **看到這裡**,如果覺得本篇文章寫得不錯,覺得 **「我沒有三顆心臟」有點東西** 的話,**求點贊,求關注,求分享,求留言!** 創作不易,各位的支援和認可,就是我創作的最大動力,我們下篇文