❶ Rust語言編程實例100題-016
題目: 給定兩個正整數m=128和n=60,求其最大公約數和最小公倍數。
程序分析:
(1)最小公倍數=輸入的兩個數之積除於它們的最大公約數,關鍵是求出最大公約數;
(2)求最大公約數用輾轉相除法(又名歐幾里德演算法)
1)證明:設c是a和b的最大公約數,記為c=gcd(a,b),a>=b,
令r=a mod b
設a=kc,b=jc,則k,j互素,否則c不是最大公約數
據上,r=a-mb=kc-mjc=(k-mj)c
可知r也是c的倍數,且k-mj與j互素,否則與前述k,j互素矛盾,
由此可知,b與r的最大公約數也是c,即gcd(a,b)=gcd(b,a mod b),得證。
2)演算法描述:
第一步:a ÷ b,令r為所得余數(0≤r 第二步:互換:置 a←b,b←r,並返回第一步。
輸出格式: 第一行輸出最大公約數,第二行輸出最小公倍數。
知識點 :循環
程序執行結果:
❷ rust可以開發分布式系統嗎
rust是可以開發分布式系統的。
引子
構建一個分布式系統 並不是一件容易的事情,我們需要考慮很多的問題,首先就是我們的系統到底需要提供什麼樣的功能,譬如:
一致性:我們是否需要保證整個系統的線性一致性,還是能容忍短時間的數據不一致,只支持最終一致性。
穩定性:我們能否保證系統 7 x 24 小時穩定運行。系統的可用性是 4 個 9,還有 5 個 9?如果出現了機器損壞等災難情況,系統能否做的自動恢復。
擴展性:當數據持續增多,能否通過添加機器就自動做到數據再次平衡,並且不影響外部服務。
分布式事務:是否需要提供分布式事務支持,事務隔離等級需要支持到什麼程度。
上面的問題在系統設計之初,就需要考慮好,作為整個系統的設計目標。為了實現這些特性,我們就需要考慮到底採用哪一種實現方案,取捨各個方面的利弊等。
後面,我將以我們開發的分布式 Key-Value TiKV 作為實際例子,來說明下我們是如何取捨並實現的。
TiKV
TiKV 是一個分布式 Key-Value store,它使用 Rust 開發,採用 Raft 一致性協議保證數據的強一致性,以及穩定性,同時通過 Raft 的 Configuration Change 機制實現了系統的可擴展性。
TiKV 提供了基本的 KV API 支持,也就是通常的 Get,Set,Delete,Scan 這樣的 API。TiKV 也提供了支持 ACID 事務的 Transaction API,我們可以使用 Begin 開啟一個事務,在事務裡面對 Key 進行操作,最後再用 Commit 提交一個事務,TiKV 支持 SI 以及 SSI 事務隔離級別,用來滿足用戶的不同業務場景。
Rust
在規劃好 TiKV 的特性之後,我們就要開始進行 TiKV 的開發。這時候,我們面臨的第一個問題就是採用什麼樣的語言進行開發。當時,擺在我們眼前的有幾個選擇:
Go,Go 是我們團隊最擅長的一門語言,而且 Go 提供的 goroutine,channel 這些機制,天生的適合大規模分布式系統的開發,但靈活方便的同時也有一些甜蜜的負擔,首先就是 GC,雖然現在 Go 的 GC 越來越完善,但總歸會有短暫的卡頓,另外 goroutine 的調度也會有切換開銷,這些都可能會造成請求的延遲增高。
Java,現在世面上面有太多基於 Java 做的分布式系統了,但 Java 一樣有 GC 等開銷問題,同時我們團隊在 Java 上面沒有任何開發經驗,所以沒有採用。
C++,C++ 可以認為是開發高性能系統的代名詞,但我們團隊沒有特別多的同學能熟練掌握 C++,所以開發大型 C++ 項目並不是一件非常容易的事情。雖然使用現代 C++ 的編程方式能大量減少 data race,dangling pointer 等風險,我們仍然可能犯錯。
當我們排除了上面幾種主流語言之後,我們發現,為了開發 TiKV,我們需要這門語言具有如下特性:
靜態語言,這樣才能最大限度的保證運行性能。
無 GC,完全手動控制內存。
Memory safe,盡量避免 dangling pointer,memory leak 等問題。
Thread safe,不會遇到 data race 等問題。
包管理,我們可以非常方便的使用第三方庫。
高效的 C 綁定,因為我們還可能使用一些 C library,所以跟 C 交互不能有開銷。
綜上,我們決定使用 Rust,Rust 是一門系統編程語言,它提供了我們上面想要的語言特性,但選擇 Rust 對我們來說也是很有風險的,主要有兩點:
我們團隊沒有任何 Rust 開發經驗,全部都需要花時間學習 Rust,而偏偏 Rust 有一個非常陡峭的學習曲線。
基礎網路庫的缺失,雖然那個時候 Rust 已經出了 1.0,但我們發現很多基礎庫都沒有,譬如在網路庫上面只有 mio,沒有好用的 RPC 框架,HTTP 也不成熟。
但我們還是決定使用 Rust,對於第一點,我們團隊花了將近一個月的時間來學習 Rust,跟 Rust 編譯器作斗爭,而對於第二點,我們就完全開始自己寫。
幸運的,當我們越過 Rust 那段陣痛期之後,發現用 Rust 開發 TiKV 異常的高效,這也就是為啥我們能在短時間開發出 TiKV 並在生產環境中上線的原因。
一致性協議
對於分布式系統來說,CAP 是一個不得不考慮的問題,因為 P 也就是 Partition Tolerance 是一定存在的,所以我們就要考慮到底是選擇 C - Consistency 還是 A - Availability。
我們在設計 TiKV 的時候就決定 - 完全保證數據安全性,所以自然就會選擇 C,但其實我們並沒有完全放棄 A,因為多數時候,畢竟斷網,機器停電不會特別頻繁,我們只需要保證 HA - High Availability,也就是 4 個 9 或者 5 個 9 的可用性就可以了。
既然選擇了 C,我們下一個就考慮的是選用哪一種分布式一致性演算法,現在流行的無非就是 Paxos 或者 Raft,而 Raft 因為簡單,容易理解,以及有很多現成的開源庫可以參考,自然就成了我們的首要選擇。
在 Raft 的實現上,我們直接參考的 etcd 的 Raft。etcd 已經被大量的公司在生產環境中使用,所以它的 Raft 庫質量是很有保障的。雖然 etcd 是用 Go 實現的,但它的 Raft library 是類似 C 的實現,所以非常便於我們用 Rust 直接翻譯。在翻譯的過程中,我們也給 etcd 的 Raft fix 了一些 bug,添加了一些功能,讓其變得更加健壯和易用。
現在 Raft 的代碼仍然在 TiKV 工程裡面,但我們很快會將獨立出去,變成獨立的 library,這樣大家就能在自己的 Rust 項目中使用 Raft 了。
使用 Raft 不光能保證數據的一致性,也可以藉助 Raft 的 Configuration Change 機制實現系統的水平擴展,這個我們會在後面的文章中詳細的說明。
存儲引擎
選擇了分布式一致性協議,下一個就要考慮數據存儲的問題了。在 TiKV 裡面,我們會存儲 Raft log,然後也會將 Raft log 裡面實際的客戶請求應用到狀態機裡面。
首先來看狀態機,因為它會存放用戶的實際數據,而這些數據完全可能是隨機的 key - value,為了高效的處理隨機的數據插入,自然我們就考慮使用現在通用的 LSM Tree 模型。而在這種模型下,RocksDB 可以認為是現階段最優的一個選擇。
RocksDB 是 Facebook 團隊在 LevelDB 的基礎上面做的高性能 Key-Value Storage,它提供了很多配置選項,能讓大家根據不同的硬體環境去調優。這里有一個梗,說的是因為 RocksDB 配置太多,以至於連 RocksDB team 的同學都不清楚所有配置的意義。
關於我們在 TiKV 中如何使用,優化 RocksDB,以及給 RocksDB 添加功能,fix bug 這些,我們會在後面文章中詳細說明。
而對於 Raft Log,因為任意 Log 的 index 是完全單調遞增的,譬如 Log 1,那麼下一個 Log 一定是 Log 2,所以 Log 的插入可以認為是順序插入。這種的,最通常的做法就是自己寫一個 Segment File,但現在我們仍然使用的是 RocksDB,因為 RocksDB 對於順序寫入也有非常高的性能,也能滿足我們的需求。但我們不排除後面使用自己的引擎。
因為 RocksDB 提供了 C API,所以可以直接在 Rust 裡面使用,大家也可以在自己的 Rust 項目裡面通過 rust-rocksdb 這個庫來使用 RocksDB。
分布式事務
要支持分布式事務,首先要解決的就是分布式系統時間的問題,也就是我們用什麼來標識不同事務的順序。通常有幾種做法:
TrueTime,TrueTime 是 Google Spanner 使用的方式,不過它需要硬體 GPS + 原子鍾支持,而且 Spanner 並沒有在論文裡面詳細說明硬體環境是如何搭建的,外面要自己實現難度比較大。
HLC,HLC 是一種混合邏輯時鍾,它使用 Physical Time 和 Logical Clock 來確定事件的先後順序,HLC 已經在一些應用中使用,但 HLC 依賴 NTP,如果 NTP 精度誤差比較大,很可能會影響 commit wait time。
TSO,TSO 是一個全局授時器,它直接使用一個單點服務來分配時間。TSO 的方式很簡單,但會有單點故障問題,單點也可能會有性能問題。
TiKV 採用了 TSO 的方式進行全局授時,主要是為了簡單。至於單點故障問題,我們通過 Raft 做到了自動 fallover 處理。而對於單點性能問題,TiKV 主要針對的是 PB 以及 PB 以下級別的中小規模集群,所以在性能上面只要能保證每秒百萬級別的時間分配就可以了,而網路延遲上面,TiKV 並沒有全球跨 IDC 的需求,在單 IDC 或者同城 IDC 情況下,網路速度都很快,即使是異地 IDC,也因為有專線不會有太大的延遲。
解決了時間問題,下一個問題就是我們採用何種的分布式事務演算法,最通常的就是使用 2 PC,但通常的 2 PC 演算法在一些極端情況下面會有問題,所以業界要不通過 Paxos,要不就是使用 3 PC 等演算法。在這里,TiKV 參考 Percolator,使用了另一種增強版的 2 PC 演算法。
這里先簡單介紹下 Percolator 的分布式事務演算法,Percolator 使用了樂觀鎖,也就是會先緩存事務要修改的數據,然後在 Commit 提交的時候,對要更改的數據進行加鎖處理,然後再更新。採用樂觀鎖的好處在於對於很多場景能提高整個系統的並發處理能力,但在沖突嚴重的情況下反而沒有悲觀鎖高效。
對於要修改的一行數據,Percolator 會有三個欄位與之對應,Lock,Write 和 Data:
Lock,就是要修改數據的實際 lock,在一個 Percolator 事務裡面,有一個 primary key,還有其它 secondary keys, 只有 primary key 先加鎖成功,我們才會再去嘗試加鎖後續的 secondary keys。
Write,保存的是數據實際提交寫入的 commit timestamp,當一個事務提交成功之後,我們就會將對應的修改行的 commit timestamp 寫入到 Write 上面。
Data,保存實際行的數據。
當事務開始的時候,我們會首先得到一個 start timestamp,然後再去獲取要修改行的數據,在 Get 的時候,如果這行數據上面已經有 Lock 了,那麼就可能終止當前事務,或者嘗試清理 Lock。
當我們要提交事務的時候,先得到 commit timestamp,會有兩個階段:
Prewrite:先嘗試給 primary key 加鎖,然後嘗試給 second keys 加鎖。如果對應 key 上面已經有 Lock,或者在 start timestamp 之後,Write 上面已經有新的寫入,Prewrite 就會失敗,我們就會終止這次事務。在加鎖的時候,我們也會順帶將數據寫入到 Data 上面。
Commit:當所有涉及的數據都加鎖成功之後,我們就可以提交 primay key,這時候會先判斷之前加的 Lock 是否還在,如果還在,則刪掉 Lock,將 commit timestamp 寫入到 Write。當 primary key 提交成功之後,我們就可以非同步提交 second keys,我們不用在乎 primary keys 是否能提交成功,即使失敗了,也有機制能保證數據被正常提交。
❸ 為什麼python內置的sort比自己寫的快速排序快100倍
主要原因,內置函數用C寫的。在Python語言內無論如何造不出內置函數的輪子。這也是通常C跟C++語言用戶更喜歡造基礎演算法的輪了的原因。因為C/C++用戶真有條件寫出匹敵標准庫的演算法,但很多高級語言不行,不是程序員技術差,是客觀條件就根本做不到。
你比如說Java語言沒人造字元串的輪子,C++光一個字元串類就有無數多的實現。是因為C+用戶更喜歡寫字元串類嗎?顯然不是,一方面是因為Java語言內沒法造出匹敵Java內置標准庫演算法的輪子,而C++真的可以,另外一個比較慘的原因是C++標准庫的字元串功能太弱了,大多數高級語言的字元串類功能都比C+標准庫字元串類功能更強。
Cpp內置的排序是快排和堆排的結合,最壞時間復雜度為nlogn,而快排最壞是n2。至於python內部的排序,我認為是一個道理,不會簡簡單單是一個快排,舉個簡單例子,當你數據已經是有序的時候,再傳入快排肯定就不合適。那你設置排序函數的時候,是不是預先將他打亂,再進行快排會更好呢。當然具體不會這么簡單,只是我認為官方給的介面都是很精妙的,很值得學習。
一方面Python中sort函數是用C語言寫的,C++內部的sort是由快排,直接插入和堆排序混合的,當數據量比較大的時候先用的快排,當數據量小的時候用直接插入,因為當數據量變小時,快排中的每個部分基本有序,接近直接插入的最好情況的時間復雜度O(n),就比快排要好一點了。
另外一方面這個的底層實現就是歸並排序。,只是使用了Python無法編寫的底層實現,從而避免了Python本身附加的大量開銷,速度比我們自己寫的歸並排序要快很多,所以說我們一般排序都盡量使用sorted和sort。
❹ rust上能跑sklearn嗎
rust上能跑sklearn。可以使用Rust和Python分別實現了K-Means演算法。rust和sklearn都是學習機里的學習編程。sklearn是針對Python編程語言的免費軟體機器學習庫。sklearn又稱Scikit-learn,是機器學習中常用的第三方模塊,對常用的機器學習方法進行了封裝,包括回歸、降維、分類、聚類等方法。是一項簡單高效的數據挖掘和數據分析工具。
❺ 10個可以鍛煉你編程能力的游戲!通關既可達巔峰
一旦你知道自己要做什麼,編程就很有趣,但達到這一點,可能是一次痛苦的經歷。
這就是為什麼在上課、聽講座、看教程之間,你應該留出時間玩一玩編程 游戲 。它們不僅是有趣的放鬆手段,還能讓你親身實踐,這樣你會學得更快,記住更多知識。
Robocode
Robocode是個復雜的編程 游戲 ,在這個 游戲 中,你可以編寫機器人坦克的代碼,讓坦克們互相博弈。你要用Java、Scala、C#等編程語言,編寫人工智慧程序,驅動機器人。
Robocode安裝程序附帶開發環境,內置機器人編輯器和Java編譯器。你寫的是真正的代碼!盡管Robocode早在2000年就發布了,但它仍然定期更新和維護,因為它是開源的。
Codingame
Codingame是一款類似 游戲 的Web應用程序,通過編寫真實代碼來解決難題和挑戰。支持超過25種編程語言,包括Java、C#、Python、JavaScript、Lua、Go、Rust等。每一個難題或挑戰都有一個主題,例如,編程炮塔擊落附近的飛艇,是不是很有趣?
Codecombat
Codecombat也是一個用於像 游戲 的謎題挑戰類Web應用程序,只能通過編寫代碼來解決。不過Codengame更有 娛樂 性,Codecombat有很強的教育意義,它有一個「課堂版」,老師可以用來幫助學生學習編碼。目前有3種課程可供選擇:計算機科學、網路開發和 游戲 開發。
Codewars
Codewars與其說是 游戲 ,不如說是一種練習編碼和解決演算法挑戰的 游戲 化學習方式。解決問題後你可以得到一定點數,點數值取決於你的解決方案的效率。Codewars允許你查看他人提交的解決方案,方便學習和借鑒。
Codehunt
Codehunt是一種可以使用Java或C#來玩的 游戲 。它的目標是教你學會編程語言的基礎知識,從訓練開始,到循環和字元串等主題,最後是排序、密碼和編程難題等挑戰。Codehunt的有趣之處在於,它沒有告訴你如何贏得每一項挑戰。
Vim Adventures
Vim Adventures是一個有趣的類似 游戲 的教程,用於學習如何使用Vim,這是一個功能極其強大的文本編輯器,許多編程專家都喜歡用。然而,它不容易學,這就是為什麼有這樣的教程。雖然Vim本身不是一種編程語言,但掌握Vim可以幫你更高效地編碼。
TIS – 100
TIS - 100是一款與眾不同的視頻 游戲 ,它迫使你學習並使用模擬的低級匯編代碼來解決編程難題。這個 游戲 很難,它是開放式的,只要你沒有怒到卸載它,就會發現它的價值。
Shenzhen I/O
Shenzhen I/O 與TIS – 100同屬一家工作室的作品,這是一款益智 游戲 ,你的任務是創建簡化版電路,並編寫電路上運行的簡化版匯編代碼。與TIS – 100相比,Shenzhen I/O更容易學,更令人愉快,不過也同樣復雜。
Human Resource Machine
在Human
Resource
Machine中,你要扮演一名辦公室工作人員,通過將各種指令組合在一起來完成任務。從某種意義上來說,這款 游戲 要求通過可視化編程來解決難題,甚至涉及了邏輯流程和內存管理等概念——但以易於理解的、以辦公室為主題的方式呈現。這是一個鍛煉程序員大腦的好 游戲 。
Screeps
Screeps是一款大型多人在線策略 游戲 ,你要使用JavaScript來編碼 游戲 中實體的行為,並為自己建立一個帝國。
學習從來不是一個人的事情,要有個相互監督的夥伴,工作需要學習編程或者為了入行、轉行學習編程的夥伴可以私信回復我「學習」領取全套免費編程學習資料、視頻
❻ Rust VS Python:為什麼越來越流行,取代榜一 Python
2021 年,Python 又獲得了 TIOBE 年度編程語言,排名已經是第一。而 Rust 依然在 20 名以外。但依然有人認為,Rust 甚至可能取代 Python。不過這不重要,認清兩者的優缺點,進而合適的地方使用合適的語言,這才最重要。
在這個指南中,我們將比較 Rust 和 Python 這兩門語言,同時將討論它們各自的應用場景,回顧使用 Rust vs. Python 的優缺點,並解釋 Rust 為什麼越來越受歡迎(甚至可能取代 Python)。
Rust [1] 是一門系統編程語言,專注於安全,尤其是並發安全,支持函數式和命令式以及泛型等編程範式的多範式語言。Rust 在語法上和 C++ 類似,但是設計者想要在保證性能的同時提供更好的內存安全。Rust 最初是由 Mozilla 研究院的 Graydon Hoare 設計創造,然後在 Dave Herman, Brendan Eich 以及很多其他人的貢獻下逐步完善的。Rust 的設計者們通過在研發 Servo 網站瀏覽器布局引擎過程中積累的經驗優化了 Rust 語言和 Rust 編譯器。
Rust 擁有 優秀的文檔 [2] 、友好的編譯器和有用的錯誤消息,以及頂級工具,包括集成包管理器、構建工具、支持自動完成和類型檢查的智能多編輯器、自動格式化程序等等。
Rust 發布於 2010 年。雖然和 Python 相比,Rust 是一門年輕的語言,但是它的社區正在穩步增長。事實上,Rust 已經連續五年(2016,2017,2018,2019,2020)在 Stack Overflow 開發者調查的「最受喜愛編程語言」評選項目中摘取桂冠。
乍一看,Rust 的靜態化和強類型化可能看起來有點極端。但從長遠來看,這有助於防止意外的代碼行為。
Python [3] 是一門旨在幫助開發人員更有效地工作和更有效地集成系統的編程語言。Python 提供了高效的高級數據結構,還能簡單有效地面向對象編程。Python 語法和動態類型,以及解釋型語言的本質,使它成為多數平台上寫腳本和快速開發應用的編程語言,隨著版本陵純的不斷更新和語言新功能的添加,逐漸被用於獨立的、大型項目的開發。如果速度是最重要的,可以使用較低級別的 API 調用,如 CPython [4] 。
1991 年 Guido van Rossum 推出了 Python,以其代碼的可讀性、無分號和花括弧而著稱。
除了可擴展性之外,Python 還是一門解釋型語言,這使得它比大多數編譯型語言要慢。正如您可能期望的那樣,Python 擁有一個龐大的庫生態系統和一個龐大的專業社區。
Rust 被應用於系統開發、操作系統、企業系統、微控制器應用、嵌入式系統、文件系統、瀏覽器組件、虛擬現實的模擬引擎等。
當性能很重要的時候,Rust 是一種常用的語言,因為它能很好地處理大量數據。它可以處理 CPU 密集型的操作,如執行演算法,這就是為什麼 Rust 比 Python 更適合系統開發的原因。
Rust 保證了內存的安全性,讓你可以控制線程行為和線程之間滲歷的資源分配方式。這使你能夠構建復雜的系統,也使得 Rust 比 Python 更有優勢。
總而言之,你應在以下情況下使用 Rust:
Python 可以用於許多應用領域,從 Web 開發,到數據科學和分析,到 AI 和機器學習,再到軟體開發。
Python 被廣泛用於機器學習,數據科學和 AI,因為它:
在以下情況下,你應該使用 Python:
考慮到 Rust 的迅速普及、受歡迎程度和廣泛的使用案例,它幾乎不可避免地會在不久的將來超越 Python,以下是一些原因。
Rust 超越 Python 的一個主要原因是性能。因為 Rust 是直接編譯成機器代碼的,所以在你的代碼和計算機之間沒有虛擬機或解釋器。
與 Python 相比,另一個關鍵優叢汪搜勢是 Rust 的線程和內存管理。雖然 Rust 不像 Python 那樣有垃圾回收機制,但 Rust 中的編譯器會強制檢查無效的內存引用泄漏和其他危險或不規則行為。
編譯語言通常比解釋語言要快。但是,使 Rust 處於不同水平的是,它幾乎與 C 和 C ++一樣快,而且沒有額外開銷。
讓我們看一個用 Python 編寫的 O(log n) 程序的示例,並使用迭代方法計算完成任務所需的時間:
輸出:
現在,讓我們來看一下使用迭代方法用 Rust 編寫的定時 O(log n) 程序:
輸出
在沒有使用任何優化技術的情況下,Rust 和 Python 在同一台機器上執行類似的操作分別需要 4.6 微秒和 8.6 微秒。這意味著 Python 花費的時間幾乎是 Rust 的兩倍。
Python 和大多數現代編程語言一樣,被設計成內存安全的。然而,即使沒有垃圾回收。Rust 在內存安全方面卻讓 Python 望塵莫及。
Rust 採用了一種獨特的方式來確保內存安全,其中涉及所有權系統和借用檢查器(borrow checker)。Rust 的借用檢查器確保引用和指針不會超過它們所指向的數據。
Python 和其他語言一樣,提供了錯誤檢查和日誌機制。但是在讓開發者知道哪裡出了什麼問題的時候,Rust 和 Python 之間有一些差異。
舉一個 Python 變數錯誤的典型例子:
Python 輸出
Rust 中的類似示例:
Rust 輸出
在這里,Rust 推薦了可能的變數,這些變數可能是你想輸入的。Python 只會拋出錯誤,而不會給出如何修復的建議。
再舉個例子:
此代碼引發錯誤,因為默認情況下 Rust 中的變數是不可變的。除非它具有關鍵字 mut ,否則無法更改。
錯誤:
修正錯誤:
如你所見,現在它不會引發任何錯誤。除此之外,Rust 不允許不同的數據類型相互操作,除非將它們轉換為相同的類型。
因此,維護 Rust 代碼庫通常很容易。除非指定,否則 Rust 不允許更改。Python 是允許這種性質的更改的。
與大多數編譯語言相比,Rust 因其速度快、內存安全有保證、超強的可靠性、一致性和用戶友好性而備受青睞。在編程中,我們已經到了速度開始變得毫不費力的地步。
隨著技術的發展,它變得越來越快,試圖在更短的時間內做更多的事情,而不需要那麼多的權衡。Rust 幫助實現了這一點,同時又不妨礙開發者的工作。當技術試圖推動可以實現的邊界時,它也會考慮系統的安全性和可靠性,這是 Rust 背後的主要思想。
除了速度外,Python 在並行計算方面也有局限性。
Python 使用全局解釋器鎖(GIL),它鼓勵只有一個線程同時執行,以提高單線程的性能。這是一大局限,因為它意味著你不能使用多個 CPU 核進行密集計算。
如前所述,Stack Overflow 的「 2020 開發人員調查」中有 86%的受訪者將 Rust 稱為 2020 年最喜歡的編程語言。
同樣,「 2020 HackerRank 開發人員技能報告」的受訪者將 Rust 列為他們計劃下一步學習的十大編程語言:
相比之下,2019 年的調查將 Rust 排在列表的底部,這表明 Rust 開發人員社區正在迅速增長。
這些數據表明,Rust 正在成為主流開發者社區的一部分。許多大公司都在使用 Rust,一些開發者甚至用它來構建其他編程語言使用的庫。著名的 Rust 用戶包括 Mozilla、Dropbox、Atlassian、npm 和 Cloudflare 等等。
Amazon Web Service 還對 Lambda,EC2 和 S3 中的性能敏感組件採用了 Rust。在 2019 年,AWS 宣布贊助 Rust 項目,此後為 Rust 提供了 AWS 開發工具包。
公司正越來越多地用更高效的編程語言(如 Rust)取代速度較慢的編程語言。沒有其他語言能像 Rust 一樣在簡單和速度之間做出平衡。
Rust 已經發展成為一門易於使用的編程語言,因此它的使用率有所提高。盡管 Python 在機器學習/數據科學社區中佔有堅實的地位,但 Rust 在未來很可能被用作 Python 庫更有效的後端。
Rust 具有取代 Python 的巨大潛力。目前的趨勢是,在應用程序、性能和速度方面,Rust 不僅僅是一種編程語言,它還是一種思維方式。
各位看官你們覺得呢?評論區留下你的看法!
❼ 想做副業,學編程,學哪種語言比較好(零基礎)
最近有很多同學問我,我是一個零基礎的小白,到底學習哪一種語言比較好?作為一個寫了十年代碼程序員,用過七種語言的我來說,必須要強調一下,語言只是一種工具,當你真正理解了要做的事,選一個順手的就行。跟工具一樣,哪天有新的好用的語言出來,把舊的扔掉就好。
我今天寫這篇文章的目的是想給大家一個參考。
決定用什麼語言的因素有有很多,比如性能,內存佔用,開發難度,運維難度,目標平台,可執行文件大小,代碼可維護性,項目周期,項目規模,招聘難度,團隊構成,歷史遺留問題,甚至派系斗爭等。
比如騰訊就有大量歷史遺留的C和C++的伺服器代碼,畢竟20年前沒得選。又比如空降技術負責人可能會為了讓自己人上位,讓自己團隊出成績,選擇用其他語言或者框架對本來工作良好的系統進行重構。
下面開始聊語言
Python
先說python,是因為這個語言小學生都開始學習了,以後不會python要被小學生欺負了。語法簡單,除了前端幾乎萬能,可用的庫極其豐富,能想到的功能幾乎都有現成的庫可以用。不管是搞爬蟲,做人工智慧,機器學習,數據分析,還是自動化運維,自動化測試,python幾乎都是首選。不想當程序員還想學習一門語言的話,學習python就沒錯了。缺點是慢,但是能讓機器累的事,何必讓人來累。
php
PHP是世界上最好的語言,可能這個已經成為很多程序員的梗。
我沒用php開發過大型項目,自己做東西的感覺是這語言非常簡單,以前用的人很多,招聘容易,但是不適合做復雜的項目。現在用得越來越少了,迅雷以前有不少運營活動頁面是PHP做的。
C
C的語法足夠簡單,應該是最接近機器語言的高級語言,適合編寫操作系統底層,驅動程序,硬體相關的程序以及看重性能的程序。由於過於簡單,構建大型程序的復雜度非常高,建議想往研發方向走的同學都學習一下C語言。
可以對計算機一些底層原理了解,比如指令執行過程,內存管理,異常,多線程,編譯過程等又更深層次的了解。掌握C語言再學習其他語言會變得很輕松,學習破解也有幫助,畢竟匯編基本都可以反編譯出C代碼。
C++
C++是一個糟糕的語言,這不是我說的,這是Linux之父說的。我自己用C++四五年時間,越到後面就感覺這句話越有道理。
首先C++的強大是毋庸置疑的,但是作為一個跟C一樣偏底層的語言,如果不理解寫的代碼背後到底發生了什麼事,如果出了錯,你是永遠不可能知道錯在哪裡的。
一個沒有垃圾回收的語言,不用智能指針很容易導致內存泄漏,錯誤的用了智能指針不但內存泄漏之後不好解決,還容易導致提前釋放等問題。
C++支持強制類型轉換,如果轉換前後的內存結構不一樣,很有可能導致各種隱性問題。還有Java之類非原生語言的異常處理都是語言自定義的異常,而C和C++中的異常很多都是操作系統層的異常。
Windows下一個簡單的try catch,你覺得可以抓到try中所有的異常,但是由於異常處理函數的指針保存在棧上,這時一個棧溢出可能直接導致異常處理函數指針被覆蓋,異常會出現在你意想不到的地方。微軟有大神曾說過,想你的代碼後續可維護就刪掉代碼中所有的try catch。
又由於語言非常底層,當程序出現底層崩潰的時候,想解決掉這個崩潰往往要讀一些匯編,這時候如果使用了大量的模板,比如stl和boost,那生成的匯編幾乎完全不可讀。看過stl代碼的人應該都知道這玩意兒寫的有多晦澀,就導致了你想用一個C++庫,如果不了解這個庫的實現原理,那大概率會出錯。
C++的復雜度又讓你很難真的理解那個庫的原理,結論就是C++強大,但是必須用的人也強大。C++直到現在還在瘋狂的增加特性,我用了四五年我自己都不敢說自己會玩C++,能用其他語言就優先考慮其他的,把C++作為最後的選項,不建議新手學,除非你的目標領域必須使用。
Rust
Rust是為了解決C和C++的各種問題而出現的語言,性能接近C++,通過所有許可權,不用垃圾回收就解決了生命周期管理。有包括管理,又有極其嚴格的編譯器檢查,能編譯通過的代碼就不會有大問題,編譯器直接把水平不夠的新手擋在了門外,通過解決出問題的人是方式,從根本上解決了C++的問題。
我第一次用rust寫個小程序就跟編譯器較了一天的勁。它的缺點就是學習難度太大,語言太小眾,庫太少,很多輪子都要自己造。但是隨著微軟之類的大廠使用,相信之後發展會比較好,新項目如果需要C或者C++可以優先考慮rust。
Java
我現在主要也是一個Java程序員,對於Java這個語言我並沒有什麼很特別的感覺,配套設施完善,什麼都能幹,體驗非常贊,就是內存佔用有點難看。想搞安卓考法的必修,阿里有大量的伺服器項目使用Java。
唯一想吐槽的是gradle這個構建系統,版本問題搞得很頭疼。
JavaScript
js是前端的必修課,沒得選,然而node讓js也萬能了。用node做過後端項目後,感覺動態類型語言還是不太適合,由此帶來的低級錯誤很多,雖然可以用typescript解決,但是最終還要編譯成js,無法直接調試。由於沒有原生的多線程支持,利用cpu也只能通過開多個進程的方式。小項目的後端做著玩還可以,大點的還是考慮Java或者是go吧。
Lua
Lua是極其輕量的語言,語言特性接近js,runtime非常小。作為一個腳本語言,性能出色,內存佔用低,很適合各種嵌入式設備或者插件系統。
Go
這玩意兒一定是谷歌為了解決自己後端項目中遇到的問題而開發的語言,各種特性直戳痛處。語法簡單,規范嚴格,這就讓不管什麼水平的開發寫出來的代碼差距都不會太大。
靜態類型,沒有默認參數,沒有異常處理,可以降低犯低級錯誤的概率。編譯成原生代碼,可內嵌C代碼,原生支持協程和多線程,可以保證性能,支持跨平台編譯,輸出單文件方便部署,這些優點帶來的問題是Go的指向性太強,只適合做高並發api類的後端服務。
想用Go開發其他任何領域都會覺得特別別扭,類似C的語法過於簡單,又沒有泛型,導致很多功能都顯得很啰嗦。但由於Go解決了部署問題,跨平台問題,降低了研發人員的水平要求,降低了犯錯誤的概率。
關於這些語言的性能沒有絕對的排序,但根據我做項目帶團隊和面試的經驗,絕大多數的程序員的水平都還碰不到語言的性能瓶頸。一般來說對語言的理解以及多線程,演算法,網路,資料庫,緩存。硬體甚至業務的理解都比語言的性功能影響更大。
再次強調,語言只是工具,只有適不適合,沒有好與不好。基礎強大,用哪個都不怕,基礎太差,用什麼都尷尬。
只是會語法並不是掌握了這門語言,要知道程序背後發生了什麼。比如C++的對象模型,Java的虛擬機,垃圾回收,Go的協程,js的promise,rust怎麼編譯通過等等。
基礎是一門語言的核心,不管學習哪一門語言都要重點學好基礎。