當前位置: 妍妍網 > 碼農

剛剛,華為竟然釋出了自己的程式語言 「倉頡」,遙遙領先?!

2024-06-22碼農

大家好,我是程式設計師魚皮。在 2024 年 6 月 21 日的華為開發者大會上,華為不僅官宣了下一代鴻蒙作業系統 HarmonyOS NEXT,而且還正式推出了自研的程式語言 倉頡 ,可謂是賺足了面子,遙遙領先!

值得一提的是,HarmonyOS NEXT 是華為從內到外 全棧自研 的純血鴻蒙。自研有什麽意義呢?大會上有很多高大上的互聯網黑話,什麽采用端雲垂直整合的系統架構、全場景、原生智慧、原生安全等等。對於普通使用者來說,咱不用理解這些,只需要關註這個作業系統可以使整機效能提升 30%、連線速度提升 3 倍、連線數量提升 4 倍、功耗降低 20% 就夠了,而且這是一個源自中國、自主可控的作業系統,會更安全。

華為推出倉頡程式語言

下面咱重點來聊聊華為自研的程式語言 倉頡 。官方的定義是:倉頡程式語言是一款面向全場景智慧的新一代程式語言,主打原生智慧化、天生全場景、高效能、強安全。融入鴻蒙生態,為開發者提供良好的編程體驗。

好吧,又是一大堆 「黑話」,咱也不用關註。但有一點很關鍵,這個語言 「融入了鴻蒙生態」,換句話說,它就是為了鴻蒙套用的開發而推出的。

有意思的是,其實華為 22 年的時候就已經推出過一門自研的鴻蒙套用開發語言 ArkTS,只不過該語言是在微軟開源的 TypeScript 的基礎上改進的。

而這次,倉頡程式語言沒有基於任何現有的程式語言演進,換句話說,是完全自研!

完全自研程式語言毫無疑問是一件成本非常大的事情,連語法都要自己定義。華為從 2019 年就啟動了倉頡計畫,經過了整整 5 年的研發和沈澱,才正式對外官宣。不得不稱贊一番華為的前瞻性和野心,從很早之前就已經布局了全鏈路的自研,誓要打造純血鴻蒙。

如今,HarmonyOS 開發者的數量已經達到了 254 萬!在這個時候推出完全自研的程式語言,也是恰到好處。不然連開發者都沒有,自研程式語言有什麽用?

下面我們一起來看看倉頡程式語言有哪些特別之處?好不好學?真的遙遙領先麽?

倉頡程式語言

進入倉頡的官網,我們就能了解到這門程式語言的特性、獲取文字教程和視訊教程。

倉頡程式語言的特性

首先是官網給出的幾個核心特性:

1)原生智慧化:我理解就是開發效率更高、更靈活

2)天生全場景:我理解程式執行時可以占用更小的空間,手表之類的小裝置也能輕松執行

3)高效能:

4)強安全:

從倉頡的白皮書中,還可以了解到其他特性,其中幾個比較吸引我的地方是:

  1. 多範式編程:同時支持函式式、命令式和物件導向等多範式編程,有點 Scala 和 Rust 的意思

  2. 型別和記憶體安全:倉頡是靜態強型別語言,透過編譯時型別檢查盡早辨識程式錯誤;而且支持執行時檢查,有點 Java 的樣子

  3. 高效並行:提供了使用者態輕量化執行緒(原生協程),有點 Go 語言的影子

  4. 相容語言生態:能和 C 等主流語言互操作,有點 Java / C++ 操作 C 的意思

  5. 助力 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!學過這些語言的同學應該能很快上手倉頡。這也是合理的,畢竟學習一門全新程式語言的成本很高,倉頡的語法設計參考一些主流的語言,開發者才會更樂於接受吧。

    最後

    很多朋友也問我 「要不要入行鴻蒙?」 其實我很難給一個明確的答案,畢竟我也沒有充分的調研數據,也不敢隨意勸大家入行。「新」 意味著機遇,同樣也意味著風險。在你有條件承擔風險時,選擇擁抱 「新」 沒有任何問題,但在沒有風險承擔能力時,我的建議還是先學好一門主流的程式語言、開發框架、打好電腦基礎,然後你再去學新出的程式語言就非常容易了。

    我還是很看好華為的,也期待國內的作業系統和電腦生態可以更強大(就是華為裝置的價格能再打下來點就好了,畢竟我一直用華為哈哈)。
    👇🏻 點選下方閱讀原文,獲取魚皮往期編程幹貨。

    往期推薦