Java為什么會成為現在的主流語言
- 前言
- 一、Java語言概述
- Java是什么
- 為什么大多數人會選擇從事Java
- 為什么從事Java的工作者數量從年遞減
- 二、Java語言的特點
- 簡單性
- 面向對象
- 分布式(微服務)
- 健壯性
- 安全性
- 體系結構中立
- 可移植性
- 解釋型
- 高性能
- 多線程
- 動態性
- 三、Java語言發展簡史
- 四、Java是最好的語言么
- Java 語言到底有什么優勢可以占據排行榜第一的位置呢
- Java社區的概況
- 五、JavaScript和Java有什么關系呢?
前言
Java成為主流語言的原因在于其跨平臺性、面向對象特性、豐富的庫和框架支持,以及強大的社區和廣泛的應用場景。這些優勢使得Java在開發大型系統、企業級應用以及移動和Web開發等領域具有顯著優勢。
一、Java語言概述
Java是什么
Java是一種優秀的程序設計語言,它具有令人賞心悅目的語法和易于理解的語義。不僅如此Java還是一個有一系列計算機軟件和規范形成的技術體系,這個技術體系提供了完整的用于軟件開發和跨平臺部署的支持環境,并廣泛應用于嵌入式系統、移動終端、企業服務器、大型機等各種場合。
Java是一種跨平臺的面向對象編程語言,由Sun Microsystems(現在是Oracle)在1995年推出。Java被設計用來支持應用程序的開發,特別是因特網上的應用程序。它具有簡單性、可移植性和安全性的特點,因此成為了開發企業級應用程序的一種主流語言。
下面我們通過Java官方提供的數據來一起感受一下,Java到底有多“火”。
為什么大多數人會選擇從事Java
過上面的數據,各位讀者應該對Java目前到底有多流行有一個直觀的認識了吧。這里有的讀者可能會問了,上面的數據主要是Java在應用市場的流行,那么對于我們開發者,Java是否是我們開發應用程序的第一選擇呢?
來看下圖
為什么從事Java的工作者數量從年遞減
-
工作市場上的Java工作者太多了
-
隨著技術和市場的發展,對不同類型的開發人員需求也會變化。某些領域可能對Java的需求減少,導致從事Java的工作者數量遞減。例如,移動應用開發中,Android平臺使用的是Java語言,但隨著React Native等跨平臺開發框架的出現,其他語言的使用也有增加的趨勢。
-
技術行業的就業市場是動態變化的,有時某個技術可能會在一段時間內更受歡迎,而在另一段時間內相對較少。這可能會導致從事Java的工作者數量的波動。
-
每個人都有自己的興趣和發展方向,有些從事Java的工作者可能會選擇轉向其他領域或技術,以追求個人的職業發展和興趣。這也可能是導致從事Java的工作者數量遞減的原因之一。
需要注意的是,這僅僅是一種趨勢,而實際情況可能因地區、行業和個人的不同而有所差異。Java作為一種廣泛應用的編程語言,仍然有很多企業和項目需要Java開發人員的技能。但總的來說Java還是主流
二、Java語言的特點
簡單性
Java語法是C++語法的一個“純凈版本”。這里沒有頭文件、指針運算(甚至指針語法)、結構、聯合、操作符重載、虛基類等等。
ps:關于C++可以關注我的C++專欄,里面包含了我是如何學習C++的
不僅如此,Java開發環境遠遠超出大多數其他編程語言的開發環境。
面向對象
什么是面向對象?
這里我們用木匠打一個比方,一個“面向對象”的木匠始終關注的是所制作的椅子,第二位才是所使用的工具;而一個“非面向對象的”木匠首先考慮的是所使用的工具。
在Java的世界里,一切皆對象。
Java的面向對象特性與C++旗鼓相當,與C++的主要不同點在于多重繼承。在Java中,取而代之的是更簡單的接口概念。而且與C++相比,Java提供了更豐富的運行時自省功能。
分布式(微服務)
Java有豐富的例程庫,用于處理像HTTP和FTP之類的TCP/IP協議。Java應用程序能夠通過URL打開和訪問網絡上的對象,其便捷程度就好像訪問本地文件一樣。
健壯性
Java與C++最大的不同在于Java采用的指針模型可以消除重寫內存和損壞數據的可能性
ps:對于曾經花費幾個小時來檢查由于指針bug而引起內存沖突的人來說,一定很喜歡Java的這一特性。
不僅如此,Java編譯器能夠檢測許多在其他語言中僅在運行時才能夠檢測出來的問題。
安全性
Java適用于網絡/分布式環境。為了達到這個目標,在安全性方面投入了大量的精力。使用Java可以構建防病毒、防篡改的系統
從一開始,Java就設計成能夠防范常見的各種攻擊:
- 運行時堆棧溢出。蠕蟲和病毒常用的攻擊手段。
- 破壞自己進程空間之外的內存。
- 未經授權讀寫文件
體系結構中立
編譯器生成一個體系結構中立的目標文件格式,這是一種編譯過的代碼,只要有Java運行時系統,這些編譯后的代碼就可以在許多處理器上運行。
Java編譯器通過生成與特定計算機體系結構無關的字節碼指令來實現這一特性。精心設計的字節碼不僅可以很容易的在任何機器上解釋執行,而且還可以動態地翻譯成本地機器代碼。
可移植性
與C/C++不同,Java規范中沒有“依賴具體實現的地方”。基本數據類型的大小以及有關運算都做了明確的說明。
例如,Java中的int永遠是32位的整數,而在C/C++中,int可能是16位整數、32位整數,也可能是編譯器提供商指定的其他大小。在Java中,數據類型具有固定的大小,這消除了代碼移植時令人頭疼的主要問題。
解釋型
Java解釋器可以在任何移植了解釋器的機器上執行Java字節碼。由于鏈接是一個增量式且輕量級的過程。所以開發過程也變得更加快捷,更加具有探索性。
高性能
盡管對解釋后的字節碼性能已經比較滿意,但在有些場合下可能需要更加高效的性能。字節碼可以(在運行時刻)動態的翻譯成對應運行這個應用的特定cpu的機器碼。
多線程
Java在當時很超前。它是第一個支持并發程序設計的主流語言。多線程可以帶來更好的交互響應和實時行為。并發程序設計絕非易事,但是Java在這方面表現出色,可以很好的管理這個工作。
動態性
Java與C/C++相比更加具有動態性。它能夠適應不斷發展的環境。庫中可以自由的添加新方法和實例變量,而對客戶端沒有任何影響。在Java中找出運行時類型信息十分簡單
三、Java語言發展簡史
Java 語言源于 1991 年 Sun 公司 James Gosling 領導的的 Oak 項目,1995 年 Sun 公司正式起名為 Java,并提出“Write once, Run anywhere" 的口號。
1996 年 1 月 Java 1.0 發布,提供了一個解釋執行的 Java 虛擬機,其時恰逢互聯網開始興起,Java 的 Applet 能在Mozilla 瀏覽器中運行,被看作是未來的互聯網語言。
1997 年 2 月 Java 1.1 發布,Java 語言的基本形態基本確定了,比如反射 (re?ection), JavaBean, 接口和類的關系等等,一直到今天都保持一致。然而,Java 最初的一些目標,如在瀏覽器中執行 Applet,以及跨平臺的圖形界面Awt 很快遭遇到負面的評價。
1998 年 12 月,Java 第一個里程碑式的版本,即 Java 1.2 發布了。這個版本使用了 JIT(Just in time)編譯器技術,使得語言的可遷移性和執行效率達到最優的平衡,同時 Collections 集合類設計優良,在企業應用開發中迅速得到了廣泛使用。Sun 公司把 Java 技術體系分成三個方向,分別是 J2SE(面向桌面和通用應用開發),J2EE(面向企業級應用開發),J2ME(面向移動終端開發)。這個分類影響非常久遠,體現出主流語言設計者的思想:針對于不同的應用領域,在形態,API 集合等進行劃分。
2000 年 5 月,Java 1.3 發布,這個版本中 Corba 作為語言級別的分布式對象技術,成為 J2EE 的一個技術前提。
J2EE 受到 Corba 的設計的影響較大,早期 EJB 的 Home,接口和實現就是 Corba 在 C 語言的實現,被移植到Java 語言之中。J2EE 中的 Servlet 規范獲得了極大的成功,伴隨著互聯網的興起,和瀏覽器直接通過 HTTP 協議交互的 Servlet,和眾多的 MVC 框架,成為 Web1.0 的網紅。
2002 年 2 月,Java 1.4 發布,Java 語言真正走向成熟,提供了非常完備的語言特性,如 NIO,正則表達式,XML處理器等。同年微軟的.NET 框架發布,兩者開始了為期十幾年的暗自競爭。從語言特性上來說,.NET 后發先至,一直處于優勢。但 Java 依賴良好的開發者生態,絕大多數大型軟件公司的使用者眾多和不斷貢獻,以及對 Linux操作系統良好的支持,漸漸的在服務器端獲得優勢地位。
2004 年 9 月,Java 5 發布,Sun 不再采用 J2SE, J2EE 這種命名方式,而使用 Java SE 5, Java EE 5 這樣的名稱。我認為 Java 5 是第二個里程碑式的版本。Java 語言語法發生很大的變化,如注解 (Annotation),裝箱 (Autoboxing),泛型 (Generic),枚舉 (Enum),foreach 等被加入,提供了 java.util.concurrent
并發包。Java 5 對于 Java 語言的推動是巨大的,特別是注解的加入,使得語言定義靈活了很多,程序員可以寫出更加符合領域定義的描述性程序。
2006 年 5 月, JavaEE 5 發布,其中最主要是 EJB3.0 的版本升級。在此之前,EJB2.X 版本被廣泛質疑,SpringFramework 創建者 Rod Johnson 在經典書籍“J2EE Development without EJB“中,對 EJB2 代表的分布式對象的設計方法予以批駁。EJB3 則重新經過改造,使用注解方式,經過應用服務器對 POJO 對象進行增強來實現分布式服務能力。在某種程度,可以說 EJB3 挽救了 JavaEE 的過早消亡。
2006 年 12 月,Java 6 發布,這個語言語法改進不多,但在虛擬機內部做了大量的改進,成為一個相當成熟穩定的版本,時至今日國內的很多公司依然以Java6 作為主要 Java 開發版本來使用。同年 Sun 公司做出一個偉大的決定,將 Java 開源。OpenJDK 從 Sun JDK1.7 版本分支出去,成為今天 OpenJDK 的基礎。OpenJDK6 則由 OpenJDK7 裁剪而來,目前由紅帽負責維護,來滿足 Redhat Enterprise Linux 6.X 用戶的需要。
2009 年 12 月,JavaEE 6 發布,這個版本應該說是 JavaEE 到目前為止改進最大影響最深遠的一個版本。因為JavaEE5 只有 EJB3 適應了 Java 注解語法的加入,而 EE6 全面接納了注解。CDI 和 BeanValidation 規范的加入,在 POJO 之上可以定義完備的語義,由容器來決定如何去做。Servlet 也升級到 3.0 版本,并在接口上加入異步支持,使得系統整體效率可以大幅提高。EE 劃分為 Full Pro?le 和 Web Pro?le,用戶可以根據自己的需要選擇不同的功能集。
在此之前,Oracle 已經以 74 億美金的價格收購了 Sun 公司,獲得了 Java 商標和 Java 主導權。也收購了 BEA 公司,獲得市場份額最大的應用服務器 Webogic。JavaEE 6 雖然是收購之后發布的版本,但主要的設計工作仍然由原 Sun 公司的 Java 專家完成。
2011 年 7 月,Oracle 發布 Java 7, 其中主要的特性是 NIO2 和 Fork/Join 并發包,盡管語言上沒有大的增強,但我個人認為,自從 Oracle JDK(包括 OpenJDK7),Java 虛擬機的穩定性真正做到的工業級,成為一個計算平臺而服務于全世界。
2013 年 6 月,Oracle 發布 JavaEE 7,這個版本加入了 Websocket,Batch 的支持,并且引入 Concurrency 來對服務器多線程進行管控。然而所有的子規范,算上可選項 (Optional) 總共有 40 多項,開發者光是閱讀規范文本就很吃力了,更不要說能夠全局精通掌握。JavaEE 規范的本質是企業級應用設計的經驗凝結,每一個 API 都經過眾多豐富經驗的專家反復商議并確定。各個版本之間可以做到向后兼容,也就是說,即使是 10 年前寫的 Servlet 程序,當前的開發者也可以流暢的閱讀源碼,經過部分代碼調整和配置修改,可以部署在當今的應用服務器上。反過來,今后用 Servlet4 寫的程序,瀏覽器和服務器通信使用全新的 HTTP/2 協議,但程序員在理解上不會有障礙,就是因為 Servlet 規范的 API 非常穩定,基本沒有大的變化修改。
2014 年 3 月,Oracle 發布 Java 8,這個版本是我認為的第三個有里程碑意義的 Java 版本。其中最引人注目的便是 Lambda 表達式了,從此 Java 語言原生提供了函數式編程能力。語言方面大的特性增加還有:Streams,Date/Time API,集合的并行計算支持等,Java8 更加適應海量云計算的需要。
美國當地時間2018 年9月25日,Oracle 官方宣布Java 11 (18.9 LTS) 正式發布,可在生產環境中使用!這是自 Java8 后的首個長期支持版本
四、Java是最好的語言么
不是,因為在每個領域都有更合適的編程語言。
C 語言無疑是現代計算機軟件編程語言的王者,幾乎所有的操作系統都是 C 語言寫成的。
C++ 是面向對象的 C 語言,一直在不斷的改進。
JavaScript 是能運行在瀏覽器中的語言,豐富的前端界面離不開 Javascript 的功勞。近年來的 Node.js 又在后端占有一席之地。
Python 用于系統管理,并通過高性能預編譯的庫,提供 API 來進行科學計算,文本處理等,是 Linux 必選的解釋性語言。
Ruby 強于 DSL(領域特定語言),程序員可以定義豐富的語義來充分表達自己的思想。Erlang 就是為分布式計算設計的,能保證在大規模并發訪問的情況下,保持強壯和穩定性。
Go 語言內置了并發能力,可以編譯成本地代碼。當前新的網絡相關項目,很大比例是由 Go 語言編寫的,如Docker、Kubernetes 等。
編寫網頁用 PHP,函數式編程有 Lisp/Scala,編寫 iOS 程序有 Swift/Objective-C。
一句話概括,能留在排行榜之上的語言,都是好的語言,在其所在的領域能做到最好。
Java 語言到底有什么優勢可以占據排行榜第一的位置呢
其一,語法比較簡單,學過計算機編程的開發者都能快速上手。
其二,在若干了領域都有很強的競爭力,比如服務端編程,高性能網絡程序,企業軟件事務處理,分布式計算,Android 移動終端應用開發等等。
最重要的一點是符合工程學的需求,我們知道現代軟件都是協同開發,那么代碼可維護性,編譯時檢查,較為高效的運行效率,跨平臺能力,豐富的 IDE,測試,項目管理工具配合。都使得 Java 成為企業軟件公司的首選,也得到很多互聯網公司的青睞。
沒有短板,容易從市場上找到 Java 軟件工程師,軟件公司選擇 Java 作為主要開發語言,再在特定的領域使用其他語言協作編程,這樣的組合選擇,肯定是不會有大的問題。 所以綜合而言,Java 語言全能方面是最好的。
Java社區的概況
Java 是一門開放的語言,其開源社區也是參與者眾多。最有名的應當數 Apache 社區,目前已經擁有近 200 個頂級項目,其中絕大多數是 Java 語言項目。在 Java 生態圈中,具有重要地位的如 Spring、Ant、Commons、Tomcat、Xerces、Maven、 Struts、Lucene、ActiveMQ、CXF、Camel、Hadoop 等等。
很多技術時代,一大批 Java 項目加入,如 Web 時代的 Velocity、Wicket;JavaEE 相關的 Tomee、OpenJPA、OpenWebBeans、Myfaces;WebService 時代的 jUDDI、Axis、ServiceMix;Osgi 時期的 Flex、Karaf;大數據時代的 HBase、Hive、ZooKeeper、Cassandra;云時代的 Mesos、CloudStack 等等。
涉及到軟件開發的方方面面,可以說當今幾乎所有的中型以上 Java 應用中,都會有 Apache 開源項目的身影。國內最早參與 Apache 社區的以國外軟件公司國內研發團隊成員為主,如紅帽、IONA、Intel、IBM 研發中心等。如今國內互聯網公司和軟件公司也不斷的參與,特別是開始主導一些 Apache 項目,如 Kylin 等。
JBoss 開源社區,包含了 50 多個 Java 開源項目,其中有 Hibernate、Drools、jBPM 等業界知名開源項目,也有Undertow、Byteman、Narayana 等名氣不算大,但絕對是相應領域業界的頂級優秀項目。
當前 JBoss 開源社區主要以企業應用中間件軟件為主,RedHat 是主要的技術貢獻力量。
Eclipse 開源社區,之前主要是包含 Eclipse IDE 的項目,后來也逐步進行多方面的擴展,比如 OSGi,服務器等,目前一些知名 Java 項目,如 Jetty、Vertx 等都是 Eclipse 開源組織成員。此外 IOT 目前是 Eclispe 的一個重點方向,在這里可以找到完整的 IOT Java 開發方案。
Spring 開源社區,以 SpringFramework 為核心,包括 SpringBoot、SpringCloud、SpringSecurity、SpringXD 等開源項目,在國內有廣泛的應用場景。
所以說,Java不僅僅是一門編程語言,它是一個綜合的技術體系,是面向對象思想的規范。
五、JavaScript和Java有什么關系呢?
JavaScript和Java之間存在了一些混淆和誤解。盡管兩者名字相似,但實際上它們是兩種不同的編程語言。要說到這倆的關系,舉個例子。就相當于雷鋒和雷峰塔的關系或者說老婆和老婆餅的關系(沒有一點關系…),最開始JavaScript叫liveScript,當時Java太火了,于是乎liveScript更名為JavaScript借勢宣傳一波。。
其中,Java是一種面向對象的、靜態類型的編程語言,由Sun Microsystems(現在屬于Oracle)開發。Java通常被用于構建大型的、高性能的企業級應用和桌面應用程序。Java代碼需要通過編譯器將其轉換成可執行的二進制文件(即字節碼),然后才能在Java虛擬機(JVM)上運行。
而JavaScript是一種腳本語言,由Netscape公司開發。它主要用于網頁開發,并且可以直接嵌入到HTML中。JavaScript是一種解釋性語言,不需要編譯成二進制文件,而是在瀏覽器中直接解析和執行。它主要用于實現網頁的交互和動態效果,例如表單驗證、DOM操作等。
盡管兩者有一些語法上的相似之處(如基本的語法結構和一些關鍵字),但它們的設計目標和應用場景是不同的。