導航:首頁 > 編程語言 > javacgo特性對比

javacgo特性對比

發布時間:2025-06-17 15:24:15

1. 現在java語言和.NET那個更流行

兩種語言沒有可比性,因為他們針對的平台不同,以後發展的方向也很不一樣。
舉例說明,
JAVA針對的是手機平台,智能設備,web
.
.NET針對的是windows應用程序開發,web開發,系統開發,游戲開發。
仔細一想,就不用比較了,其實都是很流行的,但是又不會有什麼沖突。對比.net、java、php的優勢:
1、不用依賴任何第三方框架,只利用其自帶庫(net、http、template)就能做出一個很完善的web應用程序。
2、部署便捷:開發完畢後直接生成二進置文件執行即可,不用考慮安裝IIS、Tomcat等中間件調優就可以實現可觀的並發。
3、語法簡潔優雅:Java之語法羅嗦有目共睹,.net語法基本照抄Java也好不到哪裡,php的語法寫不好沒法做後期維護,Go語言的語法與動態語言相似,但又很規范沒有太多語法糖讓人迷惑。
4、很新的語言:因為新,所以汲取了很多前語言的優勢並屏蔽了一些劣勢,比如database/sql這個go的庫,把關系資料庫的連接語法統一了,所以關系資料庫的庫語法都差不多,你在上面寫應用也很容易遷移資料庫。
5、資源佔用:與Java、.net
web應用、虛擬機、中間件啟動起來動輒上G的內存和百分之七八十的CPU佔用相比,GO語言的內存佔用只有幾十M,大數據訪問CPU也佔用極少(有一家外國公司500多萬訪問量,使用Go語言後把30多台rails伺服器減少為2台,其中1台為備機)。
Go語言的劣勢三方庫較少,官方驅動也較少,比如oracle因為是用java語言所寫,所以jdbc與oracle兼容性很好,與.net兼容也不錯,但go語言就得通過CGO與OCI進行連接,拋出的異常讓人一頭霧水。
Go的三方庫少我覺得在團隊里並不全是劣勢,java的web框架和orm巨多,招人反而不是懂語言而是要懂框架,這些框架封裝過頭,用了並不能了解真正的語言運作方式,框架經常升級後變得面目全非,學習曲線反而增加,當你用Go時就會發現:呀!原來Web
Server是這樣運行,Template是這樣渲染,前後台是如此交互。

2. 深入理解Java中為什麼內部類可以訪問外部類的成員

\\外部類對象可以直接訪問內部類對象的成員變數和方法
你使用的這個方法的旨意是用非靜態的外部類實例化一個內部類對象,外部類能夠訪問成員內部類的成員變數和方法的唯一途徑就是通過實例化一個外部類的對象,然後這個對象通過 對象.makeInner()來new一個Inner in,此過程調用了Inner()這個內部類的構造函數。
其實你只是把順序搞錯了,編譯時不回去運行你的函數方法,也就是代碼中:
public void makeInner(){
Inner in = new Inner();
in.seeOuter();
}
這個越權的函數並未去執行訪問其所在類的內部類的成員函數:Inner();
且Outer並不是static,所以其只能實例化一個對象,然後對象.makeInner();這時處於運行時,此類的對象可以調用此類的內部類的成員方法和成員變數,自然可以調用Inner();
說的簡單點:你使用makeInner()時一定是實例化一個Outer的對象了,不然你無法調用makeInner,對吧,運行makeInner時他一定是在Outer這個類的對象下運行的,Outer的對象是可以訪問其內部類Inner的變數和方法的。所以說:makeInner()運行時你絕對已經創建了一個Outer的對象了。是這個對象的makeInner()在運行,而這個Outer的這個對象是可以訪問Outer的內部類Inner的變數和方法的。編譯並非運行,編譯時Outer沒有實例化對象,但makeInner()也沒被調用運行,所以他編譯時沒有去訪問內部類Inner的東東,等你運行時自然你已經實例化一個對象了,自然也就可以訪問了~~~

3. 說說這篇我為什麼從python轉向go

恩看了這篇我為什麼從python轉向go,
看來作者也是 KSO 輕辦公/企業快盤團隊的。作為快盤從無到有時期的工程師之一(總是被瀟灑哥說他們改我留下的 bug ),又恰好是
Python/Go 雙修(大霧其實我是 Rust 黨),其實一開始我是拒絕的,ang ang ang,那就隨手寫一點把。

