自 2023 年重新開發語言到現在,已經有三年了。
目前項目還在開發中,離發佈還有一段時間。不過好的一點是,很多問題已經想明白了,對這個項目的未來也愈來愈清晰了。
為什麼要開發新語言
不同的人對編程這件事的態度不一樣。
對多數人來説,編程只是一份工作。代碼嘛,怎麼寫都行,能跑就好。
但我不這麼認為,我覺得,優秀的產品背後應該有一份優雅的代碼,是一種藝術作品,具有美感。
能夠穩定地、高效地、優雅地完成業務項目,是我一直追求的目標。
如果代碼不能按直覺預期正確地執行,我認為是不穩定的。
如果常見的需求,也需要寫很多代碼、花大量時間來實現,我認為是低效的。
如果本來一行代碼就能搞定的功能,卻需要寫十多行,我認為是不優雅的。
現有的編程語言總有一些地方讓我覺得很不滿。
這種不滿不是因為個人習慣或喜好問題,而是它真正影響了項目開發效率。
為了我追求的目標,我決定打造自己的“幹活工具”——剛好我還有這個精力。
我為什麼不喜歡 Java
Java 總是給人一種“把簡單問題複雜化”的感覺。
同樣的需求,用 Java 需要的工作量總是比其他語言要多地多。
以讀取文件為例,在多數語言的系統庫都提供了現成的函數可以直接讀取。
但在 Java 裏,你需要先學習“Stream”的概念,然後需要學習“StreamReader”的概念,然後再學習“BufferedReader”,最後,你才可以實現真正的文件讀取的功能。
雖然很多 Javaer 美其名曰“高性能文件讀取就是這樣的”,但業務中真的需要這麼時刻在乎性能嗎?而且用 Java 寫的程序,好像總體性能都不如用 Go 寫的程序吧?
Java 最新版似乎有點改進了,Files.readString(Path.of("test.txt")) 一行也能搞定。但 Path.of 又是什麼鬼?總之吧,不逼你先學習下“Path”這個概念,就不是 Java 了。
對我來説,用 Java 開發就像開拖拉機一樣慢(當然,也不是不能開)。
我為什麼不喜歡 Kotlin
Kotlin 比 Java 確實好太多了,但同樣熱衷於發明新概念。
我認為這些新概念僅僅是簡化了 Java 的語法,但沒有本質區別——相當於大家不用學“拖拉機”了,但還是需要學“手動擋”——概念的複雜度並沒有降低。
而且 Kotlin 離不開 Java 生態,一個沒學過 Java 的人,我覺得他也很難用 Kotlin 幹活。
比如 companion object,本質就是靜態方法、靜態類、命名空間的另一種寫法而已。
其他語言不需要類似概念,因為他們要不選擇直接使用靜態方法,要不選擇徹底刪除靜態方法。
我為什麼不喜歡 Rust
Rust 號稱很先進。
但我不喜歡需要手動管理內存,因為這會增加工作量。
雖然手動管理的性能更好,但實際業務中,我也不需要為了追求極致性能而犧牲開發效率。
我為什麼不喜歡 Go
相比其他語言,Go 的簡單和性能,使它成為我目前開發後端的首選語言。
但 Go 的語法實在是太簡陋,彷彿回到了 C 時代。
特別是業務中常用的 a ? b : c 和 a?.fn(),使得實際代碼量增加不少。
我為什麼不喜歡 C#
在 Go 之前,我傾向於用 C# 開發後端。
但相比 Go,C# 就顯得過於複雜了。
C# 的約束太多,一股“大公司味”:如果我的項目有上百人一起開發,C# 的合規性約束確實是有意義的。
但我的項目沒有這麼多人一起開發,很多時候,我不想為了所謂的“合規”而犧牲工作效率。
比如 C# 的規範要求所有參數都作 null 校驗,否則報 ArgumentNullException,而不是更普遍的 NullReferenceException。如果自己的項目不校驗,顯得代碼不正規。如果校驗了,又增加了工作量。
我為什麼不喜歡 JavaScript/TypeScript
從語法上,我認為 TypeScript 是所有語言中最優秀的。
既符合傳統 C 語言的美感,又為業務開發提供了需多語法糖。
但核心的缺點是“慢”。
慢到無法寫實際業務的後端,畢竟它是單線程的。
雖然有很多人反對説,很多公司也用 Nodejs 寫後端的。
但用 Nodejs 寫的後端一定不能處理複雜業務的高併發,或者 Nodejs 只是個代理,真正的業務由其他語言開發完成。
我為什麼不喜歡 Python
將空格作為語法的一部分,在代碼複製時特別麻煩。
特別是業務項目裏,複製代碼是很常見的。
我需要的是什麼
目前,我的首選語言只有 TypeScript 和 Go,分別寫前後端。
相比其他語言,它們是最好的選擇。
但我希望為自己打造一門更好的語言,它是 TypeScript 和 Go 的結合體:
擁有和 TypeScript 一樣強大的類型系統,一樣便利的語法糖,同時又具有 Go 的高性能、編譯能力。
它既可以用來寫前端,也可以用來寫後端。
對語言設計的思考
雖然每個語言都有不同的語法、特性,但多數語法本質是相通的,純粹是寫法的區別。
每個語言作者都有自己的偏執和抉擇,並試圖讓他人接受和自己相同的選擇。
我非常反感有些語言設計者把多數人都熟知的概念換成一個新概念,但這種新概念又沒有引入什麼優勢,純粹是習慣上的區別而已。
比如 PHP 裏面,用 “.” 作字符串連接符,導致對象調用必須用 “->”,在所有語言裏獨樹一幟,就是不好的設計。
新設計語言時,應該儘量追求和主流語言類似,因為主流的背後代表有很多已經習慣他的用户。
如果沒有功能性上的改進,儘量不要發明新語法。