我感覺還是python+c比較好。
成都創(chuàng)新互聯(lián)專注于華州網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供華州營銷型網(wǎng)站建設(shè),華州網(wǎng)站制作、華州網(wǎng)頁設(shè)計、華州網(wǎng)站官網(wǎng)定制、微信小程序定制開發(fā)服務(wù),打造華州網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供華州網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
就我身邊的人來看,得出如下觀點:
c++:學(xué)一樣可以解決任何問題,就是學(xué)習(xí)的成本太高,時間腦力不夠?qū)W不好啊。。。
python+c:拿來一個項目,先用python做個試用版(不考慮執(zhí)行效率、內(nèi)存等),開發(fā)速度是其他語言開發(fā)時間的十倍,然后測試,發(fā)現(xiàn)執(zhí)行中出現(xiàn)瓶頸的話,要不就多開幾個進(jìn)程,要不就用c語言寫小的功能,再用python調(diào)用,幾乎可以又快又好的解決任何問題。(要提高速度試試pypy)
go:一直有人強(qiáng)調(diào)go對多線程多cpu執(zhí)行時的效率有多塊多好,那是因為他和python比,python根本不支持多線程(因為GIL的存在),go各方面都很平庸(比效率比不過c,比庫的支持比不過python(python也可以用c庫?。?,只是和python瘸腿的一方面比當(dāng)然強(qiáng)了。。。
c#、java之類:轉(zhuǎn)別人的話說,用起來感覺像開著一輛裝滿石頭的拖拉機(jī)。。。
01、Python
無論是安卓或iOS應(yīng)用開發(fā),還是構(gòu)建桌面應(yīng)用,企業(yè)如今會雇用專門使用Python的開發(fā)人員。這也是意料之中的,因為Python有許多優(yōu)勢,而且它是一種頂級的通用語言。
Python最大的優(yōu)勢在于它相對容易學(xué)習(xí),而且還加快了開發(fā)時間,這也是為什么企業(yè)機(jī)構(gòu)如此喜歡Python的原因。同時對于作為開發(fā)人員來說,Python還具有開源的優(yōu)勢,并且在線社區(qū)非常活躍,這意味著你可以隨時得到指導(dǎo)和支持。
正由于Python如此流行,該領(lǐng)域并不缺乏人才,但這并不意味著你不應(yīng)該學(xué)習(xí)這種全堆棧語言。這里要注意一下,Python可能比Kotlin等其他語言速度慢,而且它不是移動設(shè)備的原生語言,可能會導(dǎo)致應(yīng)用程序內(nèi)存消耗高。
02、Kotlin
學(xué)習(xí)Kotlin的一大亮點在于,谷歌很喜歡使用該語言。事實上,自2017年以來,Kotlin一直是谷歌的首選軟件開發(fā)語言。
谷歌優(yōu)先考慮基于Kotlin的應(yīng)用程序的創(chuàng)新特性和功能,開發(fā)者只需用這種易于使用的語言編寫代碼,就可以輕松地在競爭中保持領(lǐng)先。最重要的是,你可以使用Kotlin作為WordPress編程實踐,構(gòu)建WP網(wǎng)站或開發(fā)android應(yīng)用程序、服務(wù)器等。而且只要是使用Java的地方,你都可以使用Kotlin,因為它與這種流行的語言是互通的。
03、JavaScript
在頂尖的編程語言中,不得不提JavaScript,它已成為桌面軟件、基于web的應(yīng)用程序甚至手機(jī)應(yīng)用程序的標(biāo)桿性語言。
你現(xiàn)在可能會想,為了成為一名優(yōu)秀的的開發(fā)者,你需要學(xué)習(xí)本文中提到的所有語言,事實上你掌握的語言越多,這越有利于你的職業(yè)發(fā)展。
要知道,如今開發(fā)團(tuán)隊和公司一般都傾向于招募具有多項技能的開發(fā)人員,JavaScript能讓你如虎添翼。JavaScript的優(yōu)勢在于,你幾乎可以用這種語言編寫任何代碼。而且它在電子商務(wù)行業(yè)中特別流行,用于編寫運輸應(yīng)用程序以及其他后端以客戶為中心的應(yīng)用程序。
所有這些都表明,學(xué)習(xí)JavaScript是一項非常有價值的技能。它的優(yōu)勢在于速度性、多功能性和可靠性。同時JavaScript流行度很高,由于有巨大的在線社區(qū),這也讓其易于學(xué)習(xí)。
04、C++
經(jīng)過多年的發(fā)展,C++已經(jīng)成為一種用于分析和研究目的的編程語言,現(xiàn)在它是游戲開發(fā)的主要語言之一。這是因為C++是世界上最流行的游戲引擎——虛幻引擎(Unreal Engine)的主要腳本語言。
如果你想在2022年成為游戲行業(yè)一個有競爭力的開發(fā)者,不妨學(xué)一學(xué)C++。該語言對于系統(tǒng)軟件開發(fā),以及將項目管理方法集成到PM應(yīng)用程序和企業(yè)專有軟件中非常有用。同時,C++還支持面向?qū)ο缶幊桃约岸喾N其他編程模式,這使C++具有高度的通用性,而且也比其他一些編程語言更容易學(xué)習(xí)。
在使用C++時,唯一麻煩的是沒有自動垃圾回收器,這意味著你需要手工清除無用數(shù)據(jù)。內(nèi)置的friends函數(shù)和全局變量可能會帶來一些安全風(fēng)險,你可以通過管理訪問點來避免這些風(fēng)險。
05、Golang
Golang最早出現(xiàn)在2009年,但它被認(rèn)為是一種相當(dāng)新的語言。近年來,無論是在前端還是后端,Golang都在開發(fā)社區(qū)掀起了一波浪潮。
Golang是由谷歌推出的,主要目的是將推進(jìn)函數(shù)式編程的發(fā)展,它具有許多C語言應(yīng)有的功能,比如包括垃圾收集器、更好的內(nèi)存安全性和管理、結(jié)構(gòu)類型等等。
英文原文鏈接【Go, the unwritten parts】 發(fā)表于2017/05/22 作者JBD是Go語言開發(fā)小組成員
檢查程序的執(zhí)行路徑和當(dāng)前狀態(tài)是非常有用的調(diào)試手段。核心文件(core file)包含了一個運行進(jìn)程的內(nèi)存轉(zhuǎn)儲和狀態(tài)。它主要是用來作為事后調(diào)試程序用的。它也可以被用來查看一個運行中的程序的狀態(tài)。這兩個使用場景使調(diào)試文件轉(zhuǎn)儲成為一個非常好的診斷手段。我們可以用這個方法來做事后診斷和分析線上的服務(wù)(production services)。
在這篇文章中,我們將用一個簡單的hello world網(wǎng)站服務(wù)作為例子。在現(xiàn)實中,我們的程序很容易就會變得很復(fù)雜。分析核心轉(zhuǎn)儲給我們提供了一個機(jī)會去重構(gòu)程序的狀態(tài)并且查看只有在某些條件/環(huán)境下才能重現(xiàn)的案例。
作者注 : 這個調(diào)試流程只在Linux上可行。我不是很確定它是否在其它Unixs系統(tǒng)上工作。macOS對此還不支持。Windows現(xiàn)在也不支持。
在我們開始前,需要確保核心轉(zhuǎn)儲的ulimit設(shè)置在合適的范圍。它的缺省值是0,意味著最大的核心文件大小是0。我通常在我的開發(fā)機(jī)器上將它設(shè)置成unlimited。使用以下命令:
接下來,你需要在你的機(jī)器上安裝 delve 。
下面我們使用的 main.go 文件。它注冊了一個簡單的請求處理函數(shù)(handler)然后啟動了HTTP服務(wù)。
讓我們編譯并生產(chǎn)二進(jìn)制文件。
現(xiàn)在讓我們假設(shè),這個服務(wù)器出了些問題,但是我們并不是很確定問題的根源。你可能已經(jīng)在程序里加了很多輔助信息,但還是無法從這些調(diào)試信息中找出線索。通常在這種情況下,當(dāng)前進(jìn)程的快照會非常有用。我們可以用這個快照深入查看程序的當(dāng)前狀態(tài)。
有幾個方式來獲取核心文件。你可能已經(jīng)熟悉了奔潰轉(zhuǎn)儲(crash dumps)。它們是在一個程序奔潰的時候?qū)懭氪疟P的核心轉(zhuǎn)儲。Go語言在缺省設(shè)置下不會生產(chǎn)奔潰轉(zhuǎn)儲。但是當(dāng)你把 GOTRACEBACK 環(huán)境變量設(shè)置成“crash”,你就可以用 Ctrl+backslash 才觸發(fā)奔潰轉(zhuǎn)儲。如下圖所示:
上面的操作會使程序終止,將堆棧跟蹤(stack trace)打印出來,并把核心轉(zhuǎn)儲文件寫入磁盤。
另外個方法可以從一個運行的程序獲得核心轉(zhuǎn)儲而不需要終止相應(yīng)的進(jìn)程。 gcore 可以生產(chǎn)核心文件而無需使運行中的程序退出。
根據(jù)上面的操作,我們獲得了轉(zhuǎn)儲而沒有終止對應(yīng)的進(jìn)程。下一步就是把核心文件加載進(jìn)delve并開始分析。
差不多就這些。delve的常用操作都可以使用。你可以backtrace,list,查看變量等等。有些功能不可用因為我們使用的核心轉(zhuǎn)儲是一個快照而不是正在運行的進(jìn)程。但是程序執(zhí)行路徑和狀態(tài)全部可以訪問。
《Go語言實戰(zhàn)》(威廉·肯尼迪 (William Kennedy))電子書網(wǎng)盤下載免費在線閱讀
鏈接:
提取碼:1234
書名:Go語言實戰(zhàn)
作者:威廉·肯尼迪 (William Kennedy)
譯者:李兆海
豆瓣評分:7.7
出版社:人民郵電出版社
出版年份:2017-3-1
頁數(shù):224
內(nèi)容簡介:
Go語言結(jié)合了底層系統(tǒng)語言的能力以及現(xiàn)代語言的高級特性,旨在降低構(gòu)建簡單、可靠、高效軟件的門檻。本書向讀者提供一個專注、全面且符合語言習(xí)慣的視角。Go語言實戰(zhàn)同時關(guān)注語言的規(guī)范和實現(xiàn),涉及的內(nèi)容包括語法、類型系統(tǒng)、并發(fā)、管道、測試,以及其他一些主題。
作者簡介:
William Kennedy,是一位熟練的軟件開發(fā)者,也是博客GoingGo.Net的作者。
Brian Ketelsen和Erik St. Martin是全球Go語言大會GopherCon的組織者,也是Go語言框架Skynet的聯(lián)合作者。
李兆海,多年專注于后端分布式網(wǎng)絡(luò)服務(wù)開發(fā),曾使用過多個流行后端技術(shù)和相關(guān)架構(gòu)實踐,是Go語言和Docker的早期使用者和推廣者,《第1本Docker書》的譯者。作為項目技術(shù)負(fù)責(zé)人,成功開發(fā)了百萬用戶級直播系統(tǒng)。
本文是對 Gopher 2017 中一個非常好的 Talk?: [Understanding Channel](GopherCon 2017: Kavya Joshi - Understanding Channels) 的學(xué)習(xí)筆記,希望能夠通過對 channel 的關(guān)鍵特性的理解,進(jìn)一步掌握其用法細(xì)節(jié)以及 Golang 語言設(shè)計哲學(xué)的管窺蠡測。
channel 是可以讓一個 goroutine 發(fā)送特定值到另一個 gouroutine 的通信機(jī)制。
原生的 channel 是沒有緩存的(unbuffered channel),可以用于 goroutine 之間實現(xiàn)同步。
關(guān)閉后不能再寫入,可以讀取直到 channel 中再沒有數(shù)據(jù),并返回元素類型的零值。
gopl/ch3/netcat3
首先從 channel 是怎么被創(chuàng)建的開始:
在 heap 上分配一個 hchan 類型的對象,并將其初始化,然后返回一個指向這個 hchan 對象的指針。
理解了 channel 的數(shù)據(jù)結(jié)構(gòu)實現(xiàn),現(xiàn)在轉(zhuǎn)到 channel 的兩個最基本方法: sends 和 receivces ,看一下以上的特性是如何體現(xiàn)在 sends 和 receives 中的:
假設(shè)發(fā)送方先啟動,執(zhí)行 ch - task0 :
如此為 channel 帶來了 goroutine-safe 的特性。
在這樣的模型里, sender goroutine - channel - receiver goroutine 之間, hchan 是唯一的共享內(nèi)存,而這個唯一的共享內(nèi)存又通過 mutex 來確保 goroutine-safe ,所有在隊列中的內(nèi)容都只是副本。
這便是著名的 golang 并發(fā)原則的體現(xiàn):
發(fā)送方 goroutine 會阻塞,暫停,并在收到 receive 后才恢復(fù)。
goroutine 是一種 用戶態(tài)線程 , 由 Go runtime 創(chuàng)建并管理,而不是操作系統(tǒng),比起操作系統(tǒng)線程來說,goroutine更加輕量。
Go runtime scheduler 負(fù)責(zé)將 goroutine 調(diào)度到操作系統(tǒng)線程上。
runtime scheduler 怎么將 goroutine 調(diào)度到操作系統(tǒng)線程上?
當(dāng)阻塞發(fā)生時,一次 goroutine 上下文切換的全過程:
然而,被阻塞的 goroutine 怎么恢復(fù)過來?
阻塞發(fā)生時,調(diào)用 runtime sheduler 執(zhí)行 gopark 之前,G1 會創(chuàng)建一個 sudog ,并將它存放在 hchan 的 sendq 中。 sudog 中便記錄了即將被阻塞的 goroutine G1 ,以及它要發(fā)送的數(shù)據(jù)元素 task4 等等。
接收方 將通過這個 sudog 來恢復(fù) G1
接收方 G2 接收數(shù)據(jù), 并發(fā)出一個 receivce ,將 G1 置為 runnable :
同樣的, 接收方 G2 會被阻塞,G2 會創(chuàng)建 sudoq ,存放在 recvq ,基本過程和發(fā)送方阻塞一樣。
不同的是,發(fā)送方 G1如何恢復(fù)接收方 G2,這是一個非常神奇的實現(xiàn)。
理論上可以將 task 入隊,然后恢復(fù) G2, 但恢復(fù) G2后,G2會做什么呢?
G2會將隊列中的 task 復(fù)制出來,放到自己的 memory 中,基于這個思路,G1在這個時候,直接將 task 寫到 G2的 stack memory 中!
這是違反常規(guī)的操作,理論上 goroutine 之間的 stack 是相互獨立的,只有在運行時可以執(zhí)行這樣的操作。
這么做純粹是出于性能優(yōu)化的考慮,原來的步驟是:
優(yōu)化后,相當(dāng)于減少了 G2 獲取鎖并且執(zhí)行 memcopy 的性能消耗。
channel 設(shè)計背后的思想可以理解為 simplicity 和 performance 之間權(quán)衡抉擇,具體如下:
queue with a lock prefered to lock-free implementation:
比起完全 lock-free 的實現(xiàn),使用鎖的隊列實現(xiàn)更簡單,容易實現(xiàn)
極客時間的GO語言進(jìn)階訓(xùn)練營是很不錯,知識內(nèi)容涉及比較全面,從編程語言到中間件、系統(tǒng)設(shè)計再到架構(gòu)都安排了相關(guān)課程,老師們在課程中不講語法和用法,重點傳遞設(shè)計原理和最佳實踐,講課的過程中貼合工作場景,分享真實的干貨案例,啟發(fā)學(xué)員的思維讓其自主進(jìn)行學(xué)習(xí),還幫學(xué)員建立系統(tǒng)大局觀,有助于學(xué)員深層次的提升。