一段段來吧,首先作者說 Python 是動態語言

python是一門動態語言,不是強類型系統。對於一個變數,我們有時候壓根不知道它是什麼類型,然後就可能出現int + string這樣的運行時錯誤。

在python裡面,可以允許同名函數的出現,後一個函數會覆蓋前一個函數,有一次我們系統一個很嚴重的錯誤就是因為這個導致的。

事實上,如果是靜態檢查,pylint 和 pyflakes 是可以做這件事的,雖然不能和 go
那種靜態編譯型語言比,但也足夠了。如果沒記錯的話,阿通當年是要求全組都在提交前做靜態檢查的。我認為這種問題更多的應該是人員素質上來避免,畢竟蔥頭
也說過,代碼自己寫的就要多回頭看看,看能不能重構,能不能做更好。不是說偷懶不行,但是從中得出 Python
動態特性太靈活,Python:怪我咯?

另外,函數作為第一對象,在 Python 中是 feature,Go 要寫個 mock,簡直虐得不要不要的。

其實這個一直是很多人吐槽python的地方,不過想想,python最開始是為了解決啥問題而被開發出來的?我們硬是要將他用到高性能伺服器開發上面,其實也是有點難為它。

如果沒記錯,無論是輕辦公還是快盤,是重 IO 不重 CPU,最大耗時是數據塊加密那塊,我在的時候是 Java 寫的。另外高性能伺服器選 Go 也是虐得不要不要的,各種小心翼翼避免 GC。大多數極端情況下,pypy 的性能足矣勝任了,我認為這不算充分條件。

python的GIL導致導致無法真正的多線程,大家可能會說我用多進程不就完了。但如果一些計算需要涉及到多進程交互,進程之間的通訊開銷也是不得不考慮的。

其實,Python 有宏可以繞開這個 GIL,但是呢架構設計得好其實可以避免的,到非同步那塊我會說。

無狀態的分布式處理使用多進程很方便,譬如處理http請求,我們就是在nginx後面掛載了200多個django server來處理http的,但這么多個進程自然導致整體機器負載偏高。

但即使我們使用了多個django進程來處理http請求,對於一些超大量請求,python仍然處理不過來。所以我們使用openresty,將高頻次的http請求使用lua來實現。可這樣又導致使用兩種開發語言,而且一些邏輯還得寫兩份不同的代碼。

如果推測沒錯,你們現在還在用五年前寫的 Gateway?那個基於 django route
的流量分發層?四年前我離開的時候已經小范圍的使用 Flask+Gevent Demo 測試過了,無論是性能還是負載都比同步模型的 django
有優勢。如果還是 django
這套的話,我只能說比較遺憾,畢竟當年金山新員工大賽頭牌就是我和幾個小夥伴寫的實時同步在線文檔編輯系統,用的就是這套技術。

因此這是個工程問題,並非語言問題。 Python 提供給了你了這么多工具,硬要選一個傳統的,Old fashion 的,Python:怪我咯?

django的網路是同步阻塞的,也就是說,如果我們需要訪問外部的一個服務,在等待結果返回這段時間,django不能處理任何其他的邏輯(當然,多線程的除外)。如果訪問外部服務需要很長時間,那就意味著我們的整個服務幾乎在很長一段時間完全不可用。

為了解決這個問題,我們只能不斷的多開django進程,同時需要保證所有服務都能快速的處理響應,但想想這其實是一件很不靠譜的事情。

同步模型並非不行,因為 overhead 足夠低,很多業務場景下用同步模型反而會取得更好的效果,比如豆瓣。同步模型最大的問題是對於 IO 密集型業務等待時間足夠長,這時候需要的不是換語言 ,而是提醒你是不是架構要改一下了。

雖然tornado是非同步的,但是python的mysql庫都不支持非同步,這也就意味著如果我們在tornado裡面訪問資料庫,我們仍然可能面臨因為資料庫問題造成的整個服務不可用。

tornado 是有這個問題,但是 gevent 已經解決了。我在 node.js 的某問題下曾經回答過,對於 node
而言,能選擇的非同步模型只有一個,而 Python 就是太多選擇了。另外 pypy+tornado+redis
可以隨意虐各種長連接的場景,比如我給我廠寫過的一個 push service。

其實非同步模型最大的問題在於代碼邏輯的割裂,因為是事件觸發的,所以我們都是通過callback進行相關處理,於是代碼裡面就經常出現干一件事情,傳一個callback,然後callback裡面又傳callback的情況,這樣的結果就是整個代碼邏輯非常混亂。

