华为新发布的编程语言 “仓颉”和C/C++有什么区别?

关注+星标公众,不错过精彩内容

1609560b05f364edeeb7e6da250a2c1e.gif

转自 | 程序员鱼皮

在 2024 年 6 月 21 日的华为开发者大会上,华为不仅官宣了下一代鸿蒙操作系统 HarmonyOS NEXT,而且还正式推出了自研的编程语言 仓颉 ,可谓是赚足了面子,遥遥领先!

068feb9dd81db0e3f69865a805681515.png

值得一提的是,HarmonyOS NEXT 是华为从内到外 全栈自研 的纯血鸿蒙。自研有什么意义呢?大会上有很多高大上的互联网黑话,什么采用端云垂直整合的系统架构、全场景、原生智能、原生安全等等。对于普通用户来说,咱不用理解这些,只需要关注这个操作系统可以使整机性能提升 30%、连接速度提升 3 倍、连接数量提升 4 倍、功耗降低 20% 就够了,而且这是一个源自中国、自主可控的操作系统,会更安全。

华为推出仓颉编程语言

下面咱重点来聊聊华为自研的编程语言 仓颉 。官方的定义是:仓颉编程语言是一款面向全场景智能的新一代编程语言,主打原生智能化、天生全场景、高性能、强安全。融入鸿蒙生态,为开发者提供良好的编程体验。

5b7cd4cb2c1d147edc42bddc20f7d40e.png

好吧,又是一大堆 “黑话”,咱也不用关注。但有一点很关键,这个语言 “融入了鸿蒙生态”,换句话说,它就是为了鸿蒙应用的开发而推出的。

有意思的是,其实华为 22 年的时候就已经推出过一门自研的鸿蒙应用开发语言 ArkTS,只不过该语言是在微软开源的 TypeScript 的基础上改进的。

563d791c9d671476f50b8b028ed694d6.png

而这次,仓颉编程语言没有基于任何现有的编程语言演进,换句话说,是完全自研!

完全自研编程语言毫无疑问是一件成本非常大的事情,连语法都要自己定义。华为从 2019 年就启动了仓颉项目,经过了整整 5 年的研发和沉淀,才正式对外官宣。不得不称赞一番华为的前瞻性和野心,从很早之前就已经布局了全链路的自研,誓要打造纯血鸿蒙。

如今,HarmonyOS 开发者的数量已经达到了 254 万!在这个时候推出完全自研的编程语言,也是恰到好处。不然连开发者都没有,自研编程语言有什么用?

dcfe050d7f05c7158ca70a5b6f77b18f.png

下面我们一起来看看仓颉编程语言有哪些特别之处?好不好学?真的遥遥领先么?

仓颉编程语言

进入仓颉的官网,我们就能了解到这门编程语言的特性、获取文字教程和视频教程。

b9390fd037120ca73fcade16edf50fb3.png

仓颉编程语言的特性

首先是官网给出的几个核心特性:

1)原生智能化:我理解就是开发效率更高、更灵活

6c39bbb1a807dc6ca448dfef930163df.png

2)天生全场景:我理解程序运行时可以占用更小的空间,手表之类的小设备也能轻松运行

0b72bb86a25f1e55cd068484891986d9.png

3)高性能:

2f117c08e7c6c41b764a629ff3922a97.png

4)强安全:

e87983d1bd558334fb4bdf7a696dae41.png

从仓颉的白皮书中,还可以了解到其他特性,其中几个比较吸引我的地方是:

  1. 多范式编程:同时支持函数式、命令式和面向对象等多范式编程,有点 Scala 和 Rust 的意思

  2. 类型和内存安全:仓颉是静态强类型语言,通过编译时类型检查尽早识别程序错误;而且支持运行时检查,有点 Java 的样子

  3. 高效并发:提供了用户态轻量化线程(原生协程),有点 Go 语言的影子

  4. 兼容语言生态:能和 C 等主流语言互操作,有点 Java / C++ 操作 C 的意思

  5. 助力 UI 开发:能够搭建声明式 UI 开发框架,让我想到了 Kotlin。毕竟本来就是为了 APP 应用开发设计的语言。

fc17075714441e58802fca1715e51bb8.png

仓颉编程语言入门教程

下面带大家看看仓颉的语法,一起 “云入门” 下这门语言。

1)标识符

58fcfe4f3687f141a6a1798b82ee20da.png

2)程序结构

仓颉文件的扩展名为 .cj ,这些程序和文件也被称为源代码和源文件,在程序开发的最后阶段,这些源代码将被编译为特定格式的二进制文件。

在仓颉程序的顶层作用域中,可以定义一系列的变量、函数和自定义类型(如 struct、class、enum 和 interface 等),其中的变量和函数分别被称为 全局变量全局函数 。如果要将仓颉程序编译为可执行文件,您需要在顶层作用域中定义一个 main 函数作为 程序入口 ,它可以有 Array<String> 数组类型的参数,也可以没有参数,它的返回值类型可以是整数类型或 Unit 类型(无类型)。

如下图,就是一个简单的仓颉代码文件:

9956e76a96b8620a75b2b0a4b128e96c.png

确实足够简洁,但是我得缓缓,因为这个程序里面的要素过多了。。。

  • 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 循环等等,比较灵活。

c67d7bf85ac9388f6917f1a1d2d009cd.png

4)函数

下面是仓颉的函数定义:

f022e702f415cddb5a09904acf985b99.png

5)结构体

使用 struct 来定义结构体,学过面向对象语言的同学应该秒会:

