大家好,我是程式設計師魚皮。在 2024 年 6 月 21 日的華為開發者大會上,華為不僅官宣了下一代鴻蒙作業系統 HarmonyOS NEXT,而且還正式推出了自研的程式語言
倉頡
,可謂是賺足了面子,遙遙領先!
值得一提的是,HarmonyOS NEXT 是華為從內到外 全棧自研 的純血鴻蒙。自研有什麽意義呢?大會上有很多高大上的互聯網黑話,什麽采用端雲垂直整合的系統架構、全場景、原生智慧、原生安全等等。對於普通使用者來說,咱不用理解這些,只需要關註這個作業系統可以使整機效能提升 30%、連線速度提升 3 倍、連線數量提升 4 倍、功耗降低 20% 就夠了,而且這是一個源自中國、自主可控的作業系統,會更安全。
華為推出倉頡程式語言
下面咱重點來聊聊華為自研的程式語言
倉頡
。官方的定義是:倉頡程式語言是一款面向全場景智慧的新一代程式語言,主打原生智慧化、天生全場景、高效能、強安全。融入鴻蒙生態,為開發者提供良好的編程體驗。
好吧,又是一大堆 「黑話」,咱也不用關註。但有一點很關鍵,這個語言 「融入了鴻蒙生態」,換句話說,它就是為了鴻蒙套用的開發而推出的。
有意思的是,其實華為 22 年的時候就已經推出過一門自研的鴻蒙套用開發語言 ArkTS,只不過該語言是在微軟開源的 TypeScript 的基礎上改進的。
而這次,倉頡程式語言沒有基於任何現有的程式語言演進,換句話說,是完全自研!
完全自研程式語言毫無疑問是一件成本非常大的事情,連語法都要自己定義。華為從 2019 年就啟動了倉頡計畫,經過了整整 5 年的研發和沈澱,才正式對外官宣。不得不稱贊一番華為的前瞻性和野心,從很早之前就已經布局了全鏈路的自研,誓要打造純血鴻蒙。
如今,HarmonyOS 開發者的數量已經達到了 254 萬!在這個時候推出完全自研的程式語言,也是恰到好處。不然連開發者都沒有,自研程式語言有什麽用?
下面我們一起來看看倉頡程式語言有哪些特別之處?好不好學?真的遙遙領先麽?
倉頡程式語言
進入倉頡的官網,我們就能了解到這門程式語言的特性、獲取文字教程和視訊教程。
倉頡程式語言的特性
首先是官網給出的幾個核心特性:
1)原生智慧化:我理解就是開發效率更高、更靈活
2)天生全場景:我理解程式執行時可以占用更小的空間,手表之類的小裝置也能輕松執行
3)高效能:
4)強安全:
從倉頡的白皮書中,還可以了解到其他特性,其中幾個比較吸引我的地方是:
多範式編程:同時支持函式式、命令式和物件導向等多範式編程,有點 Scala 和 Rust 的意思
型別和記憶體安全:倉頡是靜態強型別語言,透過編譯時型別檢查盡早辨識程式錯誤;而且支持執行時檢查,有點 Java 的樣子
高效並行:提供了使用者態輕量化執行緒(原生協程),有點 Go 語言的影子
相容語言生態:能和 C 等主流語言互操作,有點 Java / C++ 操作 C 的意思
助力 UI 開發:能夠搭建聲明式 UI 開發框架,讓我想到了 Kotlin。畢竟本來就是為了 APP 套用開發設計的語言。
倉頡程式語言入門教程
下面帶大家看看倉頡的語法,一起 「雲入門」 下這門語言。
1)識別元
2)程式結構
倉頡檔的副檔名為
.cj
,這些程式和檔也被稱為原始碼和原始檔,在程式開發的最後階段,這些原始碼將被編譯為特定格式的二進制檔。
在倉頡程式的頂層作用域中,可以定義一系列的變量、函式和自訂型別(如 struct、 class、enum 和 interface 等),其中的變量和函式分別被稱為
全域變量
和
全域函式
。如果要將倉頡程式編譯為可執行檔,您需要在頂層作用域中定義一個 main 函式作為
程式入口
,它可以有
Array<String>
陣列型別的參數,也可以沒有參數,它的返回值型別可以是整數型別或 Unit 型別(無型別)。
如下圖,就是一個簡單的倉頡程式碼檔:
確實足夠簡潔,但是我得緩緩,因為這個程式裏面的要素過多了。。。
let 是 JS、Rust 等語言定義變量的方式
func 是 Go、Swift 等語言定義函式的方式
struct 是 Go、C 語言定義結構體的方式
class 是 C++ 和 Java 定義類的方式
enum 是 Java 和 TS 定義列舉的方式
main 和 println 就不說了,大多數語言都是這麽聲明主函式和函式的
經典的 Hello World 程式,是這麽寫的:
// helloworld.cj
main() {
let text: String
text = "Hello World!"
println(text)
}
你覺得倉頡更像哪種程式語言呢?
3)運算式和流程控制
這裏沒啥好說的,跟大多數語言都差不多,支持 if ... else ...,支持 for 迴圈、while 迴圈、do-while 迴圈、for-in 迴圈等等,比較靈活。
4)函式
下面是倉頡的函式定義:
5)結構體
使用 struct 來定義結構體,學過物件導向語言的同學應該秒會:
6)列舉
列舉值支持攜帶參數(有參構造器),而且支持定義多個同名構造器(參數個數必須不同):
7)模式匹配
理解為 switch 語法,是一種簡化版的 if ... else ...:
但倉頡的模式匹配比 Java 高級很多,模式又可以分為 refutable 模式和 irrefutable 模式。在型別匹配的前提下,當一個模式有可能和待匹配值不匹配時,稱此模式為 refutable 模式;反之,當一個模式總是可以和待匹配值匹配時,稱此模式為 irrefutable 模式。
舉兩個例子:
上圖的第二個例子有點類似 Java 中的 default。
8)類和介面
跟大多數物件導向程式語言的語法一致,類中有內容、函式、建構函式,支持繼承等。比如定義一個類:
定義一個介面:
9)泛型
倉頡支持泛型,泛型指的是參數化型別,是一個在聲明時未知並且需要在使用時指定的型別。最為常見的例子就是
Array<T>
、
Set<T>
等容器型別。以陣列型別為例,當使用陣列型別 Array 時,會需要其中存放的是不同的型別,我們不可能定義所有型別的陣列,透過在型別聲明中聲明型別形參,在套用陣列時再指定其中的型別,這樣就可以減少在程式碼上的重復。
泛型範例如下,學 Java 的小夥伴肯定不陌生:
10)集合
倉頡內建了幾種基礎的集合(Collection)型別,包含 Array、ArrayList、HashSet、HashMap,跟 Java 很像。
11)例外處理
經典的 try ... catch ... finally,如下圖:
倉頡提供了 Option 型別(有點像 Java 8 的 Optional),可以表示有值(Some)和無值(None)兩種情況。通常無值在某些情況下也可以理解為一種錯誤,所以 Option 型別也可以用作錯誤處理。
如圖,我們可以自己封裝一個快速丟擲無值異常的函式:
12)並行編程
在倉頡中,實作並行編程非常簡單。只需使用 spawn 關鍵字建立一個倉頡執行緒即可。可以給 spawn 傳遞一個無形參的 lambda 運算式,該 lambda 運算式即為在新執行緒中執行的程式碼。
比如下面的範例程式碼中,主執行緒和新執行緒均會嘗試打印一些文本:
大概就分享到這裏,還有很多常用特性比如 I / O 操作、網路編程、宏等等,大家可以去倉頡的官網學習。
不得不說,倉頡真的好像 Swift、Go 語言和 TypeScript!學過這些語言的同學應該能很快上手倉頡。這也是合理的,畢竟學習一門全新程式語言的成本很高,倉頡的語法設計參考一些主流的語言,開發者才會更樂於接受吧。
最後
很多朋友也問我 「要不要入行鴻蒙?」 其實我很難給一個明確的答案,畢竟我也沒有充分的調研數據,也不敢隨意勸大家入行。「新」 意味著機遇,同樣也意味著風險。在你有條件承擔風險時,選擇擁抱 「新」 沒有任何問題,但在沒有風險承擔能力時,我的建議還是先學好一門主流的程式語言、開發框架、打好電腦基礎,然後你再去學新出的程式語言就非常容易了。
我還是很看好華為的,也期待國內的作業系統和電腦生態可以更強大(就是華為裝置的價格能再打下來點就好了,畢竟我一直用華為哈哈)。
👇🏻 點選下方閱讀原文,獲取魚皮往期編程幹貨。
往期推薦