這個還真不是,如果說沒有 ES6 的 JavaScript,可能真有 Callback hell,但這是 Python 啊!Python
早就實現了左值綁定唉,yield 那姿勢比某些天天吹的語言不知道高到哪裡去了,當然我說的是完整版的 Python3 yield。即便是不完整的
Python 2 yield 用於非同步表達式求值也是完全足夠的,tornado 的 gen.coroutine 啊。

同步形態寫非同步,在 Python 實力強的公司裡面早普及了,這是個工程問題,並非語言問題。當然把這種事怪在 Python 身上,Python:怪我咯?

python沒有原生的協程支持,雖然可以通過gevent,greenlet這種的上patch方式來支持協程,但畢竟更改了python源碼。另外,python的yield也可以進行簡單的協程模擬,但畢竟不能跨堆棧,局限性很大,不知道3.x的版本有沒有改進。

無論是 Gevent 還是 Greenlet 均沒修改 Python 源碼,事實上這貨已經成為了 Py2 coroutine 的標准,加上豆瓣開源出來的greenify,基本上所有的庫都可以平滑的非同步化,包括 MySQL 等 C 一級的 lib。自從用上這套技術後,豆瓣的 Python dev 各種爽得不要不要的。

當我第一次使用python開發項目,我是沒成功安裝上項目需要的包的,光安裝成功mysql庫就弄了很久。後來,是一位同事將他整個python目錄打包給我用,我才能正常的將項目跑起來。話說,現在有了docker,是多麼讓人幸福的一件事情。

而部署python服務的時候,我們需要在伺服器上面安裝一堆的包,光是這一點就讓人很麻煩,雖然可以通過puppet,salt這些自動化工具解決部署問題,但相比而言,靜態編譯語言只用扔一個二進制文件,可就方便太多了。

恰好我又是在開發基於 docker 的平台, docker 還真不是用來做部署這事的。首先, Python 是有 virtualenv
這個工具的,事實上對比包管理和包隔離,Python 比 Go 高得不知道哪裡去了。Python 跟 Git 談笑風生的時候, Go 的 dev
們還得考慮我怎樣才能使得 import 的包穩定在一個版本上(當然現在有很多第三方方案)。Virtualenv + Pip 完全可以實現
Python 部署自動化,所以這個問題我認為是,工具鏈選取問題。畢竟是個十幾年的老妖怪了,Python
啥情況沒見過啊,各種打包工具任君選擇,強行說 Python 部署不方便,Python:怪我咯?

python非常靈活簡單,寫c幾十行代碼才能搞定的功能,python一行代碼沒准就能解決。但是太簡單,反而導致很多
同學無法對代碼進行深層次的思考,對整個架構進行細致的考量。來了一個需求,啪啪啪,鍵盤敲完開速實現,結果就是代碼越來越混亂,最終導致了整個項目代碼
失控。

曾經知乎有個帖子問 Python 會不會降低程序員編程能力,
我只能說這真的很人有關。你不去思考深層次的東西怪語言不行是沒道理的,那好,Go 裡面 goroutine 是怎麼實現的,一個帶 socket 的
goroutine
最小能做到多少內存,思考過?任何語言都有自己的優勢和劣勢,都需要執行者自己去判斷,一味的覺得簡單就不會深入思考這是有問題的。另外,代碼混亂我認為
還是工程上的控制力不夠,豆瓣有超過10W行的 Python 實現,雖然不說很完美,大體上做到了不會混亂這么個目標。

還有,C 寫幾十行搞定的 Python 一行解決這絕對是重大 feature,生產力啊,人員配置啊,招人培養的成本啊,從工程上來說,Python 在這一塊完全是加分項,不是每個項目都要求極致的並發,極致的效率,做工程很多時候都是要取捨的。

雖然java和php都是最好的編程語言(大家都這么爭的),但我更傾向一門更簡單的語言。而openresty,雖然性
能強悍,但lua仍然是動態語言,也會碰到前面說的動態語言一些問題。最後,前金山許式偉用的go,前快盤架構師蔥頭也用的go,所以我們很自然地選擇了
go。

Openresty 用 lua 如果按照動態語言的角度去看,還真算不上,頂多是個簡單點的 C。許式偉走的時候大多數都是
CPP,蔥頭目前我還不知道他創業用的是什麼寫的,不過他肯定沒語言傾向。當年無論是 leo 還是 ufa,一個用 Python 一個用
Java, 他都是從工程實際來選擇使用什麼樣的語言。

