倉頡開發(fā)入門體驗
前言
在剛剛召開的華為開發(fā)者大會(HDC 2024)上,華為內(nèi)部研發(fā)已久的國產(chǎn)自主編程語言倉頡終于正式對外官宣!
當前在鴻蒙原生應(yīng)用的開發(fā)中,支持聲明式 UI 和一次開發(fā)、多端部署的 ArkTS 語言已經(jīng)被廣泛使用。倉頡語言作為面向未來的下一代編程語言,當前已經(jīng)完成設(shè)計與實現(xiàn)并啟動了開發(fā)者預(yù)覽,未來將與 ArkTS 共同發(fā)展,為鴻蒙原生應(yīng)用開發(fā)者提供極致高效的開發(fā)體驗。
倉頡的優(yōu)勢
倉頡的定位同樣如此,據(jù)官方介紹,它是一款面向“全場景”智能的新一代編程語言,主打原生智能化、天生全場景、高性能、強安全。
- 原生智能化:倉頡編程語言內(nèi)嵌了 AgentDSL 的編程框架,實現(xiàn)了自然語言與編程語言有機融合。多 Agent 協(xié)同,簡化符號表達,模式可以自由組合,支持各類智能應(yīng)用開發(fā)。
- 天生全場景:倉頡編程語言采用輕量化可縮放運行時和模塊化分層設(shè)計,即使在資源受限的設(shè)備上也能流暢運行。同時,它支持全場景領(lǐng)域擴展,元編程和 eDSL 技術(shù),可助力面向領(lǐng)域聲明式開發(fā)。
- 高性能:倉頡編程語言采用全并發(fā) GC,應(yīng)用線程運行更加流暢,響應(yīng)速度更快。輕量化線程設(shè)計進一步提升了并發(fā)性能,降低了開發(fā)成本。
- 強安全:倉頡編程語言將安全理念融入語言設(shè)計,幫助開發(fā)者專注于業(yè)務(wù)邏輯,減少安全漏洞的產(chǎn)生,實現(xiàn)“編碼即安全”的愿景。
當然好像每個新的語言都會這么說,而對于觀望的開發(fā)者來說,我們首先還是需要來了解一下倉頡的語法。
環(huán)境配置
可以直接使用HarmonyOS DevEco Studio或者VsCode進行開發(fā),但需要安裝倉頡插件,目前來看,需要報名倉頡語言開發(fā)者預(yù)覽版Beta招募,才能獲得對應(yīng)的Studio版本。在獲得對應(yīng)的Studio版本后,就可以體驗倉頡的語法特性了。
HelloWorld
和所有語言一樣,我們先來實現(xiàn)倉頡的HelloWorld程序。
新建腳本文件Hello,后綴名是.cj沒錯就是倉頡的中文??
main() {
println("你好,倉頡")
}
> cjc hello.cj -o hello
> ./hello你好,倉頡
通過cjc命令運行,打印輸出“你好,倉頡”。emm... 只看main這個方法誰也不知道這是kotlin還是啥。
變量聲明
變量定義的具體形式為:
修飾符 變量名: 變量類型 = 初始值
其中修飾符用于設(shè)置變量的各類屬性,可以有一個或多個,常用的修飾符包括:
- 可變性修飾符:let 與 var,分別對應(yīng)不可變和可變屬性,可變性決定了變量被初始化后其值還能否改變,倉頡變量也由此分為不可變變量和可變變量兩類。
- 可見性修飾符:private 與 public 等,影響全局變量和成員變量的可引用范圍,詳見后續(xù)章節(jié)的相關(guān)介紹。
- 靜態(tài)性修飾符:static,影響成員變量的存儲和引用方式,詳見后續(xù)章節(jié)的相關(guān)介紹。
如下程序所示,定義了兩個 Int64 類型的不可變變量 a 和可變變量 b,隨后修改了變量 b 的值。
main() {
let a: Int64 = 20
var b: Int64 = 12
b = 23
println("${a}$")
}
從這里來看,相當于把Kotlin中的“val”替換成了“l(fā)et”。接著我們來看它的struct 類型。
Struct類型
基礎(chǔ)結(jié)構(gòu)
struct Rectangle {
let width: Int64
let height: Int64
public init(width: Int64, height: Int64) {
this.width = width
this.height = height
}
public func area() {
width * height
}
}
如上述代碼所示,通過struct關(guān)鍵字定義了一個Rectangle結(jié)構(gòu),聲明了變量width、height并提供了init、area兩個方法。我們完全把它當成一個class 即可,通過下列方法我們可以創(chuàng)建struct的實例并調(diào)用相關(guān)方法。
let r = Rectangle(10, 20)
let width = r.width
let height = r.height
let a = r.area()
let r = Rectangle(10, 20)
let width = r.width
let height = r.height
let a = r.area()
但是倉頡也是有自己的class的,主要區(qū)別在于:class 是引用類型,struct 是值類型,class 之間可以繼承,但 struct 之間不能繼承。
struct Test {
var i = 0
public func add() {
i += 1
}
}
我們是無法在add函數(shù)中修改成員變量i的值的,如果想要修改我們就需要借助mute函數(shù)。
mute函數(shù)
修改代碼如下所示:
struct Test {
var i = 0
public mute func add() {
i += 1
}
}
在add函數(shù)前新增一個mute關(guān)鍵字,就可以在函數(shù)內(nèi)修改i的值了。需要注意的是mute關(guān)鍵字不能修改靜態(tài)函數(shù),如下列代碼無法正常編譯:
public mut static func g(): Unit {}
public mut static func g(): Unit {}
其他的語法如模式匹配、網(wǎng)絡(luò)編程等幾乎與Kotlin無異,我們可以在手機操作過程中了解。
跨語言操作
和大多數(shù)語言一樣,倉頡是支持跨語言調(diào)用的,當前支持倉頡-C語言與倉頡-Artks語言的互操作。這里我們以倉頡調(diào)用C語言為例。
在倉頡中要調(diào)用 C 的函數(shù),需要在倉頡語言中用 @C 和 foreign 關(guān)鍵字聲明這個函數(shù),但 @C 在修飾 foreign 聲明的時候,可以省略。舉個例子,假設(shè)我們要調(diào)用 C 的 rand 和 printf 函數(shù),它的函數(shù)簽名是這樣的:
// stdlib.h
int rand();
// stdio.h
int printf (const char *fmt, ...);
那么在倉頡中調(diào)用這兩個函數(shù)的方式如下:
foreign func rand(): Int32
foreign func printf(fmt: CString, ...): Int32
main() {
let r = unsafe { rand() }
println("random number ${r}")
unsafe {
var fmt = LibC.mallocCString("Hello, No.%d\n")
printf(fmt, 1)
LibC.free(fmt)
}
}
foreign func rand(): Int32
foreign func printf(fmt: CString, ...): Int32
main() {
let r = unsafe { rand() }
println("random number ${r}")
unsafe {
var fmt = LibC.mallocCString("Hello, No.%d\n")
printf(fmt, 1)
LibC.free(fmt)
}
}
在引入與 C 語言的互操作過程中,同時也引入了 C 的許多不安全因素,因此在倉頡中使用 unsafe 關(guān)鍵字,用于對跨 C 調(diào)用的不安全行為進行標識。
最后
同時,倉頡當前在嘗試支持AI Native原生智能應(yīng)用開發(fā)、DSL KIT、Actor和分布式編程等。不過,就目前來看感覺倉頡是一個所有語言的組合,不管你之前使用的是什么語言可能都會感覺得到很熟悉。但我覺得,開發(fā)者的腦子馬上就不夠用了。
現(xiàn)在又多了一個選擇,你會學(xué)嗎?
相關(guān)推薦:如何獲取倉頡編程語言通用版本SDK?一篇文章讓帶您了解清楚