d8af6998b514ea0a42972f14883d0a9a.png

6)枚举

枚举值支持携带参数(有参构造器),而且支持定义多个同名构造器(参数个数必须不同):

98d1f2af44647790c39e0dbf52a324c3.png

7)模式匹配

理解为 switch 语法,是一种简化版的 if ... else ...:

04969f18746ce27490ab198739772de1.png

但仓颉的模式匹配比 Java 高级很多,模式又可以分为 refutable 模式和 irrefutable 模式。在类型匹配的前提下,当一个模式有可能和待匹配值不匹配时,称此模式为 refutable 模式;反之,当一个模式总是可以和待匹配值匹配时,称此模式为 irrefutable 模式。

举两个例子:

1d8ee3c975728453a22977b35c3a9969.png

上图的第二个例子有点类似 Java 中的 default。

8)类和接口

跟大多数面向对象编程语言的语法一致,类中有属性、函数、构造函数,支持继承等。比如定义一个类:

5a091eff89004fdab1d7b65055400510.png

定义一个接口:

8627ef6fa8af0c9ad3ac6e49b9e5900e.png

9)泛型

仓颉支持泛型,泛型指的是参数化类型,是一个在声明时未知并且需要在使用时指定的类型。最为常见的例子就是 Array<T>Set<T>  等容器类型。以数组类型为例,当使用数组类型 Array 时,会需要其中存放的是不同的类型,我们不可能定义所有类型的数组,通过在类型声明中声明类型形参,在应用数组时再指定其中的类型,这样就可以减少在代码上的重复。

泛型示例如下,学 Java 的小伙伴肯定不陌生:

a9ef25bfe7db9efecc86cd2bc21935c1.png

10)集合

仓颉内置了几种基础的集合(Collection)类型,包含 Array、ArrayList、HashSet、HashMap,跟 Java 很像。

a94a708d40b9d5b31563b12cb6b56418.png

11)异常处理

经典的 try ... catch ... finally,如下图:

f3f1ad494ae6e5a4942ba4c1cc5c7b12.png

仓颉提供了 Option 类型(有点像 Java 8 的 Optional),可以表示有值(Some)和无值(None)两种情况。通常无值在某些情况下也可以理解为一种错误,所以 Option 类型也可以用作错误处理。

如图,我们可以自己封装一个快速抛出无值异常的函数:

49ecaa236c2df179ce817db3ac570f4b.png

12)并发编程

在仓颉中,实现并发编程非常简单。只需使用 spawn 关键字创建一个仓颉线程即可。可以给 spawn 传递一个无形参的 lambda 表达式,该 lambda 表达式即为在新线程中执行的代码。

比如下面的示例代码中,主线程和新线程均会尝试打印一些文本:

2fc6b9b8d9fe1b08914510f5901c3b7d.png

大概就分享到这里,还有很多常用特性比如 I / O 操作、网络编程、宏等等,大家可以去仓颉的官网学习。

不得不说,仓颉真的好像 Swift、Go 语言和 TypeScript!学过这些语言的同学应该能很快上手仓颉。这也是合理的,毕竟学习一门全新编程语言的成本很高,仓颉的语法设计参考一些主流的语言,开发者才会更乐于接受吧。

最后

很多朋友也问我 “要不要入行鸿蒙?” 其实我很难给一个明确的答案,毕竟我也没有充分的调研数据,也不敢随意劝大家入行。“新” 意味着机遇,同样也意味着风险。在你有条件承担风险时,选择拥抱 “新” 没有任何问题,但在没有风险承担能力时,我的建议还是先学好一门主流的编程语言、开发框架、打好计算机基础,然后你再去学新出的编程语言就非常容易了。

我还是很看好华为的,也期待国内的操作系统和计算机生态可以更强大。

------------ END ------------

b9ae355e1a312a5acecba68aa254caa7.gif

●专栏《嵌入式工具

●专栏《嵌入式开发》

●专栏《Keil教程》

●嵌入式专栏精选教程

关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。

8d3f60b742579eee083b8240f556d7d8.png

点击“阅读原文”查看更多分享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CJK仓颉输入法数据库是指为仓颉输入法提供收录和管理汉字字符及其相应输入码的数据库。仓颉输入法是一种用于输入中文字符的输入法,它采用了古代汉字字形和笔画的组合规则来生成每个汉字的输入码。输入码是指在键盘上输入的一组字符以唤出对应的汉字。 CJK是指"Chinese, Japanese, Korean" 的缩写,表示支持中日韩三国语言的输入法系统。因为中文输入码的设计能够应用于这三个语言,所以CJK仓颉输入法数据库也用于日语和韩语的输入。 仓颉输入法数据库包含了大量的汉字和其对应的输入码数据。这些数据可以根据仓颉输入法的规则和要求进行生成和维护。数据库中的每个汉字都对应一个输入码,通过输入码的组合方式可以准确地输入出所需的汉字。数据库的管理者会不断收录和更汉字及其输入码,确保数据库的完整性和实用性。 仓颉输入法数据库的作用非常重要。它是仓颉输入法正常运作的基础,决定了仓颉输入法用户能够输入哪些汉字。数据库中的数据还会随着时间的推移不断增加和完善,以适应的汉字的加入和使用需求的变化。 总之,CJK仓颉输入法数据库是一个为仓颉输入法提供汉字和输入码数据的数据库,对于保证仓颉输入法的准确性和实用性起到了重要作用。通过合理的管理和维护,该数据库能够为用户提供全面且准确的中文输入服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值