error,好吧,如果有語言潔癖的同學可能真的受不了go的語法,尤其是約定的最後一個返回值是error。

這其實是 Go style,無論是 go fmt 還是 error style,Go 其實是想抹平不同工程師之間的風格問題。不再為了一個縮進和大括弧位置什麼的浪費時間。這種方法並不是不好,只是我個人覺得沒 rust 那種返回值處理友善。

GC,java的GC發展20年了,go才這么點時間,gc鐵定不完善。所以我們仍然不能隨心所欲的寫代碼,不然在大請求量下面gc可能會卡頓整個服務。所以有時候,該用對象池,內存池的一定要用,雖然代碼丑了點,但好歹性能上去了。

1.4 開始 go 就是 100% 精確 GC 了,另外說到卡頓啊,完全和你怎麼用對象有關,能內聯絕不傳引用大部分場景是完全足夠的,這樣 gc 的影響程度會最低。實在想用池……只能說為啥不選 Java。

天生的並行支持,因為goroutine以及channel,用go寫分布式應用,寫並發程序異常的容易。沒有了蛋疼的callback導致的代碼邏輯割裂,代碼邏輯都是順序的。

這是有代價的,goroutine 的內存消耗計算(當然1.3還是1.4開始得到了很大的改善,內存最小值限制已經沒了),channel
跨線程帶來的性能損耗(跨線程鎖),還有對 goroutine 的控制力幾乎為 0
等。總之這種嘛,算不上是殺手級特性,大家都有,是方便了一點,但也有自己的弊端。比如我們用 go 吧,經常就比較蛋疼 spawn 出去的
goroutine 怎麼優美的 shutdown,反而有時候把事情做復雜化了。

性能,go的性能可能趕不上c,c++以及openresty,但真的也挺強悍的。在我們的項目中,現在單機就部署了一個go的進程,就完全能夠勝任以前200個python進程乾的事情,而且CPU和MEM佔用更低。

我不嚴謹的實測大概 gevent+py2 能達到同樣邏輯 go 實現的 30%~40%,pypy+tornado 能達到
80%~90%,混合了一些計算和連接處理什麼的。主要還是看業務場景吧,純粹的 CPU bound 當然是 go 好,純粹的 IO bound
你就是用 C 也沒用啊。

運維部署,直接編譯成二進制,扔到伺服器上面就成,比python需要安裝一堆的環境那是簡單的太多了。當然,如果有cgo,我們也需要將對應的動態庫給扔過去。

我們現在根據 glibc 所處的 host 版本不同有2套編譯環境,看上去是部署簡單了,編譯起來坑死你。另外雖然說 disk 便宜,這幾行代碼就幾M了,集群同步部署耗時在某些情況下還真會出簍子。

開發效率,雖然go是靜態語言,但我個人感覺開發效率真的挺高,直覺上面跟python不相上下。對於我個人來說,最好的
例子就是我用go快速開發了非常多的開源組件,譬如ledisdb,go-mysql等,而這些最開始的版本都是在很短的時間裡面完成的。對於我們項目來
說,我們也是用go在一個月就重構完成了第一個版本,並發布。

閱讀全文

與javacgo特性對比相關的資料

熱點內容
計算機訪問網路時延 瀏覽:356
閨蜜qq黑白頭像動漫頭像 瀏覽:674
jni文件路徑 瀏覽:962
數控cnc編程R值是什麼 瀏覽:662
qq聊天框錨文本鏈接 瀏覽:946
360刪除文件怎麼恢復 瀏覽:815
扣扣昵稱豎起來代碼 瀏覽:157
蘋果數據線聚乙烯跟編織哪個好 瀏覽:724
使用原始配置文件登錄 瀏覽:367
word合同填充 瀏覽:115
版本修改器 瀏覽:205
linux查看文件夾文件 瀏覽:241
上海公交卡app如何使用全國交聯卡 瀏覽:21
app需求怎麼做 瀏覽:267
90版本dnf瞎子心眼技能 瀏覽:20
知聊app怎麼登錄 瀏覽:801
企業網站建設在構建時要考慮哪些因素 瀏覽:164
多層節點如何獲取最後一層數據 瀏覽:978
wOrd文件怎麼轉掉成Cad 瀏覽:812
vue引用本地js文件 瀏覽:780

友情鏈接