我认为 Zig 非常难,但值得一试
作者 | Dave Gauer ? ? ?譯者 | 彎月
出品 | CSDN(ID:CSDNnews)
2016 年 Zig 編程語言發布的簡介中說,“我利用一個周末的時間,花費六個小時就學會了 Zig!”還說,“Zig 語言很容易上手,因為語法很簡單。”
很多人確實覺得 Zig 很容易學習。尤其是經驗豐富的 C 程序員,他們覺得學習 Zig 語言很自然,而且非常合乎邏輯。有人曾這樣描述 Zig:“就是C語言,只不過修復了一些問題。”
Zig 的語法相對較少確實是事實。對于某些人來說,只需要閱讀一頁文檔(ziglang.org)就能“學會”。(請注意,這一頁文檔打印出來大約是256頁。)
然而問題在于,語法的簡潔性與易學性之間并沒有直接的關聯。如果真的有的話,Lisp 的 S 表達式也非常簡單,只需一頓午餐的時間就能學會了。還有 Forth,也只不過是空格分隔的單詞而已,這都是你早就知道的知識了。Zig 是一種相對“小”且“簡單”的語言,這的確降低了學習難度。(相比之下,除了專家之外,沒有人能在一個下午學會 C++ 或 Rust,因為這些語言的學習內容太多了。)
但我想鄭重聲明,Zig 很難掌握,我相信很多人都有類似的感覺。如果你的編程背景和我一樣,那么肯定會覺得學習 Zig 具有挑戰性。
在此,我想闡述一下原因,以及這門語言的美妙之處和值得學習的原因。
Zig 是一門全新的語言
首先,你需要明白,書店里還沒有 Zig 的書籍出售。即使有,也會在一個月內過時。Zig 正在迅速變化。(我懷疑如果沒有他人的幫助,我能否靠自己的力量保持 Ziglings (https://github.com/ratfactor/ziglings)常新!)
重點在于,除了源代碼本身,標準庫基本上沒有任何文檔。(公平地說,有些部分的注釋很詳細,但大部分的可讀性還是一言難盡。)其他所有學習資料都散落在網上,你必須自己動手實踐,看看示例是否仍然可以編譯。
對于想要學習這門語言的人來說,這并不是什么好消息。
Zig 迫使你做出選擇
根據個人的背景不同,你可能會不習慣認真考慮程序中每個運行時值的準確數字類型(u8、i16、f64 等)。處理“字符串”意味著處理指針、標記終止符、數組和切片。如果你習慣于可為你處理這些細節的動態語言,那么使用 Zig 會降低你的速度。
如果你不熟悉手動內存管理,那么這個障礙需要你花費大量時間克服。
雖然無論是哪種語言,手動內存管理都不容易,但 Zig 拋出了一個(大多數?)開發人員都很少面臨的決策:選擇內存分配策略。如果你不做出決定,就無法很好地編寫程序。Zig 標準庫有很大一部分代碼需要你提供內存分配器。
這對初學者來說真是太難了!
這實際上是 Zig 最酷的設計之一。為了編寫高性能軟件,我們都應該學習如何獲取和使用內存。我們應該根據用程序選擇最好的類型和分配器。
Zig 很教條
Zig 前期的學習很難,但從長遠來看更容易學習,原因是 Zig 沒有未定義的行為。雖然 C 本身是一種很緊湊的語言,但需要花很多時間來掌握如何避免C語言中的未定義行為,因為C語言允許你做各種不正確的事情。但在 Zig 中,未定義的行為是一種錯誤。
我曾經是 Rust 菜鳥和 Zig 菜鳥。這兩種語言的共同點是和編譯器打架,因為我知道我想做什么,但不知道如何表達。
Zig 的類型系統非常合乎邏輯,但學習如何正確創建轉換類型仍然需要時間,因為基本構建塊可能出現的組合太多了:
變量(var)與常量(const);
?可選值(?);
?錯誤聯合(!)
?單項指針(*)與多項指針([*]);
?數組切片([] 和 [x..y]);
?哨兵(sentinel )終止([n:null])。
將各種類型組合到一起,最終你可以得到類似于 [*:null]const ?[*:0]const u8 的東西(這是我個人早期遇到的一個真實例子)。
有一些代碼用匯編語言編寫比使用 Zig 更快,因為我花了很長時間才弄清楚如何表達我的意圖。
C 和匯編程序不太關心我使用內存做什么,所以無論是何種類型,使用這兩種語言編寫執行動作的代碼更加容易。但是程序會出現段錯誤。使用 Zig 可以編寫正確的代碼,這是一件好事。雖然編寫代碼的速度更慢,而且更乏味,尤其是剛開始的時候,但這是一件好事。
Zig 的 comptime
很多語言都有元編程,但它們都不盡相同。你積累的 C 預處理器的知識無法幫你編寫 Zig 的編譯時代碼。宏的知識也用不上,各種動態語言的運行時自省更是毫無用武之地。
Zig 的 comptime與其他語言完全不同。你需要了解它,否則會在早期遇到錯誤,這些錯誤是無法避免的,遲早都會出現。
由于有一組特定的規則(包括使用關鍵字comptime),“常規”Zig 代碼將在編譯時運行,生成運行時可執行文件,包含預先計算的值、刪除不需要的代碼、“展開”循環以及生成內聯代碼以處理不同的數據類型。
關于 comptime 的好壞,只有時間才能證明。到目前為止,這似乎是一個非常可靠的概念。在編譯時執行部分程序,不僅可以解決大量棘手的語言問題,而且無需引入太多額外的概念。
究竟什么是“難”,什么是“容易”?
Zig 編程語言的主頁沒有提到“容易”一詞,但語言本身確實不難。
正如 Rich Hickey 所說,之所以看似容易是因為我們很熟悉。容易是主觀的。但簡單就是簡單,不會復雜,而且概念也很少。所以說,簡單是客觀的。
可能對某些人來說,Zig 很容易,但對于有些人(比如我)來說卻不是這樣,但這門語言本身力求簡單、統一和正確。出于這個原因,我認為這門語言值得一試。
原文鏈接:http://ratfactor.com/zig/hard,未經允許,禁止轉載!
推薦閱讀:
?余承東回應高通對華為恢復 5G 芯片供應;ChatGPT 發布重要更新;微軟推出免費 AI 入門課|極客頭條
?Altman、Hinton 中國首秀:GPT 終將過時,AI 是當今世界最迫切的問題!
?再見,Ubuntu,你好,Manjaro
總結
以上是生活随笔為你收集整理的我认为 Zig 非常难,但值得一试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习使我快乐 第五天
- 下一篇: Neutron-常用配置-学习笔记